(4-2) UnityでBing Speech to Text API(Android用)を使う方法

前回の続きです。

magicbullet.hatenablog.jp

前回はUnityでBing Speech to Text(Android用)を使う手順のうち、Android Studio側で準備する内容を解説しました。

今回はUnity側の手順を解説します。

==============================
目次

(1章は前回の記事を参照ください)

2. Unity側の手順

2-1. プロジェクト作成&フォルダ構成を変更

2-2. スクリプト作成

2-3. uGUIでボタン作成

2-4. ビルド

3. 動作確認

4. 終わりに

==============================

2. Unity側の手順

2-1. プロジェクト作成&フォルダ構成を変更

(1) 空のプロジェクトを作成

ここは説明不要ですね。

(2) Assets以下のフォルダ構成を変更

以下のようにします。スペルミスにご注意ください。

f:id:Takyu:20161108233910p:plain

(3) AndroidManifest.xmlとSpeechSDK.jarを追加

AndroidManifest.xmlは、Unity標準のものを使います。下記からドラッグ&ドロップします。

Macの場合
/アプリケーション/Unity/PlaybackEngine/AndroidPlayer/Apk/AndroidManifest.xml

Windowsの場合
C:\Program Files\Unity\Editor\Data/PlaybackEngines/AndroidPlayer/Apk/AndroidManifest.xml

配置後、下記のようにpermissionやserviceを追加します。


gist31362bb5b3588534bd643afd90c14404


SpeechSDK.jarは、Android Studio側のプロジェクトから取り出します。
Android Studio側でビルドすると、以下に生成されています。

samples/SpeechRecoExample/build/intermediates/exploded-aar/com.microsoft.projectoxford/speechrecognition/1.1.0/jars/libs/SpeechSDK.jar


これをPlugins/Android フォルダに入れます。

(4) libandroid_platform.soを追加

libandroid_platform.soは、Android Studio側のプロジェクトから取り出します。
これはビルドと関係なくプロジェクトに配置されていますが、下記の中にも入っています。

samples/SpeechRecoExample/build/intermediates/jniLibs/arm/release/armeabi/ libandroid_platform.so

これを、Plugins/Android/libs/armeabi-v7aフォルダの中に入れます。

(注)Unityは基本的にフォルダ構成を気にせず開発できますが、いくつかのフォルダ名は予約語扱いされており、その名前にしないと動きません。

今回のフォルダ名は予約語扱いされているので、この名前にしてください。


(5) assetフォルダとresフォルダにwavとxmlファイルを追加

下記のwavとxmlファイルを、

Plugins/Android/assets/

Plugins/Android/res/values/

に入れます。


f:id:Takyu:20161108090744p:plain


(6) ビルドしたjarファイルを追加

最後に、Android Studioでビルドしたjarファイル(初期ファイル名はclasses.jar)を追加します。

名称は何でもよいです。特に意味はありませんが、他のアセットを調べた時、plugins.jarとなっていたので、この名前に変更してから入れました。

入れる場所は、Plugins/Androidの中です。

2-2. スクリプト作成

(1) Manifestファイル

次に、2-1 (3)で入れたManifestファイルに追記します。

追記箇所は、<permission>と<service>です。

<permission>は、元のサンプルの記述をそのまま使っています。

<service>は、今回向けに追加したものです。

最終的にこのようになります。



giste78a421f6137a9aa4552ff4a8319bf04


(2) C#

このようなスクリプトを作ります。

今回、個々のpublicメソッドは、uGUIのボタンから呼ぶようにしてみました。


gistf29682214864ad95cff9172847fe4268

また、onCallbackResultメソッドは、Androidのjavaでこのように書くことで、java側から呼んでいます。

UnityPlayer.UnitySendMessage("TestObject","onCallBackShowResult",response.Results[i].DisplayText);

スクリプトTest1.csは、Empty Gameobjectを作り、そこにアタッチします。

2-3. uGUIでボタン作成

特に大したことはしていません。uGUIでボタンを作って、先ほど作ったC#のメソッドを呼ぶようにしただけです。

f:id:Takyu:20161108225742p:plain

ここで、Canvas以下の要素について説明します。

Text :音声認識結果を表示

StartBindServiceボタン:bindServiceを開始。Test1.csのbindService_Startメソッドを呼ぶ。

StopBindServiceボタン:bindServiceを停止。Test1.csのbindService_Stopメソッドを呼ぶ。

StartRecognitionボタン:音声認識を開始。Test1.csのstartRecognitionメソッドを呼ぶ。


ちなみに、今回の趣旨とはずれますが、skyboxの見た目を変えたいときは、下記の記事の「補足」を試してみてください。

Unityモデルの見た目を調整する方法をまとめました - Cross Road


2-4. ビルド

File -> Build Settingsで通常のAndroidアプリをビルドするときの手順と同じように進めます。
Build identifierは任意の名称で大丈夫です。Android Studioで作ったときのpackage名と合わせる必要はありません。

3. 動作確認

XperiaZ3(Android 5.0.1)にインストールし、BindServiceボタン、StartRecognitionボタンの順に押してから「これで動きました」と話しかけてみました。

f:id:Takyu:20161108231325p:plain

「マイクロソフトコグニティブサービス」と話しかけた結果です。

f:id:Takyu:20161108233740p:plain

4. 終わりに

今回使ったMicrosoftのBing Speech to Textは、以前書いたように、これまで試した音声認識エンジンの中で、認識精度と速度が最も速いです。なので、Unityで使えるようにすると、色々と応用範囲が広がると思います。

また、今回、あまり情報がないことで時間がかかった面もあるので、本記事を含む4種類の記事で実装方法やトラブル対応集を整理しました。

合わせてご参照いただければと思います。


www.crossroad-tech.com

www.crossroad-tech.com

www.crossroad-tech.com






===
2016/11/25 追記

今回のサンプルコードをGithubで公開しました。手順についてはブログの該当記事を参照してください。
ざっくり言うと、Cognitive ServiceのPrimary Key、LuisAppID、Subscription Keyを書き換えてAndroid Studioでビルドし、ビルドで生成されたclasses.jar(念のため名前をplugins.jarなどに変更した方が良いかもしれません)を、UnityのPlugins/Androidに入れるだけです。

github.com

2017/3/1 追記
GitHubに置いたサンプルコードで補足説明が必要な個所がありました。

・keyを入力する方法が書いていない
 ->AndroidStudio側のMainActivity.javaで、getPrimaryKey()、getLuisAppId()、getLuisSubscriptionID()メソッドの戻り値には、それぞれのkeyを直接入力してください。
 本来はstring.xmlから読み出すのですが、今回の実装ではstring.xmlからの呼び出しがうまくいっていないためです。

・uGUIのボタンに対応した関数が割り当たっていない
-> TestObjectを割り当て、Test.csの関数を割り当ててください

 BindServiceのテキストがあるボタンオブジェクトには、bindService_Startメソッド

 StartRecognitionのテキストがあるボタンオブジェクトには、startRecognitionメソッド

 StopSpeechRecognitionのテキストがあるボタンオブジェクトには、bindServiceDestroyメソッド


 


===