【実機なしでも出来る】HoloLens 2 チュートリアル の Azure Cloud Services やってみた

はじめに

HoloLens2のAzureCloudServecesチュートリアルをやりました。
ただし、実機がない状態で行ったのでAzure Spatial Anchorsはできていません。

開発環境

  • Windows 10 Enterprise
  • Unity 2019.4.1f1
  • MRTK 2.5.3

1章 HoloLens 2 用の Azure Cloud Services

Unity プロジェクトの作成と準備

チュートリアル通りに行いました。

組み込みの Unity パッケージのインストール

今回 Azure Spatial Anchors は使用しないのでここは飛ばしました。

チュートリアルのアセットのインポート

AzurespatialAnchors SDK のImportは行わず

  • AzureStorageForUnity.unitypackage
  • MRTK.Tutorials.AzureCloudServices.unitypackage

上記二つのImportだけ行いました。
ただ、このままだとエラーが出て先に進めないので以下の作業が必要です。

  1. Project>Assets>MRTK.Tutorials.AzureCloudServices>Scripts>Managers>AnchorManager.cs の削除
  2. Project>Assets>MRTK.Tutorials.AzureCloudServices>Scripts>UX>AnchorCreationController.cs の削除
  3. Project>Assets>MRTK.Tutorials.AzureCloudServices>Scripts>Managers>SceneController.cs 21、28、29行目 のコメントアウト
  4. Project>Assets>MRTK.Tutorials.AzureCloudServices>Scripts>Controller>ObjectEditController.cs 171、172、201行目 のコメントアウト
  5. Project>Assets>MRTK.Tutorials.AzureCloudServices>Scripts>Controller>ObjectCardViewController.cs 115行目、95~109行目(StartFindLocation関数の中身)のコメントアウト

シーンの作成と準備 & シーンの構成

チュートリアル通りに行いました。

プロジェクト ビルド パイプラインを準備する

実機がないので設定だけ行い、ビルドはしていません。

2章 Azure Storage の統合

ここでは1章で作ったシーンの動作確認を行いました。

Azure Storage との通信は DataManager が担ってるようです。
DataManager.cs の理解には下記のドキュメントが役立ちました。
クイックスタート: .NET 用 Azure Blob Storage クライアント ライブラリ v12

3章 Azure Custom Vision の統合

保留

4章 Azure Spatial Anchors の統合

保留

5章 Azure Bot Service の統合

保留


【実機なしでも出来る】HoloLens 2 のチュートリアル 初級レベルの MRTK チュートリアル やってみました

はじめに

MRTKチュートリアルを行ったので情報をまとめました。

間違っている部分があればご指摘いただければ幸いです。

開発環境

  • Windows 10 Enterprise
  • Unity 2019.4.1f1
  • MRTK 2.5.3

1~2章 はじめに&プロジェクトの初期化と最初のアプリケーションの配置

この章ではプロジェクトを始めるための準備+プロジェクト作成を行います。
チュートリアル通りに進めていれば特に引っかかる部分はありませんでした。

3章 プロジェクトの初期化と最初のアプリケーションの配置

プロファイルの設定を行います。
プロファイルは入れ子ツリーで構成要素を保持しており、defaultプロファイルは編集することができません。
なので設定を変えたい場合は一番上の階層のプロファイルから順番に新しいプロファイルを作成しなければいけません。

例: 3-5 空間認識メッシュの可視性を変更する

[crayon-6179082980f7e473127934/]
[crayon-6179082980f87444907651/]
[crayon-6179082980f8a489953470/]
[crayon-6179082980f8c683810022/]

詳細 Mixed Reality Toolkit プロファイル設定ガイド

4章 シーンへのオブジェクトの配置

オブジェクトの配置、整列を行います。
整列にはGridObjectCollectionを使用します。

GridObjectCollection

子オブジェクトを3D空間に整列する機能を持っています。
MR用アプリではUIを3D空間に配置する必要があるため、このコンポーネントがよく使用されます。
詳細 Object Collection (オブジェクト コレクション)

5章 ソルバーを使用した動的なコンテンツの作成

ソルバーを使用して視点誘導、オブジェクトの操作を実装します。
視点誘導にはDirectionalIndicator、オブジェクトの操作にはTapToPlaceを使用します。

詳細 Solver

DirectionalIndicator

追跡対象に設定したオブジェクトの方向を向くようにGameObjectの回転と位置を自動で調整してくれます。
ViewOffsetプロパティで追跡対象オブジェクトと視点がどれくらい離れたら誘導を表示するのかを設定することができます。
詳細 DirectionalIndicator

TapToPlace

オブジェクトを3D空間にそって操作できるようになります。
On Placing Started() はオブジェクトが選択されたときに登録された関数を呼び出します。
SurfaceNormalOffsetプロパティはオブジェクトを3D空間上に配置する場合の、地表とオブジェクトの距離を設定することができます。
詳細 Tap To Place

6章 ユーザー インターフェイスの作成

3D空間上で固定されたボタン、ユーザーに追従するメニュー、ヒントを作成します。

ボタンにはGridObjectCollectionとInteractableを使用します。

Interactable

オブジェクトに対する様々な入力に対してイベントを設定できます。
OnClick() はポインターでクリックされたときに登録している関数を実行します。
詳細 Interactable

追従するメニューの作成にはRadialViewを使用します

RadialView

追跡対象に設定したオブジェクトに追従します。
詳細 Solver

ヒントにはToolTipSpawnerとTooltipPrefabを使用します。

ToolTipSpawner

タップまたはフォーカスで設定したPrefabを作成します。
詳細 ToolTip ToolTipSpawner

7章 3D オブジェクトの操作

3Dオブジェクトの操作、3D領域の操作を行います。
3Dオブジェクトの操作にはNearInteractionGrabbable、Object Manipulatorを使用します。

NearInteractionGrabbable

コンポーネントしたオブジェクトを掴めるようにします。
詳細 NearInteractionGrabbable

Object Manipulator

片手または両手を使ったオブジェクトの移動、スケール変更、回転を可能にします。
Two Handed Manipulation Typeプロパティで両手操作の移動、スケール、回転の有効・無効を切り替えることができます。
多関節ハンド入力に反応するようにするにはNearInteractionGrabbableが必要になります。
詳細 Object Manipulator

3D領域の操作にはBoundsControl、NearInteractionGrabbable、Object Manipulatorを使用します。

BoundsControl

対象オブジェクトをボックスで操作できるようにします。
詳細BoundsControl

8章 視線追跡の使用

ラベルに視線が向いている間。フォントサイズを大きくする機能を実装します。
EyeTrackingTargetを使用します。

EyeTrackingTarget

オブジェクトに視線が向いた時のイベントを設定できます。
On Look At Start () は視線が向いたときに登録している関数を呼び出します。
On Look Away () は視線が外れたときに登録している関数を呼び出します。
詳細 EyeTrackingTarget

9章 音声コマンドの使用

音声入力でメニューが使用できるようにします。
MixedRealityToolkitを使用して音声コマンドを作成し、SpeechInputHandlerでイベントを設定します。
詳細 Speech

まとめ

初級チュートリアルを行うことでMRTKの基本的な操作を学ぶことができました。
これから他のチュートリアルも進めていき、知識をより深めていきます。

参考

MRTK チュートリアルの概要 - Mixed Reality

What is the Mixed Reality Toolkit | Mixed Reality Toolkit Documentatio...

https://hololabinc.github.io


【Azure Cognitive Searchで始めるTwitter分析】Part3. Power BI レポートの作成

はじめに

この記事はPart1. 検索インデックスの作成Part2. デモアプリの作成 の続きです。
まだ見ていない方は、遡って見ていただければと思います。

↓ 今回は下図のようなPower BI レポートの作成手順についてまとめていきます。
image.png
image.png

手順

「スキルセット」を開きます。
image.png

「ナレッジストア」タブを開きます。
「Power BIテンプレートを取得する」からテンプレートをダウンロードすることができます。
「Power BIパラメーターのコピー」の情報は、後ほどテンプレートに接続する際に使用します。

image.png

Power BI Desktopを開きます。
「ファイル」→「インポート」→「Power BI テンプレート」をクリックし、ダウンロードしたテンプレートを選択し開きます。

image.png

先程ポータル上で確認した「Power BIパラメーターのコピー」の情報を入力後、「作成」を押します。
image.png

アクセスキーを要求された場合は以下の手順でキーを取得し、入力します。
ストレージアカウントを開き、使っているストレージアカウントに移動→「アクセスキー」→「キーの表示」で表示されたkey1を入力します。
image.png

しばらく待つとレポートが表示されます!

image.png
image.png
image.png

おわりに

今回はPower BIテンプレートをナレッジストアに接続し、ツイートの分析結果を可視化しました。
Part1. 検索インデックスの作成 で分析した結果が、多種多様なビジュアルで見られて面白かったです。
これを Part2. デモアプリの作成 で作成したアプリと組み合わせるなどすると、より高度な検索アプリが出来そうです。

参考リンク

https://docs.microsoft.com/ja-jp/azure/search/knowledge-store-connect-power-bi


【Azure Cognitive Searchで始めるTwitter分析】Part2. デモアプリの作成

はじめに

この記事はPart1. 検索インデックスの作成 の続きです。

今回は下図のようなデモアプリの作成手順についてまとめていきます。
image.png

手順

Azure Portalにログインし Search Service を開いたら、「インデックス」に移動します。

image.png

「デモアプリの作成」を押します。

image.png

「CORSを有効にする」にチェックを入れ、「デモアプリの作成」を押します。

image.png

検索結果の表示をカスタマイズします。

「縮小版」:サムネイル画像を選択します。今回は画像データを使用していないため無視します。
「タイトル」:タイトルを選択します。今回はユーザーネームを使用します。
「説明」:タイトルの下に表示するものを選択します。今回はツイート本文を使用します。

image.png

インデックス作成時、「フィルター可能」「ファセット可能」の両方にチェックを入れた項目がデフォルトでサイドバーに構成されます。
「デモアプリの作成」をクリックすると、HTMLファイルが生成されます。

image.png

HTMLファイルを開くとデモアプリの初期画面が表示されます。
上部の検索ボタンをクリックするとサイドバーと一覧が表示されます。

サイドバーで絞り込み検索ができます。
image.png

次に、「緊急事態宣言」で検索してみます。
検索するキーワードを上部の検索ボックスに入力し、検索ボタンをクリックします。
下図のように、表示される結果が変わります。
512ツイート中18個に「緊急事態宣言」というキーワードが含まれていることが分かります。

image.png

おわりに

今回はAzure Cognitive Search を使用して、デモアプリを作ってみました。
次回はPower BI テンプレートを使用し、ナレッジストアを接続して感情分析・キーフレーズ抽出などの分析結果を可視化していきます。
数ステップでとてもグラフィカルなレポートが作成できますので、宜しければそちらも併せてご覧ください。

次回:Part3. Power BI レポートの作成

参考リンク

https://docs.microsoft.com/ja-jp/azure/search/search-create-app-portal


【Azure Cognitive Searchで始めるTwitter分析】Part1. 検索インデックスの作成

構成

全部で3部構成にする予定です。

Part.1
検索インデックスの作成 (今回)

Port.2
デモアプリの作成(次回)

Port.3
Power BI 1 レポートの作成(次々回)

はじめに

News ZERO さんがTwitterで新型コロナ「陽性」の経験談を募集されており、使われたハッシュタグはトレンド入りしました。

そこで今回は、「#感染したから伝えたい」を含むツイートを約500件取得し、Azure Cognitive Search で人物・感情・キーフレーズなどを抽出 → デモアプリを作成→Power BI テンプレートでワードクラウドの表示をさせてみました。

↓ こんな感じのワードクラウドが簡単に得られます。
image.png
image.png

Azure Cognitive Search とは

Azure Cognitive Search (旧称 Azure Search)は、Web、モバイル、エンタープライズの各アプリケーション内のプライベートな異種コンテンツに対する豊富な検索機能を提供する、クラウド検索サービスです。
公式ドキュメント:https://docs.microsoft.com/ja-jp/azure/search/search-what-is-azure-search

今回はテキストデータのみ使いますが、Cognitive Searchでは画像、映像、音声などの非構造化データも検索可能です。
また、Cognitive ServicesやPower BIとの連携も容易です。

手順

ざっくりと以下の5つの手順でやっていきます。

  1. Twitter API を使用してデータを用意する
  2. BLOB ストレージにツイートデータアップロード
  3. Cognitive Search で検索インデックスの作成
  4. デモアプリの作成(Part2. デモアプリの作成 で説明します。)
  5. Power BI テンプレートでワードクラウド表示(Part3. Power BI レポートの作成 で説明します。)

1. Twitter API を使用してデータを用意する

1-1. Twitter APIの利用申請→APIトークン取得

Developerサイトにて英語で申請→うまくいけば1日で使えるようになります。
申請内容が不十分だと、メールが来て改めてAPIの使用用途を聞かれます。

APIの申請方法、APIキーの取得方法については、以下リンクが参考になるかと思います。

参考リンク:https://www.itti.jp/web-direction/how-to-apply-for-twitter-api/

1-2. Pythonで 「#感染したから伝えたい」 を含むツイートを収集

以下の記事を参考にし、1月13日~1月21日までの 「#感染したから伝えたい」 のハッシュタグを含むツイートを約500件集め、CSVファイルに出力しました。

参考リンク:https://qiita.com/nomotom/items/de1bc00ef350edc21624

2. BLOB ストレージにCSVファイルをアップロード

Azure Blob Storageでストレージアカウントを作成→コンテナー作成→CSVファイルのアップロードをします。

まずストレージアカウントを作成します。

image.png
image.png

次にコンテナーを作成します。

image.png
image.png

最後に先程用意したCSVファイルをコンテナーにアップロードします。

image.png
image.png
image.png

これでデータの準備ができました。

3. Cognitive Search で検索インデックスの作成

3-1. Cognitive Search リソースの作成

Azure Portalにログインし、Search Serviceを開きます。
「Search サービスの作成」をクリックします。
スクリーンショット 2021-01-26 14.45.31.png

サブスクリプション~価格レベルまでを設定し、「確認および作成」でリソースを作成します。

価格レベルについての詳細:https://azure.microsoft.com/ja-jp/pricing/details/search/

これらを設定後、「確認および作成」で作成。
スクリーンショット 2021-01-26 14.46.15.png

3-2. インデックス作成

作成したリソースに移動し、「データのインポート」をクリックします。
image.png

3-2-1. データに接続

image.png

データソース:Azure BLOBストレージ
データソース名:任意
抽出されるデータ:コンテンツとメタデータ
解析モード:区切りテキスト
最初の行にヘッダーが含まれています:チェックを入れます。
区切り記号文字:,
接続文字列:「既存の接続を選択します」をクリック→データをアップロードしたコンテナーを選択します。

「次:コグニティブスキルを追加します」で次に進みます。

image.png

3-2-2. スキルの追加

3つの項目「Cognitive Servicesをアタッチする」、「エンリッチメントの追加」、「ナレッジストアへのエンリッチメントの保存」を設定していきます。
それぞれクリックで設定項目が開かれます。

スクリーンショット 2021-01-27 11.52.13.png

「Cognitive Servicesをアタッチする」

「無料」を選択すると、スキル適用できるドキュメント数が20個に限定されます。
スクリーンショット 2021-01-27 11.52.16.png

※Cognitive Servicesリソースを新規で作成する場合
価格レベルはS0を使うことができます。
スクリーンショット 2021-01-27 11.37.20.png
スクリーンショット 2021-01-27 11.37.27.png
数秒待ちます。
スクリーンショット 2021-01-27 11.37.37.png

「エンリッチメントの追加」

スキルセット名:任意
ソースデータフィールド:text(感情分析などのスキルを適応させる列を指定します。今回はツイート本文の列である"text"を指定しています。)
エンリッチメントの粒度レベル:ページ(5000文字チャンク)

必要なスキルにチェックを入れます。
image.png

「ナレッジストアへのエンリッチメントの保存」を開きます。

これを設定することにより Power BI との連携が可能になります。
ストレージアカウント接続文字列:「規定の接続を選択します」をクリックします。
image.png

ナレッジストア用のコンテナーを選択します。
コンテナーを用意していない場合は、「+コンテナー」を押して作成します。
image.png

設定ができたら「次:対象インデックスをカスタマイズします」で次に進みます。

3-2-3. インデックスをカスタマイズ

インデックス名:任意
キー:AzureSearch_DocumentKey

フィールドには、データ型と属性があります。 上部に並んだチェック ボックスは、フィールドがどのように使用されるかを制御する "インデックスの属性" です。

引用元:https://docs.microsoft.com/ja-jp/azure/search/search-get-started-portal

取得可能:検索結果で取得したい項目かどうか
フィルター可能、ソート可能、ファセット可能:フィルタリング、並べ替え、ファセットのナビゲーション構造にフィールドを使用するかどうか
検索可能:フルテキスト検索の対象かどうか

アナライザー:

デモアプリのサイドバーに表示させたい項目には、「フィルター可能」「ファセット可能」いずれもチェックを入れます。

「」で次に進みます。

image.png
image.png

3-2-4. インデクサーの作成

インデクサー名:任意
スケジュール:一度

これらを設定し、「送信」でインデクサーが実行されます。

image.png

3-3. 言語設定

このままだと言語設定が英語のままスキルが実行されてしまうため、一旦実行中のインデクサーを止め、言語を設定してからインデクサーを再度実行する必要があります。

「インデクサー」を開きます。
image.png

インデクサーをリセットします。
image.png

「スキルセット」を開きます。
image.png

言語を英語→日本語に変更します。
"@odata.type": "#Microsoft.Skills.Text.SplitSkill" 以外の defaultLanguageを、enからjaに書き替え、「保存」で変更を保存できます。
image.png
image.png
image.png

再度「インデクサー」を開きます。
image.png

インデクサーを再度実行します。
image.png

インデックスが作られました。
512個のツイートで1分少し要しました。

image.png

3-4. 検索エクスプローラーでクエリを実行

インデックスを開きます。
image.png

「検索」をクリックすると、下に検索結果の一覧が表示されます。

image.png

次は簡単な検索クエリを書いて結果をみてみます。
$search=コロナ&$select=created_at,text,sentiment,keyphrases,locations,people
これで”コロナ”を含むツイートを検索し、日時・本文・感情・キーフレーズ・場所・人物 の項目のみ結果に表示させることができます。
image.png

クエリパラメーターの詳細については、以下公式ドキュメントにてご確認いただけます。
https://docs.microsoft.com/ja-jp/azure/search/search-explorer
https://docs.microsoft.com/ja-jp/azure/search/search-query-overview

おわりに

本記事では、データの準備~検索インデックスの作成 までの手順をまとめました。
次回、Part2. デモアプリの作成 で検索アプリを作成し、
Part3. Power BI レポートの作成 で最初に示したワードクラウドなどを表示させていきます。
簡単なステップで試せるものですので、ぜひご覧ください。

次回:Part2. デモアプリの作成

参考リンク

https://docs.microsoft.com/ja-jp/azure/search/search-create-service-portal
https://docs.microsoft.com/ja-jp/azure/search/search-get-started-portal
https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-quickstart-blob
https://docs.microsoft.com/ja-jp/azure/search/knowledge-store-create-portal
https://docs.microsoft.com/ja-jp/azure/search/search-explorer


HoloLens2 × Azure Cognitive Services まとめ

はじめに

HoloLensアドベントカレンダーの25日目の記事です。
今年の僕のHoloLensアドベントカレンダーは、スタートアップ夢の扉の「ヌンギル」が作りたくなって始めました。全7記事、Azure Cognitive Servicesが学べる感じになっております。冬休みに試してみてください。これでUnity/C#/MRTKでAPIを叩けるね!

Vision Speech Language Decision
Computer Vision
Analyze Image
Read
Speech-to-Text Language Understanding Anomaly Detector
Face Text-to-Speech Text Analytics Personalizer
Custom Vision Speech Translation QnA Maker Content Moderator
Form Recognizer Speaker Recognition Translator Metrics Advisor
Video Indexer Immersive Reader

※Search(Bing Web Search API)は除いています。

Face API

画像をキャプチャして、顔検出を行います。

Analyze Image API

画像をキャプチャして、説明文を生成します。

Text-to-Speech API

説明文を読み上げます。

Translator API

英語の説明文を日本語に翻訳し、読み上げます。

Speech-to-Text API

音声認識し、アクションします。

Read API

画像をキャプチャし、テキストを抽出し、読み上げます。

Custom Vision API

物体検出し、読み上げます。

さいごに

皆さん、2020年お疲れ様でした!よいお年を!


HoloLens2 × Azure Cognitive Services(CustomVisionで物体検出)

はじめに

HoloLensアドベントカレンダー2020の19日目の記事です。
前回は「文字を読んで」と言うと、画像からテキスト抽出し読み上げました。今回は、Custom Visionを用いて小銭を検出し、いくらか答えてくれるようにしました。「ヨンシル、これいくら?」

開発環境

  • Azure
    • Custom Vision
    • Speech SDK 1.14.0
  • Unity 2019.4.1f1
  • MRTK 2.5.1
  • Windows 10 PC
  • HoloLens2

導入

1.前回の記事まで終わらせてください。

2.まずは、Custom Visionで小銭を学習します。手元にあった1円、10円、100円のみを学習します。

3.Azureポータルから「Custom Vision」を作成。キーをメモっておきます。

image.png image.png

4.Custom Visionにサインインし、新しくプロジェクトを作成します。プロジェクトタイプはObject Detection、学習したモデルをエクスポートしてエッジ推論もできるようにGeneral(compact)、Export CapabilitiesをBasic platformsに設定します。

image.png image.png

5.小銭を撮影し、学習データをアップロード、タグを付けます。

image.png image.png

6.Advanced Trainingで1時間学習させました。

image.png

7.学習した結果がこちらです。作ったモデルはPublishし、画像ファイルから推論するエンドポイントをメモっておきます。

image.png image.png

8.Unityのプロジェクトはこんな感じ。前回のMySpeechRecognizerのActionワードに「いくら」を追加します。新しく「TapToCaptureObjectDetection.cs」をAdd Componentし、「いくら」を音声認識すると、画像をキャプチャし、物体検出、読み上げという流れになります。
image.png

9.MySpeechRecognizer.csのUpdate関数を次のように編集し、「いくら」を音声認識するとTapToCaptureObjectDetection.csのAirTap関数を実行します。
[crayon-6179082981abd820105928/]
 

10.「TapToCaptureObjectDetection.cs」スクリプトはこちらになります。
[crayon-6179082981ac4071489402/]
11.エンドポイントとキーをメモっておいたものを貼りつけます。MRTKのRestライブラリを用いて、キャプチャした画像をPOSTします。

12.レスポンスは次のような形で返ってくるので、CustomVisionResultクラス、Predictionsクラス、BoundingBoxクラスを作成しました。

[crayon-6179082981acc671495157/]

13.検出できたら、Probabilityが0.8以上のものを選びます。複数検出されている場合はIoUを計算し、BoundingBoxがだいぶ重なっているもの&Probabilityの低い方は削除します。

14.検出結果からいくらか計算して読み上げます。

実行

動画のように、小銭を数えられるようになりました!結構間違えるので、学習データを増やす必要があります。

お疲れ様でした。

参考


HoloLens2 × Azure Cognitive Services(Read APIで文字認識し読み上げ)

はじめに

HoloLensアドベントカレンダー2020の13日目の記事です。
前回は「何が見える?」と質問したら、画像をキャプチャして説明文を生成し、読み上げを行いました。今回は、「文字を読んで」と言うと、画像からテキストを抽出し、読み上げてみます。「ヨンシル、文字を読んで」

開発環境

  • Azure
    • Computer Vision API (Read API)
    • Speech SDK 1.14.0
  • Unity 2019.4.1f1
  • MRTK 2.5.1
  • Windows 10 PC
  • HoloLens2

導入

1.前回の記事まで終わらせてください。

2.Unityプロジェクトはこんな感じ。前回のMySpeechRecognizerのActionワードをリストにして、「文字を読んで」を追加します。新しく「TapToCaptureReadAPI.cs」スクリプトをAdd Componentし、「文字を読んで」と言うと画像キャプチャし、テキスト抽出、読み上げという流れになります。

image.png

3.前回の記事のMySpeechRecognizer.csは、Actionワードが一つしか認識できませんでしたが、リストにして複数のActionワードを認識できるようにします。あとはUpdate関数を下記のように編集して、Actionワードが「文字を読んで」のときにTapToCaptureReadAPI.csのAirTap関数を実行します。
[crayon-6179082982581302611126/]
 

4.「TapToCaptureReadAPI.cs」スクリプトは以下のようになります。
[crayon-6179082982587586013952/]
5.Computer Vision API (Read API) のエンドポイントとキーは、画像説明文生成のときと同じものを用います。

6.TapToCaptureReadAPI.csのAirTap関数で画像をキャプチャしたあと、Read APIに画像をPOSTします。すると、ResponseのHeadersに{"Operation-Location":URL}が返ってくるので、そのURLに対してGETする必要があります。しかし、MRTKのRest.csはResponseHeadersを返してくれないので、ProcessRequestAsync関数の275行目からを次のように編集します。
[crayon-6179082982590560076247/]
7.これでResponseBodyにResponseHeadersのURLが返ってくるので、そのURLに対してGETします。

8.テキスト抽出が実行中の場合は下記のようなjsonが返ってくるので、"status"が"succeeded"になるまで、1秒おきにGETします。

[crayon-6179082982593900525888/]

9."status"が"succeeded"になったら、テキスト抽出結果が次のようなjsonで返っくるので、仕様に合わせてReadクラス、AnalyzeResultクラス、ReadResultsクラス、Linesクラスを作成しました。

[crayon-6179082982595504709342/]

image.png

10.テキスト抽出結果を音声合成に投げて読み上げます。

実行

実行動画を見てください。こんな感じで文字を読めるようになりました!割と小さい文字もいけます。名刺とかも読めるし、便利かもしれないです。日本語対応はまだなので待つしかないですね。(現在の対応言語:Dutch, English, French, German, Italian, Portuguese and Spanish)

ちなみにWakeワードの「ヨンシル」は「4種類」や「キャンセル」などに誤認しやすいので、変えた方がいいです。「ガチモト」は「が地元」や「合致もっと」になるので、「藤本」がいいです。。

参考


HoloLens2 × Azure Cognitive Services(Speech SDKで音声認識)

はじめに

HoloLensアドベントカレンダー2020の10日目の記事です。
前回の続きで、エアタップして目の前の画像をキャプチャし、説明文を生成、日本語で読み上げているのですが、音声認識によってこれを動作させたいと思います。「ヨンシル、文字を読んで」「ヨンシル、何が見える?」

開発環境

  • Azure
    • Computer Vision API (画像分析 API)
    • Translator API
    • Speech SDK 1.14.0
  • Unity 2019.4.1f1
  • MRTK 2.5.1
  • Windows 10 PC
  • HoloLens2

導入

1.前回の記事まで終わらせてください。

2.Unityプロジェクトはこんな感じ。エアタップはもう使わないので、前回の「TapToCaptureAnalyze」を非アクティブにしてください。代わりにMySpeechRecognizerを作成します。

image.png

3.MySpeechRecognizerにAudioSourceをAdd Componentします。

4.MySpeechRecognizerにTapToCaptureAnalyzeAPI.csをAdd Componentし、Audio SourceにMySpeechRecognizerをアタッチします。あと画像分析結果の画像となるQuadもアタッチしてください。

5.「MySpeechRecognizer.cs」スクリプトは、エアタップの代わりに音声認識してアクションするプログラムです。プログラムがスタートしたら音声認識を継続的に行います。まずWakeワードを認識し、「はい」と応答、その後Actionワードを認識するとTapToCaptureAnalyzeAPIのAirTap関数を実行します。
[crayon-6179082982f6b669587994/]
 

6."YourSubscriptionKey", "YourServiceRegion"にAzureの音声リソースからキーと場所(リージョン)をコピペしてください。

7.fromLanguageに"ja-JP"(日本語)を指定しています。

8.TapToCaptureAnalyzeAPI.csのasync Task SynthesizeAudioAsync(string text) 関数をpublicにします。MySpeechRecognizer.csからWakeワードを認識したら、「はい」と喋らせるためです。

9.Wakeワードに「ヨンシル」、Actionワードに「何が見える」を設定しました

実行

Edito上でも動くので実行してみてください。継続的に音声認識したテキストがコンソールに表示されます。
image.png

HoloLens2で実行した動画が以下になります。

お疲れ様でした。

参考

1.音声認識と文字起こしの統合と使用
2.音声認識を使用したコマンドの実行

  • MRTK.HoloLens2.Unity.Tutorials.Assets.GettingStarted.2.3.0.3.unitypackage
  • MRTK.HoloLens2.Unity.Tutorials.Assets.AzureSpeechServices.2.3.0.0.unitypackage

HoloLens2 × Azure Cognitive Services (Translator APIで英語から日本語に翻訳し音声合成)

はじめに

HoloLensアドベントカレンダー2020の8日目の記事です。
API叩くの慣れてきましたかー?前回の続きで、画像分析APIで画像説明文を生成しそれを読み上げてみましたが、説明文は英語のため、日本語に翻訳して音声合成してみましょう!

開発環境

  • Azure
    • Computer Vision API (画像分析 API)
    • Translator API
    • Speech SDK 1.14.0
  • Unity 2019.4.1f1
  • MRTK 2.5.1
  • Windows 10 PC
  • HoloLens2

導入

1.前回の記事まで終わらせてください。

2.Azureポータルを開き、Translatorを作成、エンドポイントとキー、場所(リージョン)をメモっておいてください。
image.png

image.png

3.Translatorのチュートリアル(C#PythonTranslate.py)を参考にTapToCaptureAnalyzeAPI.csを編集します。画像分析APIで得られた画像説明文(英語)をTranslator APIに投げ、翻訳した日本語のテキストをSSMLを用いて音声合成します。
[crayon-61790829838ac690054314/]
 

4.ソースコードの重要なところ説明していきますね。まずは、translator_subscription_keyにメモしたキーをコピぺしてください。エンドポイントはそのままでOKです。クエリパラメータにapi-version=3.0と日本語への翻訳(to=ja)を指定しています。

 

5.MRTKのRestを用いて、前回の画像説明文の生成結果がanalyze.description.captions[0].textに格納されているので、json形式にして、Translator APIにPOSTします。ヘッダーはOcp-Apim-Subscription-Keyにtranslator_subscription_key、Ocp-Apim-Subscription-Regionにメモした場所(japaneast)を入力します。

 

6.POSTが成功したら、次のようなレスポンスボディが返ってくるので、仕様に合わせてTranslatorクラス、DetectedLanguageクラス、Translationsクラスを作ります。

[crayon-61790829838b9374042000/]

 

7.今回は、リストのjsonになっているので、Face APIのときみたいに、JsonHelperを用いてパースします。

[crayon-61790829838be398961933/]

 

8.あとはtranslator[0].translations[0].textに日本語に翻訳されたテキストがあるので、SynthesizeAudioAsyncに投げます。ただし、前回のままだと「ArgumentException: Length of created clip must be larger than 0」エラーが発生し、言語が対応してないことがわかります。

[crayon-61790829838c0486717599/]

 

9.そこで、SSML を使用して音声の特徴をカスタマイズするを参考に日本語で音声合成します。SSMLを作成し、日本語、男性、標準音声のja-JP-Ichiroを指定します。サポートしている言語の一覧はこちらです。

[crayon-61790829838c2898594216/]

 

10.synthesizer.SpeakTextAsync(text)をsynthesizer.SpeakSsmlAsync(ssml)に変更することで、ssmlを読み込み、指定した音声で合成することができます。

 

11.今回、標準音声を用いていますが、ニューラル音声の方がより人間らしく合成できるみたいです。使用したい場合は、Azureの音声リソースの場所を"米国東部"、"東南アジア"、"西ヨーロッパ"のいずれかにしておく必要があるようです。

 

12.日本語の標準音声は、ja-JP-Ayumi(女性)、ja-JP-HarukaRUS(女性)、ja-JP-Ichiro(男性)、ニューラル音声は、ja-JP-NanamiNeural(女性)、ja-JP-KeitaNeural(男性)がありますので、変更してみてください。

実行

実行してみた結果がこちらの動画になります。

お疲れ様でした。