CrossRoad

Unity、VR、MR、ARを中心とした技術ブログ

【2017/3/1更新】UnityでBing Speech to Text API(Android用)を使う方法(Unity側の構築手順)

前回の続きです。

【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/

に入れます。

Android Studio側のプロジェクトに配置されているwavとxmlファイルの配置場所

2.4 ビルドしたjarファイルを追加

最後に、Android Studioでビルドしたjarファイル(初期ファイル名はclasses.jar)を追加します。名称は何でもよいです。特に意味はありませんが、他のアセットを調べた時、plugins.jarとなっていたので、この名前に変更してから入れました。入れる場所は、Plugins/Androidの中です。

3. スクリプトを作成する

3.1 Manifestファイル

Manifestファイルの、<permission>と<service>にいくつか追加します。<permission>は、元のサンプルの記述をそのまま使っています。<service>は、今回向けに追加したものです。

このようになります。


giste78a421f6137a9aa4552ff4a8319bf04

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#のメソッドを呼ぶように設定します。

UnityプロジェクトでuGUIのボタンを設置し、Bing Speech to TextのAPIを呼ぶようにした画面

ここで、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ボタンの順に押してから「これで動きました」と話しかけてみました。

Bing Speech to Text APIをUnityで動作させ、「これで動きました」と発声した結果

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

Bing Speech to Text APIをUnityで動作させ、「マイクロソフトコグニティブサービス」と発声した結果

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に入れるだけです。

GitHub - flushpot1125/CognitiveSpeech-STT-Android_Unity: You can use the following URL sample with Unity if you use the repository! (https://github.com/Microsoft/Cognitive-Speech-STT-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メソッド
===