前回の続きです。
【2016/11/27 更新】UnityでBing Speech to Text API(Android用)を使う方法(Android Studio側の構築手順) - Cross Technology
前回はUnityでBing Speech to Text(Android用)を使う手順のうち、Android Studio側で準備する内容を解説しました。今回はUnity側の手順を解説します。
1. プロジェクト作成&フォルダ構成を変更する
まずはUnityで新規プロジェクトを作成します。続いて、Assets以下のフォルダ構成を以下のように変更します。特に、Pluginsフォルダ以下はスペルミスすると動かないので、ご注意ください。
Assets |-- Plugins |-- Android |-- libs |-- armeabi-v7a |-- x86
2. モジュールを追加する
2.1 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 フォルダに入れます。
2.2 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は基本的にフォルダ構成を気にせず開発できますが、いくつかのフォルダ名は予約語扱いされており、その名前にしないと動きません。
今回のフォルダ名は予約語扱いされているので、この名前にしてください。
2.3 assetフォルダとresフォルダにwavとxmlファイルを追加
下記のwavとxmlファイルを、
Plugins/Android/assets/
Plugins/Android/res/values/
に入れます。
2.4 ビルドしたjarファイルを追加
最後に、Android Studioでビルドしたjarファイル(初期ファイル名はclasses.jar)を追加します。名称は何でもよいです。特に意味はありませんが、他のアセットを調べた時、plugins.jarとなっていたので、この名前に変更してから入れました。入れる場所は、Plugins/Androidの中です。
3. スクリプトを作成する
3.1 Manifestファイル
Manifestファイルの、<permission>と<service>にいくつか追加します。<permission>は、元のサンプルの記述をそのまま使っています。<service>は、今回向けに追加したものです。
このようになります。
3.2 C#
このようなスクリプトを作ります。今回、個々のpublicメソッドは、uGUIのボタンから呼ぶようにしてみました。
gistf29682214864ad95cff9172847fe4268
また、onCallbackResultメソッドは、Androidのjavaでこのように書くことで、java側から呼んでいます。
UnityPlayer.UnitySendMessage("TestObject","onCallBackShowResult",response.Results[i].DisplayText);
スクリプトTest1.csは、Empty Gameobjectを作り、そこにアタッチします。
4. uGUIでボタンを作成する
作ったボタンで、C#のメソッドを呼ぶように設定します。
ここで、Canvas以下の要素について説明します。
Text :音声認識結果を表示
StartBindServiceボタン:bindServiceを開始。Test1.csのbindService_Startメソッドを呼ぶ。
StopBindServiceボタン:bindServiceを停止。Test1.csのbindService_Stopメソッドを呼ぶ。
StartRecognitionボタン:音声認識を開始。Test1.csのstartRecognitionメソッドを呼ぶ。
5. ビルドと動作確認
File -> Build Settingsで通常のAndroidアプリをビルドするときの手順と同じように進めます。Build identifierは任意の名称で大丈夫です。Android Studioで作ったときのpackage名と合わせる必要はありません。
今回は、XperiaZ3(Android 5.0.1)にインストールし、BindServiceボタン、StartRecognitionボタンの順に押してから「これで動きました」と話しかけてみました。
「マイクロソフトコグニティブサービス」と話しかけた結果です。
6. 終わりに
今回使ったMicrosoftのBing Speech to Textは、以前書いたように、これまで試した音声認識エンジンの中で、認識精度と速度が最も速いです。なので、Unityで使えるようにすると、色々と応用範囲が広がると思います。
また、今回、あまり情報がないことで時間がかかった面もあるので、本記事を含む4種類の記事で実装方法やトラブル対応集を整理しました。合わせてご参照いただければと思います。
Android StudioでUnity向けmoduleを作る方法 - Cross Technology
Android Studioで作ったmoduleをUnityから呼ぶ方法 - Cross Technology
【2017/7更新】Android StudioでUnity向けmodule開発時のTips - Cross Technology
===
2016/11/25 追記
今回のサンプルコードをGithubで公開しました。手順についてはブログの該当記事を参照してください。
ざっくり言うと、Cognitive ServiceのPrimary Key、LuisAppID、Subscription Keyを書き換えてAndroid Studioでビルドし、ビルドで生成されたclasses.jar(念のため名前をplugins.jarなどに変更した方が良いかもしれません)を、UnityのPlugins/Androidに入れるだけです。
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メソッド
===