音声入力

音声入力を使用すれば、真のハンズフリー インターフェースを作成できます。ガラス 音声入力を活用する方法は 3 つあります

主な音声コマンドは、ホームカードから Glassware を起動する、コンテキスト音声です アクティビティ内でアクションを実行できるほか、システムの音声 認識アクティビティを使用すると、ユーザーから自由形式の音声入力を受け取ることができます。

主な音声コマンド

これらの音声コマンドにより、ホームカード(時計カード)から Glassware が起動します。ユーザーが メイン音声コマンドを宣言すると、Glass では自動的にタッチ メニュー アイテムが作成されます ユーザーが [ ホームカード。

[ok glass] 音声メインメニューに音声コマンドを追加するには:

  1. 音声コマンドの XML リソースを作成する res/xml/<my_voice_trigger>.xml: 既存の音声コマンドのいずれかを使用します 定義 VoiceTriggers.Command。 例えば、「ランニングを開始」は、次のように使います。

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="START_A_RUN" />
    

    ユーザーに追加の音声指示を求める音声コマンドを作成する フレーズは、アクティビティやサービスを開始する前に、input を含めてください。 追加することもできます。たとえば、2024 年に [最新情報を投稿する]を使用します

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="POST_AN_UPDATE">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    
  2. 次のようにして、インテント フィルタを登録します。 com.google.android.glass.action.VOICE_TRIGGER 件のアクション Android マニフェスト。インテント フィルタがアクティビティまたはサービスを開始する ユーザーが音声コマンドを話したことが検出されると、通知が行われます。

    <?xml version="1.0" encoding="utf-8"?>
    <application ...>
        <activity | service ...>
            <intent-filter>
                <action android:name=
                        "com.google.android.glass.action.VOICE_TRIGGER" />
            </intent-filter>
            <meta-data android:name="com.google.android.glass.VoiceTrigger"
                android:resource="@xml/my_voice_trigger" />
        </activity | service>
        // ...
    </application>
    
  3. アクティビティまたはサービスに対して android:icon 属性を宣言します。 これにより、Glassware のアイコンが OK, グラスのタップメニュー。

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. 音声コマンドで音声プロンプトを使用してアクティビティを開始する場合は、 次のコードを含む文字起こしテキスト(例: onResume()):

    ArrayList<String> voiceResults = getIntent().getExtras()
            .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
    

    音声コマンドでサービスを開始すると、 onStartCommand() コールバック:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        ArrayList<String> voiceResults = intent.getExtras()
                .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
        // ...
    }
    

制約の設定

Glassware を起動するために以下の機能のいずれかまたはすべてが必要な場合は、 res/xml/<my_voice_trigger>.xml リソースで指定します。 該当する機能が利用できない場合、Glass では音声コマンドが無効になります。

  • camera
  • network
  • microphone

    <trigger command="POST_AN_UPDATE">
        <constraints
            camera="true"
            network="true" />
    </trigger>
    

コンテキスト音声コマンド

コンテキスト音声コマンドにより、ユーザーはアクティビティからアクションを実行できます。 コンテキストに応じた音声コマンドを作成するには、標準の Android メニュー API を使用しますが、 タップの代わりに音声コマンドでメニュー項目を呼び出せます。

特定のアクティビティでコンテキストに応じた音声コマンドを有効にするには:

  1. 電話番号: getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS) コンテキストに基づく音声コマンドを有効にします。この機能付き 有効にすると、画面のフッター領域に「ok glass」メニューが表示されます。 呼び出されることがあります。

  2. onCreatePanelMenu() をオーバーライドする 次のようなケースを処理します WindowUtils.FEATURE_VOICE_COMMANDS 有効になります。有効にした場合、ここでインフレートなどの 1 回限りのメニュー設定を行います メニュー リソース、または Menu.add() の呼び出し 音声メニュー システムを作成します。

  3. onMenuItemSelected() をオーバーライドする ユーザーが音声コマンドを発話したときに処理できるようにする必要があります。ユーザーが作業を完了したとき メニュー項目を選択すると、「OK グラス」という音声コマンドが自動的に 画面のフッター セクションに再表示され、新しい音声を受け付ける準備が整う アクティビティにフォーカスがある限り、このコマンドを実行できます。

    次のコードは、コンテキストに基づく音声コマンドを有効にし、メニュー リソースをインフレートします。 適切に表示され、音声コマンドが発せられたときに処理されます。

    public class ContextualMenuActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle bundle) {
            super.onCreate(bundle);
    
            // Requests a voice menu on this activity. As for any other
            // window feature, be sure to request this before
            // setContentView() is called
            getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public boolean onCreatePanelMenu(int featureId, Menu menu) {
            if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) {
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
            }
            // Pass through to super to setup touch menu.
            return super.onCreatePanelMenu(featureId, menu);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public boolean onMenuItemSelected(int featureId, MenuItem item) {
            if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) {
                switch (item.getItemId()) {
                    case R.id.dogs_menu_item:
                        // handle top-level dogs menu item
                        break;
                    case R.id.cats_menu_item:
                        // handle top-level cats menu item
                        break;
                    case R.id.lab_menu_item:
                        // handle second-level labrador menu item
                        break;
                    case R.id.golden_menu_item:
                        // handle second-level golden menu item
                        break;
                    case R.id.calico_menu_item:
                        // handle second-level calico menu item
                        break;
                    case R.id.cheshire_menu_item:
                        // handle second-level cheshire menu item
                        break;
                    default:
                        return true;
                }
                return true;
            }
            // Good practice to pass through to super if not handled
            return super.onMenuItemSelected(featureId, item);
        }
    }
    

    前のアクティビティで使用したメニュー リソースの例を次に示します。 階層音声でネストされたメニュー項目を作成する方法に注目 アクセスできます。次の例で、最初のメニュー項目は 「オーケー グラス、見せて、犬、ラブラドール」のようにアクセスします。

    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- Use the constants defined in the ContextualMenus.Command enum-->
        <item
            android:id="@+id/dogs_menu_item"
            android:title="@string/show_me_dogs">
            <menu>
                <item
                    android:id="@+id/lab_menu_item"
                    android:title="@string/labrador" />
                <item
                    android:id="@+id/golden_menu_item"
                    android:title="@string/golden" />
            </menu>
        </item>
        <item
            android:id="@+id/cats_menu_item"
            android:title="@string/show_me_cats">
            <menu>
                <item
                    android:id="@+id/cheshire_menu_item"
                    android:title="@string/cheshire" />
                <item
                    android:id="@+id/calico_menu_item"
                    android:title="@string/calico" />
            </menu>
        </item>
    </menu>
    
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- Use the constants defined in the ContextualMenus.Command enum-->
        <item
            android:id="@+id/play_menu_item"
            android:title="PLAY_MUSIC" />
        <item
            android:id="@+id/pause_menu_item"
            android:title="PAUSE_MUSIC" />
    </menu>
    
  4. (省略可)オーバーライド onPreparePanel() 確認しています。 WindowUtils.FEATURE_VOICE_COMMANDS は有効になっています。 有効にすると、ここで他のロジックを実行してメニュー システムを設定できます。 たとえば、条件に基づいて特定のメニュー項目を追加または削除します。Google Chat では コンテキスト音声メニューのオン(true を返す)とオフを切り替えることも可能 (false を返します)。例:

        private boolean mVoiceMenuEnabled;
        ...
        @Override
        public boolean onPreparePanel(int featureId, View view, Menu menu) {
            if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) {
            // toggle this boolean on and off based on some criteria
                return mVoiceMenuEnabled;
            }
            // Good practice to call through to super for other cases
            return super.onPreparePanel(featureId, view, menu);
        }
    

音声メニューとタップメニューの同時サポート

コンテキスト音声コマンドでは既存の Android メニュー API が使用されるため、 すでに持っている多くのコードやリソースを タップメニュー用に再利用できます 両方のメニューを同時にサポートします

Window.FEATURE_OPTIONS_PANEL 機能をチェックするだけです に加えて、すでにご利用の WindowUtils.FEATURE_VOICE_COMMANDS 機能も いくつかのメソッドでチェックを行ってから タップ操作を開始するロジックを タップなどのユーザー操作に応じたメニューを作成します。

たとえば、以前のアクティビティは、 次のようなタッチメニューのサポートを追加するサンプル(変更はコメント化されています)

// 1. Check for Window.FEATURE_OPTIONS_PANEL
// to inflate the same menu resource for touch menus.
@Override
public boolean onCreatePanelMenu(int featureId, Menu menu) {
    if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
            featureId == Window.FEATURE_OPTIONS_PANEL) {
    ...
}

// 2. Check for Window.FEATURE_OPTIONS_PANEL
// to handle touch menu item selections.
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
            featureId == Window.FEATURE_OPTIONS_PANEL) {
    ...
}

この変更により、「オーケー グラス」をタップするかそのように話しかけることで、 選択します。

限定公開の音声コマンドを開発に使用する

Glassware を配布するときは、承認済みのメインの 音声コマンドを使用する VoiceTriggers.Command 承認済みのコンテキスト音声コマンドを ContextualMenus.Command

GDK で使用できない音声コマンドを使用する場合は、 AndroidManifest.xml ファイルで Android 権限をリクエストできます。

<uses-permission
     android:name="com.google.android.glass.permission.DEVELOPMENT" />

限定公開されている主な音声コマンドの使用

  1. res/values/strings.xml で文字列値を宣言し、 名前が表示されます。音声プロンプトを宣言する(省略可) Glassware を起動する前に、音声認識の Glassware を表示します。

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="glass_voice_trigger">read me a story</string>
        <string name="glass_voice_prompt">what story?</string>
    </resources>
    
  2. 音声トリガーの XML リソースを res/xml/<my_voice_trigger>.xml。限定公開の音声コマンドには、 承認済み商品に command 属性ではなく keyword 属性が使用されています 使用できます。keyword 属性は文字列への参照にする必要があります。 音声コマンドを定義するリソースです。シンプルな音声トリガーで trigger 要素を指定するだけです。

    <?xml version="1.0" encoding="utf-8"?>
    <trigger keyword="@string/glass_voice_trigger" />
    

    ユーザーに追加の音声指示を出す音声トリガーを作成するには フレーズを含める場合は、 さらに:

    <?xml version="1.0" encoding="utf-8"?>
    <trigger keyword="@string/glass_voice_trigger">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    

限定公開のコンテキスト音声コマンドの使用

メニュー項目を作成する際は、メニュー項目のタイトルに任意のテキストを使用します。 例:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Use the constants defined in the ContextualMenus.Command enum-->
    <item
        android:id="@+id/pizza_menu_item"
        android:title="@string/find_pizza" />
</menu>

音声認識を開始しています


音声認識 Glassware は、ユーザーの発言を待ってから、 文字起こしテキストを生成します。アクティビティを開始するには:

  1. startActivityForResult() を呼び出す (ACTION_RECOGNIZE_SPEECH インテントを含む)。 アクティビティの開始時にサポートされるインテント エクストラは次のとおりです。 <ph type="x-smartling-placeholder">
  2. オーバーライドする onActivityResult() 音声文字変換されたテキストを EXTRA_RESULTS インテント エクストラ。このコールバックは、ユーザーが話し終えると呼び出されます。

    private static final int SPEECH_REQUEST = 0;
    
    private void displaySpeechRecognizer() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        startActivityForResult(intent, SPEECH_REQUEST);
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent data) {
        if (requestCode == SPEECH_REQUEST && resultCode == RESULT_OK) {
            List<String> results = data.getStringArrayListExtra(
                    RecognizerIntent.EXTRA_RESULTS);
            String spokenText = results.get(0);
            // Do something with spokenText.
        }
        super.onActivityResult(requestCode, resultCode, data);
    }