Spracheingabe

Mit der Spracheingabe können Sie eine benutzerfreundliche Oberfläche erstellen. Glas gibt es drei Möglichkeiten, die Spracheingabe zu nutzen.

Mithilfe von Haupt-Sprachbefehlen starten Sie Glassware über die Home-Karte, Befehle innerhalb einer Aktivität ausführen, und die Sprachausgabe über die Erkennungsaktivität können Sie Freitext-Spracheingaben von Nutzern erhalten.

Haupt-Sprachbefehle

Mit diesen Sprachbefehlen wird Glassware auf der Startseitenkarte (Uhrkarte) gestartet. Wenn Sie einen Haupt-Sprachbefehl deklarieren, erstellt Glass automatisch einen Menüpunkt wenn Nutzer Ihre Glassware durch Tippen auf das Startseitenkarte

So fügen Sie dem Hauptmenü der Ok Glass-Stimme einen Sprachbefehl hinzu:

  1. Erstellen Sie eine XML-Ressource für den Sprachbefehl in res/xml/<my_voice_trigger>.xml, die einen der vorhandenen Sprachbefehle verwendet definiert in VoiceTriggers.Command Hier siehst du zum Beispiel, wie „Starte Lauf“ verwendet wird.

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

    Um einen Sprachbefehl zu erstellen, der den Nutzer auffordert, einen zusätzlichen bevor du mit der Aktivität oder der Dienstleistung beginnst, füge input hinzu. -Elements an. Das ist beispielsweise sinnvoll, wenn Sie über „Update posten“.

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="POST_AN_UPDATE">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    
  2. Registrieren Sie einen Intent-Filter mithilfe der com.google.android.glass.action.VOICE_TRIGGER Aktion in Ihrem Android-Manifest. Der Intent-Filter startet Ihre Aktivität oder Ihren Dienst wenn erkannt wird, dass Nutzer Ihren Sprachbefehl sagen.

    <?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. Deklarieren Sie ein android:icon-Attribut für Ihre Aktivität oder Ihren Dienst. So kann Glass ein Symbol für Ihre Glassware im OK, Glass auf das Menü tippen.

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. Wenn bei Ihrem Sprachbefehl eine Aufforderung erscheint und eine Aktivität gestartet wird, sollten Sie transkribierten Text mit dem folgenden Code (z. B. in onResume()):

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

    Wenn der Sprachbefehl einen Dienst startet, ist das Intent-Extra in der onStartCommand()-Callback:

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

Einschränkungen festlegen

Wenn Sie zum Starten Ihrer Glassware eine oder alle der folgenden Funktionen benötigen, und geben sie in der Ressource res/xml/<my_voice_trigger>.xml an. Wenn die Funktionen nicht verfügbar sind, deaktiviert Glass den Sprachbefehl:

  • camera
  • network
  • microphone

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

Kontextbezogene Sprachbefehle

Mit kontextbezogenen Sprachbefehlen können Nutzer Aktionen in bestimmten Aktivitäten ausführen. Sie erstellen kontextbezogene Sprachbefehle mit den standardmäßigen Android-Menü-APIs, aber können die Menüpunkte per Sprachbefehl statt durch Berührung aufgerufen werden.

So aktivieren Sie kontextbezogene Sprachbefehle für eine bestimmte Aktivität:

  1. Rufen Sie uns unter getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS) an. in der gewünschten Aktivität, um kontextbezogene Sprachbefehle zu aktivieren. Mit dieser Funktion aktiviert ist, wird im Fußzeilenbereich des Bildschirms das Menü Ok Glass angezeigt. wenn diese Aktivität im Fokus steht.

  2. onCreatePanelMenu() überschreiben und den Fall zu lösen, WindowUtils.FEATURE_VOICE_COMMANDS aktiviert ist. Wenn diese Option aktiviert ist, kannst du das Menü einmalig einrichten, z. B. eine Menüressource oder das Aufrufen der Menu.add() Methoden zum Erstellen Ihres Sprachmenüsystems.

  3. onMenuItemSelected() überschreiben die die Sprachbefehle der Nutzenden verarbeiten. Wenn Nutzer fertig sind wird die Auswahl eines Menüpunkts automatisch durch den Sprachbefehl "ok, Glass" erscheint wieder im Fußzeilenbereich des Bildschirms, wo eine neue Stimme angenommen werden kann. verwenden, solange die Aktivität im Fokus bleibt.

    Der folgende Code ermöglicht kontextbezogene Sprachbefehle und erhöht die Lautstärke einer Menüressource. und verarbeitet Sprachbefehle, wenn diese gesprochen werden:

    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);
        }
    }
    

    Hier ist ein Beispiel für die Menüressource, die in der vorherigen Aktivität verwendet wurde. Beachten Sie, wie Sie verschachtelte Menüpunkte für eine hierarchische Stimme erstellen können. Menüsystems. Im folgenden Beispiel kann der erste Menüpunkt Zugriff als: ok Glass, Zeig mir Hunde, Labrador.

    <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. Optional: Überschreiben onPreparePanel(), um zu prüfen, ob WindowUtils.FEATURE_VOICE_COMMANDS ist aktiviert. Wenn diese Option aktiviert ist, können Sie das Menüsystem z. B. das Hinzufügen und Entfernen bestimmter Menüpunkte basierend auf bestimmten Kriterien. Sie können auch kontextbezogene Sprachmenüs ein- (zurück true) und deaktivieren (false zurückgeben) basierend auf bestimmten Kriterien. Beispiel:

        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);
        }
    

Gleichzeitige Unterstützung von Sprach- und Touch-Menüs

Da kontextbezogene Sprachbefehle die vorhandenen Android-Menü-APIs verwenden, können Sie viel von dem Code und den Ressourcen, die Sie bereits haben, für Touch-Menüs wiederverwenden. und unterstützen gleichzeitig beide Menütypen.

Du musst nur nach der Funktion „Window.FEATURE_OPTIONS_PANEL“ suchen neben der WindowUtils.FEATURE_VOICE_COMMANDS-Funktion, die Sie bereits nach denen Sie suchen, und fügen Sie dann eine Logik hinzu, um einer Nutzeraktion, wie z. B. Tippen, angezeigt wird.

Sie können beispielsweise die vorherige Aktivität Beispiel für die Unterstützung von Touch-Menüs wie diesem (Änderungen werden kommentiert):

// 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) {
    ...
}

Nach diesen Änderungen können Sie zum Anzeigen entweder auf Ok Glass tippen oder es sagen. Ihres Menüs.

Nicht gelistete Sprachbefehle für die Entwicklung verwenden

Wenn Sie Glassware vertreiben möchten, müssen Sie die genehmigte Haupt- Sprachbefehle in VoiceTriggers.Command und zugelassenen kontextbezogenen Sprachbefehlen ContextualMenus.Command

Wenn Sie Sprachbefehle verwenden möchten, die nicht im GDK verfügbar sind, Sie können in Ihrer AndroidManifest.xml-Datei eine Android-Berechtigung anfordern:

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

Nicht gelistete Haupt-Sprachbefehle verwenden

  1. Geben Sie einen Stringwert in res/values/strings.xml an, der definiert, den Namen Ihres Auslösers für die Sprachbedienung. Deklarieren Sie optional eine Sprachaufforderung um die Spracherkennungs-Glassware anzuzeigen, bevor Sie Ihre Glassware starten.

    <?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. Erstellen Sie eine XML-Ressource für den Sprachtrigger in res/xml/<my_voice_trigger>.xml Für nicht gelistete Sprachbefehle verwenden Sie das Attribut keyword anstelle des Attributs command, das für genehmigte Sprachbefehle verwenden. Das Attribut keyword sollte ein Verweis auf den String sein Ressource, mit der der Sprachbefehl definiert wird. Für einen einfachen Sprachbefehl-Trigger, der eine Aktivität oder Dienst sofort verwenden, geben Sie einfach das Element trigger an:

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

    Um einen Sprachtrigger zu erstellen, der den Nutzer auffordert, eine zusätzliche bevor Sie mit der Aktivität oder der Dienstleistung beginnen, fügen Sie ein Eingabeelement hinzu. Außerdem:

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

Nicht gelistete kontextbezogene Sprachbefehle verwenden

Verwenden Sie beim Titel des Menüpunkts beliebigen Text. Beispiel:

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

Spracherkennung wird gestartet


Die Spracherkennungs-Glassware wartet, bis der Nutzer spricht und gibt den und transkribierten Text. So starten Sie die Aktivität:

  1. startActivityForResult() anrufen mit dem Intent ACTION_RECOGNIZE_SPEECH. Die folgenden Intent-Extras werden beim Starten der Aktivität unterstützt: <ph type="x-smartling-placeholder">
  2. Überschreiben Sie die onActivityResult() -Rückruf zurück, um den transkribierten Text vom EXTRA_RESULTS zusätzliche Absicht. Dieser Callback wird aufgerufen, wenn der Nutzer mit dem Sprechen fertig ist.

    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);
    }