[Android 6.0] Voice Interaction APIについて

こんにちは、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

 

「OK Google」と発呼します。
SnapCrab_NoName_2015-12-8_10-41-47_No-00

 

「take a picture」と発呼します。
SnapCrab_NoName_2015-12-8_10-42-51_No-00

 

インストールしたアプリが選択されます。
SnapCrab_NoName_2015-12-8_10-43-7_No-00

 

「Say Cheese」といわれます。
SnapCrab_NoName_2015-12-8_10-43-22_No-00

 

「ok」と発呼します。
SnapCrab_NoName_2015-12-8_10-43-34_No-00

 

そうすると「Here it is」といわれ、写真が撮れます。
SnapCrab_NoName_2015-12-8_10-43-45_No-00

 

このようにアプリが立ち上がってから、画面下のダイアログプレートで音声会話ができアプリを操作することができます。
この音声会話を構築できる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の説明でした。

 

 

KID.A

KID.A の紹介

楽して生きることと一発逆転を夢見ている、ちゃきちゃきのAndroiderです。 いろいろアプリを出しているのですが、いつもリリース後にターゲットユーザ数を2桁見誤っていたことに気付くので、残念でなりません。下方修正で、ヒットがでません。おしいです。 明日から本気出します。 よろしくお願いします。
カテゴリー: Android タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です