MRTKの音声認識を使用してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824949/a3136741-ad3b-9052-4b36-56dda089b649.png)
この記事は、MRTKで音声認識を行いたいが実装方法が分からない方やMRTKのDictationHandlerの使用方法が分からない方が対象になっています。  
使用方法を理解するために、簡易的にオブジェクトを配置し音声認識を行い、テキスト化するという流れで実装を行っていきたいと思います。  
  

## **実装環境**
Unityバージョン 2019.4.6f1
MRTK2.4.0
## **概要**  

音声認識を行う方法は複数あり、AzureSpeechServicesでの音声認識の方法も確立していたが、MRTKによって音声認識を行いたかった。
理由としてはAzureSpeechServicesによる音声認識も容易に行うことが出来るが、Azureへの登録が必要であり無料の期間も1か月しかないため。	
**MRTK（Mixed Reality Toolkit**) とは、Mixed Reality アプリケーション向けのオープンソースクロスプラットフォーム開発キット（SDK）です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824949/cb393abf-650f-0a40-cdbd-084f580b9bfe.png)
MRTKには、様々なHandlerが用意されていて、これを利用することによって簡単に入力イベントに対しての処理を行うことが可能になります。
今回はMRTKの**DictationHandler**を利用して、音声認識を行ったが、MRTKには様々なHandlerが用意されている。

Handlerの種類
Dictation Handler: 文字起こしの開始や終了，その結果を受け取る
Eye Tracking Target: 視線が合った時や離れた時のイベントを受け取る
Input Action Handler: 入力の開始と終了を受け取る
Manipulation Handler: オブジェクトをジェスチャーで移動したときのイベントを受け取ることができるだけでなく，オブジェクトを操作可能
Pointer Click Handler: ポインタでクリックしたときのイベントを受け取る
Speech Input Handler: 音声コマンドの認識結果を受け取る
Touch Handler: 手で触ったりしたときのイベントを受け取る
Handlerの説明についてはこちらの[技術記事](https://www.tattichan.work/entry/mrtkeventhandler)を参考にした 

## **実装手順**
		
最終的なイメージとしてはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824949/595d19bc-6c18-baa9-fab6-cf535981ddc3.png)
**1.　Unityのプロジェクトを作成し、MRTKをインポートする**
[Microsoft公式チュートリアル](https://docs.microsoft.com/ja-jp/windows/mixed-reality/develop/unity/tutorials/mr-learning-base-01)の2,3を参考にして、プロジェクトの設定を行う。
**2.必要なオブジェクト**
ボタンなど配置や配色を適当で決まりはないです。
・Dictation
　　　・空のGameObjectを作成しDictationに名前を変更→TextPlateの作成（cubeを変形させて適当なサイズにする）
　　　・TextPlateの中になんでも良いのでTextオブジェクトを追加
　　　　　　MRTKの既存のテキストを使用
・ボタン
　　　・今回は、MRTKの既存のボタンを使用した 
　　　　　　音声認識をスタートさせるボタン
　　　　　　音声認識をストップさせるボタン
　　　　　　それぞれを用意する
**3.DictationHandlerをオブジェクトにアタッチする**
アタッチしたら、出力させたいtextオブジェクトを付与する。
ディクテーションのサービスのセットアップをする
下図の一番下のWindowsDictationInputの中の設定を変える
![2020-10-27-16-37-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824949/ee777c86-b992-5a8c-3780-e4d2810ddeba.png)
設定後、DictationHandlerスクリプトを使って録音セッションの開始と停止や、UnityEventsを通じた文字起こし結果の取得が可能になる。
各機能の説明として[公式による説明](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/Input/Dictation.html)を引用  
Dictation Hypothesis：ユーザーが話すにつれて、これまでキャプチャされた音声の初期の粗いトランスクリプションとともに発生されます。
Dictation Result：各センテンスの終わり (すなわち、ユーザーが間を置いたとき) に、これまでキャプチャされた音声の最終トランスクリプションとともに発生されます。
Dictation Complete：録音セッションの最後に、音声のすべての最終トランスクリプションとともに発生されます。
Dictation Error：ディクテーション サービスでのエラーを通知するために発生されます。この場合のトランスクリプションには、エラーの説明が含まれています。
![2020-10-27-16-41-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824949/f54d47e1-2b0f-43a0-87e4-efa3336f70b3.png)
**4. ボタンの処理**
ボタンを追加し、押されたときにDictationHandlerの**StartRecordingメソッド**が実行されるように設定する。
同様にストップボタンが押されたときの設定に、**StopRecordingメソッド**が実行されるよう設定
![2020-10-27-16-43-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824949/d9eb70f9-02b4-5fcf-2f3b-8ead38f3e03f.png)
それでは実行してみよう！
![2020-10-27-16-44-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824949/8c294db9-53f2-0b51-9d70-c41328df7713.png)
## **感想**
音声認識の精度が良い、日常使用する言葉のレベルなら容易に漢字に変換することも可能であった。
そして、コーディングを行わなくても、音声認識が簡単に実装できるのが凄い所だと感じた。
課題としては、このテキストをどのように扱い利用していくかだと考える。
Hololensを使用した感触として、キーボード入力は向いていないと考えているため、
音声認識などの入力が重要となってくるのではないかと考える。
MRTKで可能な事を知っておくことによって、開発の工数が減らすことができるため機能を理解していることは重要だと思う。
そして、今回はUnityEditor上での使用だったのでHoloLensにビルドして動作するのかを確かめる必要がある。