Saisie vocale

La saisie vocale vous permet de créer une interface par commande vocale. Verre vous propose trois façons d'utiliser la saisie vocale.

Les principales commandes vocales permettent de lancer Glassware depuis la fiche d'accueil, les commandes vocales contextuelles peuvent exécuter des actions au sein d'une activité, et la reconnaissance vocale du système l'activité de reconnaissance vous permet de recevoir des entrées vocales au format libre de la part des utilisateurs.

Commandes vocales principales

Ces commandes vocales permettent de lancer Glassware depuis la carte "Accueil" (carte Horloge). Lorsque vous déclarer une commande vocale principale, les lunettes Glass créent automatiquement un élément de menu tactile ; comme solution de secours si les utilisateurs décident de démarrer votre Glassware en appuyant sur Fiche de la page d'accueil.

Pour ajouter une commande vocale au menu principal vocal ok Glass:

  1. Créez une ressource XML pour la commande vocale dans res/xml/<my_voice_trigger>.xml, qui utilise l'une des commandes vocales existantes défini dans VoiceTriggers.Command Par exemple, voici comment utiliser l'option "Lancer une exécution".

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

    Pour créer une commande vocale qui invite l'utilisateur à énoncer avant de démarrer votre activité ou service, incluez un input . Par exemple, vous pouvez choisir de le faire en cliquant sur "Publier une mise à jour".

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="POST_AN_UPDATE">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    
  2. Enregistrez un filtre d'intent à l'aide de la méthode com.google.android.glass.action.VOICE_TRIGGER action dans votre Fichier manifeste Android. Le filtre d'intent lance votre activité ou votre service si des utilisateurs émettent votre commande vocale.

    <?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. Déclarez un attribut android:icon pour votre activité ou votre service. Cela permet aux Google Glass d'afficher une icône pour vos lunettes Glassware dans menu tactile verre.

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. Si votre commande vocale utilise une commande vocale et lance une activité, obtenez tout texte transcrit avec le code suivant (comme dans onResume()):

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

    Si la commande vocale permet de démarrer un service, l'intent supplémentaire est disponible dans le Rappel onStartCommand():

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

Définition des contraintes

Si vous avez besoin d'une ou de toutes les fonctionnalités suivantes pour démarrer votre appareil Glassware, spécifiez-les dans la ressource res/xml/<my_voice_trigger>.xml. Si les fonctionnalités ne sont pas disponibles, les lunettes Glass désactivent la commande vocale:

  • camera
  • network
  • microphone

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

Commandes vocales contextuelles

Les commandes vocales contextuelles permettent aux utilisateurs d'effectuer des actions à partir d'activités. Vous créez des commandes vocales contextuelles avec les API de menu standard d'Android, mais les utilisateurs peuvent appeler les éléments du menu à l'aide de commandes vocales au lieu d'appuyer.

Pour activer les commandes vocales contextuelles pour une activité spécifique:

  1. Appelez le getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS) dans l'activité souhaitée pour activer les commandes vocales contextuelles. Grâce à cette fonctionnalité, le menu OK Glass apparaît dans le pied de page de l'écran. chaque fois que cette activité est ciblée.

  2. Ignorer onCreatePanelMenu() et gérer le cas où WindowUtils.FEATURE_VOICE_COMMANDS est activé. Si cette option est activée, c'est ici que vous effectuez une configuration unique du menu, comme le gonflage une ressource de menu ou en appelant la méthode Menu.add() pour créer votre système de menu vocal.

  3. Ignorer onMenuItemSelected() pour gérer les commandes vocales quand les utilisateurs les prononcent. Lorsque les utilisateurs ont terminé sélectionnez un élément du menu, la commande vocale "OK, Glass" réapparaît dans le pied de page de l'écran, prêt à accepter une nouvelle voix tant que l'activité reste active.

    Le code suivant active les commandes vocales contextuelles et gonfle une ressource de menu le cas échéant, et gère les commandes vocales lorsqu'elles sont prononcées:

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

    Voici un exemple de ressource de menu utilisée par l'activité précédente. Vous pouvez créer des éléments de menu imbriqués pour une voix hiérarchique. le système de menus. Dans l'exemple suivant, le premier élément de menu est accessible en tant que: ok Glass, Montre-moi les chiens, 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. (Facultatif) Remplacer onPreparePanel() vérifier si oui ou non WindowUtils.FEATURE_VOICE_COMMANDS est activé. Si cette option est activée, c'est ici que vous pouvez utiliser une autre logique pour configurer le système de menus, comme l'ajout et la suppression de certains éléments de menu en fonction de certains critères. Vous pouvez activer ou désactiver également les menus vocaux contextuels (retourner true) (renvoyer false) en fonction de certains critères. Exemple :

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

Prise en charge simultanée des menus vocaux et tactiles

Comme les commandes vocales contextuelles utilisent les API de menu Android existantes, vous pouvez réutiliser une grande partie du code et des ressources dont vous disposez déjà pour les menus tactiles et prendre simultanément en charge les deux types de menus.

Il vous suffit de vérifier la fonctionnalité Window.FEATURE_OPTIONS_PANEL en plus de la fonctionnalité WindowUtils.FEATURE_VOICE_COMMANDS que vous avez déjà que vous vérifiez quelques méthodes, puis ajoutez une logique pour ouvrir l'écran tactile sur une action de l'utilisateur, telle qu'un appui.

Par exemple, vous pouvez modifier l'activité précédente exemple pour ajouter la prise en charge des menus tactiles comme celui-ci (les modifications sont commentées):

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

Vous pouvez alors appuyer ou dire OK Glass pour afficher votre menu.

Utiliser des commandes vocales non répertoriées pour le développement

Lorsque vous souhaitez distribuer vos appareils Glassware, vous devez utiliser le commandes vocales en VoiceTriggers.Command et des commandes vocales contextuelles approuvées ContextualMenus.Command

Si vous souhaitez utiliser des commandes vocales qui ne sont pas disponibles dans le GDK, vous pouvez demander une autorisation Android dans votre fichier AndroidManifest.xml:

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

Utiliser les commandes vocales principales non répertoriées

  1. Déclarez une valeur de chaîne dans res/values/strings.xml qui définit le nom de votre déclencheur vocal. Déclarer une invite vocale (facultatif) pour afficher les lunettes Glassware de reconnaissance vocale avant de les lancer.

    <?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. Créez une ressource XML pour le déclencheur vocal dans res/xml/<my_voice_trigger>.xml Pour les commandes vocales non répertoriées, utilisez L'attribut keyword au lieu de l'attribut command utilisé pour les attributs approuvés commandes vocales. L'attribut keyword doit être une référence à la chaîne ressource définissant la commande vocale. Pour un déclencheur vocal simple qui déclenche activité ou service, il vous suffit de spécifier l'élément trigger:

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

    Pour créer un déclencheur vocal qui invite l'utilisateur à énoncer une autre requête avant de lancer votre activité ou service, incluez un élément d'entrée ainsi que:

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

Utiliser des commandes vocales contextuelles non répertoriées

Lorsque vous créez des éléments de menu, utilisez n'importe quel texte pour le titre de l'élément de menu. Exemple :

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

Démarrage de la reconnaissance vocale...


Le logiciel Glassware de reconnaissance vocale attend que l'utilisateur parle et renvoie le transcrit une fois qu'ils ont terminé. Pour commencer l'activité:

  1. Appeler startActivityForResult() avec l'intent ACTION_RECOGNIZE_SPEECH. Les extras d'intent suivants sont acceptés au démarrage de l'activité:
  2. Remplacez les onActivityResult() pour recevoir la transcription de la chaîne EXTRA_RESULTS sur l'intention supplémentaire. Ce rappel est appelé lorsque l'utilisateur a fini de parler.

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