こんにちは、KID.Aです。
今回もVoice Actionsの記事になります。
Android Mでは音声会話を構築するAPIが登場しており、音声操作で立ち上げたアプリを音声で操作できるようになっています。
・Voice Interaction APIのガイドは以下のURLに記載されています。
https://developers.google.com/voice-actions/interaction/voice-interactions
イメージがつきやすいようにまずは実行のイメージを載せます。
実行
以下はCameraで立ち上げた場合の音声会話の例になります。
Googleアプリの音声コマンドからCameraのアプリが立ち上がり、音声操作で写真を撮るアプリになります。
google I/O 2015のcodelabsのアプリを使用します。
下記のアプリをインストールします。
https://github.com/googlesamples/io2015-codelabs/tree/master/voice-interaction-api/voice-interaction-end
そうすると「Here it is」といわれ、写真が撮れます。
このようにアプリが立ち上がってから、画面下のダイアログプレートで音声会話ができアプリを操作することができます。
この音声会話を構築できるAPIがVoice Interactionになります。
イメージはわかっていただけたでしょうか。
実装のポイント
これから実装のポイントを記載します。
まずは、AndroidManifet.xmlにandroid.intent.category.VOICEのカテゴリーを追加します。
以下のようにintent-filterを作成します。
<intent-filter> <action android:name="android.media.action.STILL_IMAGE_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.VOICE" /> </intent-filter>
音声コマンドで立ち上がった場合はisVoiceInteraction()にtrueが返却されます。
以下のような実装で判定します。
@Override public void onResume() { super.onResume(); if (isVoiceInteraction()) { // 音声対話アクティビティの処理を行う } }
isVoiceInteractionRoot()というメソッドがありますが、こちらはGoogle検索アプリでユーザの声で直接起動した場合にtrueになります。isVoiceInteraction()は別のアプリから起動された場合でもtrueになります。
getVoiceInteraction().submitRequestで音声確認を要求します。
これが実際に音声会話を行う箇所になります。
submitRequestで送るPickOptionRequestはオプションリスト(PickupRequest.Option)でリストを作り、リストに含まれている文字が発呼されたらonPickOptionResultにコールバックされます。
Option option = new Option("cheese", 1); option.addSynonym("take it"); option.addSynonym("ok"); VoiceInteractor.Prompt prompt = new VoiceInteractor.Prompt("Say Cheese"); getActivity().getVoiceInteractor() .submitRequest(new PickOptionRequest(prompt, new Option[]{option}, null) { @Override public void onPickOptionResult(boolean finished, Option[] selections, Bundle result) { } }); }
音声を終わる場合はCompleteVoiceRequestを呼び出します。
完了まではダイアログプレートを表示させてユーザを混乱させないようにしてください。
もし音声操作を終了(ダイアログプレートを消したい場合)してアプリを維持したい場合は新しいアクティビティを立ち上げて音声対話アクティビティを終了させます。
Intent.FLAG_ACTIVITY_NEW_TASKフラグを使用して新たにアクティビティを立ち上げてください。
その後に音声対話アクティビティを終了すれば、音声対話は終了できます。
VoiceInteractor.Prompt prompt = new VoiceInteractor.Prompt("Here it is"); getVoiceInteractor().submitRequest( new VoiceInteractor.CompleteVoiceRequest(prompt, null) { @Override public void onCompleteResult(Bundle result) { // アプリを継続したい場合はここで新しいアクティビティを立ち上げる Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); } });
Voice Interactionを使用すれば音声会話でアプリを操作することができます。
手を使うのがめんどくさいシーン(料理中のレシピアプリ使用など)では有効だと思います。
※ただ、isVoiceInteraction()が有効になるパターンを確認できているのが「android.media.action.STILL_IMAGE_CAMERA」を受け取った時だけなのでここら辺をもう少しみたいと思います。
以上、Voice Interaction APIの説明でした。