「OK, Google」で発話した文言をハンドリングする

こんにちは、KID.Aです。

今回はホーム画面からGoogleの音声アクションが行われた場合、
その音声をハンドリングする方法を考えてみようと思います。

 

現在、思い付く方法はCustom Voice Actionsかアクセシビリティイベントの2つです。
では早速みてみましょう。

 

Custom Voice Actions

Voice ActionsのCustom Voice Actionsはok Googleで発話した特定のキーワードで指定したAction Intentを発行することができます。
しかしCustom Voice Actionsの開発サイトをみてるとまだ実装はされておらず、Voice Actionsのサイトを要チェックしておいてと記載されております。

・Custom Voice Actionsの開発サイト
https://developers.google.com/voice-actions/custom-actions?hl=ja

 

そのため、現時点(2015/12)ではCustom Voice Actionsではハンドリングできない状況です。

 

AccessibilityService

アクセシビリティイベントを使用すればユーザの行動を監視することができます。
これを使用してGoogleの音声アクションを感知することができます。

 

実装

voice_action_service.xmlを作成します。

<?xml version="1.0" encoding="UTF-8" ?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="@string/desc"
    />

AndroidManifest.xmlに追記します。

<service
    android:name=".VoiceActionService"
    android:label="VoiceActionService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/voice_action_service" />
</service>

AccessibilityServiceを作成します。

public class VoiceActionService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        AccessibilityNodeInfo accessibilityNodeInfo = event.getSource();
        if (accessibilityNodeInfo != null) {
            String searchTextClassName = "com.google.android.apps.gsa.searchplate.SimpleSearchText";
            if (searchTextClassName.equals(accessibilityNodeInfo.getClassName().toString())
                    && accessibilityNodeInfo.getText() != null) {
                Toast.makeText(getApplicationContext(), accessibilityNodeInfo.getText().toString(), Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onInterrupt() {
    }

}

 

実行

作成したアプリをインストールします。

設定を開きます。
SnapCrab_NoName_2015-12-22_18-14-55_No-00

ユーザー補助 > インストールしたアプリを選択します。
SnapCrab_NoName_2015-12-22_18-15-8_No-00

ONにします。
SnapCrab_NoName_2015-12-22_18-15-24_No-00

OKを押下します。
SnapCrab_NoName_2015-12-22_18-15-36_No-00

ONになっていることを確認します。
SnapCrab_NoName_2015-12-22_18-15-46_No-00

ホーム画面に戻り「OK, Google」と発呼します。
SnapCrab_NoName_2015-12-22_18-15-55_No-00

認識中になります。
SnapCrab_NoName_2015-12-22_18-16-7_No-00

適当に発呼します。(今回はDesktopと発呼。特に意味はありません。)
SnapCrab_NoName_2015-12-22_18-16-18_No-00

発呼した文言がアクセシビリティイベントで取得できてトーストがでます。
SnapCrab_NoName_2015-12-22_18-16-26_No-00

 

実際に実行すると3回くらいonAccessibilityEventにイベントが発行されますので、ここら辺は気をつけたほうがよいです。

 

本来なら、Custom Voice Actionsで実装するようなことですが、まだ実装できないことということでもしホーム画面のGoogleの音声アクションをハンドリングしたい場合はアクセシビリティイベントを使うしか方法はなさそうですね。(早くCustom Voice Actionsが使えるようになればいいですね。)
マーケットに上がっている音声アクション系のアプリは必ずアクセシビリティを許可しないと使えないので、おそらく音声アクション系のアプリはアクセシビリティのイベントを利用していると思われます。
 

以上、Googleの音声アクションのハンドリング方法でした。

 

 

KID.A

KID.A の紹介

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

コメントを残す

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