Rozpoznawanie mowy

Rozpoznawanie mowy umożliwia obsługę interfejsu bez użycia rąk. Szkło udostępnia 3 sposoby wprowadzania głosowego.

Główne polecenia głosowe uruchamiają Google Glass na karcie Home, głos kontekstowy polecenia te mogą wykonywać działania w ramach działania, a komunikaty głosowe systemu aktywność związaną z rozpoznawaniem pozwala na swobodne wypowiedzi użytkowników.

Główne polecenia głosowe

Te polecenia głosowe uruchamiają oprogramowanie Glassware na karcie Home (karta zegara). Gdy zadeklaruje główne polecenie głosowe, Glass automatycznie utworzy pozycję w menu dotykowym jako zastępczą, jeśli użytkownicy zdecydują się uruchomić aplikację Glassware, klikając ikonę Karta Strona główna.

Aby dodać polecenie głosowe do menu głównego głosu ok Glass:

  1. Utwórz zasób XML dla polecenia głosowego w res/xml/<my_voice_trigger>.xml używający jednego z dotychczasowych poleceń głosowych zdefiniowane w VoiceTriggers.Command Oto jak użyć na przykład polecenia „Rozpocznij bieg”.

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

    Aby utworzyć polecenie głosowe zachęcające użytkownika do wypowiedzenia dodatkowych przed rozpoczęciem działalności lub usługi, umieść input . Możesz to zrobić na przykład, jeśli jesteś używając opcji „Opublikuj aktualizację”.

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="POST_AN_UPDATE">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    
  2. Zarejestruj filtr intencji za pomocą parametru Działanie com.google.android.glass.action.VOICE_TRIGGER w Plik manifestu Androida. Filtr intencji uruchamia aktywność lub usługę gdy wykryje, że użytkownik wypowiada Twoje polecenie głosowe.

    <?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. Zadeklaruj atrybut android:icon dla swojej aktywności lub usługi. Dzięki temu ikona Glassware może być wyświetlana w OK, szklane menu.

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. Jeśli po uruchomieniu polecenia głosowego pojawi się komunikat głosowy i rozpocznie się aktywność, uzyskaj dowolny tekst z transkrypcją zawierający następujący kod (np. w onResume()):

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

    Jeśli polecenie głosowe uruchomi usługę, dodatkowa intencja będzie dostępna w onStartCommand() – wywołanie zwrotne:

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

Ustawianie ograniczeń

Jeśli do uruchomienia oprogramowania Glassware potrzebujesz co najmniej jednej z tych funkcji: określić je w zasobie res/xml/<my_voice_trigger>.xml. Jeśli te funkcje nie są dostępne, Glass wyłącza polecenie głosowe:

  • camera
  • network
  • microphone

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

Kontekstowe polecenia głosowe

Kontekstowe polecenia głosowe pozwalają użytkownikom wykonywać działania związane z aktywnością. Kontekstowe polecenia głosowe tworzy się za pomocą standardowych interfejsów API menu Androida, ale użytkownicy mogą wywoływać elementy menu poleceniami głosowymi zamiast dotykiem.

Aby włączyć kontekstowe polecenia głosowe w przypadku określonej aktywności:

  1. Zadzwoń pod numer getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS) w danej aktywności, by włączyć kontekstowe polecenia głosowe. Dzięki tej funkcji włączony, w stopce ekranu pojawia się menu „OK Glass” za każdym razem, gdy dana aktywność będzie skoncentrowana.

  2. Zastąp onCreatePanelMenu() i zajmuje się tą sprawą, WindowUtils.FEATURE_VOICE_COMMANDS jest włączona. Gdy ta opcja jest włączona, w tym miejscu możesz jednorazowo skonfigurować menu, np. zasobu menu lub wywołania funkcji Menu.add() metod tworzenia systemu menu głosowego.

  3. Zastąp onMenuItemSelected() obsługi poleceń głosowych, gdy użytkownicy je wypowiadają. Gdy użytkownicy skończą wybranie pozycji z menu i automatyczne polecenie głosowe „OK, Glass”; ponownie pojawi się w stopce ekranu, gotowe do przyjęcia nowego głosu polecenie, dopóki działanie pozostaje zaznaczone.

    Ten kod włącza kontekstowe polecenia głosowe, rozszerza zasób menu w razie potrzeby i reaguje na wypowiadane polecenia głosowe:

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

    Oto przykład zasobu menu używanego przez poprzednią aktywność. Zwróć uwagę, jak możesz tworzyć zagnieżdżone pozycje menu na potrzeby stylu hierarchicznego system menu. W poniższym przykładzie pierwsza pozycja menu może będą dostępne jako: ok Glass, Pokaż mi psy, 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. (Opcjonalnie) Zastąp onPreparePanel() sprawdzanie, czy WindowUtils.FEATURE_VOICE_COMMANDS jest włączony. Jeśli ta opcja jest włączona, w tym miejscu możesz skonfigurować system menu w inny sposób, np. dodawanie i usuwanie określonych pozycji menu na podstawie pewnych kryteriów. Dostępne opcje włącz też (powrót true) lub wyłącz kontekstowe menu głosowe (Zwróć false) na podstawie wybranych kryteriów. Na przykład:

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

Równoczesna obsługa menu głosowego i dotykowego

Kontekstowe polecenia głosowe wykorzystują istniejące interfejsy API menu Androida, możesz ponownie wykorzystać dużą część kodu i zasobów, które już masz, aby tworzyć dotykowe menu i jednocześnie obsługują oba typy menu.

Wystarczy, że sprawdzisz, czy działa funkcja Window.FEATURE_OPTIONS_PANEL oprócz funkcji WindowUtils.FEATURE_VOICE_COMMANDS, którą już masz sprawdzają je w kilku metodach, a następnie dodają funkcję logiczną, aby uruchomić w menu po działaniu użytkownika, np. kliknięciu.

Możesz na przykład zmienić poprzednią aktywność przykład dodawania obsługi menu dotykowych (zmiany są komentowane):

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

Po tych zmianach możesz kliknąć lub powiedzieć OK, aby wyświetlić w menu.

Korzystanie z niepublicznych poleceń głosowych w trakcie programowania

Aby dystrybuować oprogramowanie Glassware, należy użyć zatwierdzonej Polecenia głosowe w VoiceTriggers.Command i zatwierdzonych kontekstowych poleceń głosowych w języku ContextualMenus.Command

Jeśli chcesz używać poleceń głosowych, które są niedostępne w GDK, możesz poprosić o przyznanie uprawnień dla Androida w pliku AndroidManifest.xml:

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

Używanie głównych poleceń głosowych niepublicznych

  1. Zadeklaruj w funkcji res/values/strings.xml wartość ciągu, która określa nazwę wyzwalacza głosowego. Opcjonalnie zadeklaruj prompt głosowy aby wyświetlić oprogramowanie Glassware rozpoznawania mowy przed uruchomieniem oprogramowania.

    <?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. Utwórz zasób XML dla wyzwalacza głosowego w res/xml/<my_voice_trigger>.xml W przypadku niepublicznych poleceń głosowych użyj atrybut keyword zamiast atrybutu command używanego do zatwierdzenia poleceń głosowych. Atrybut keyword powinien być odwołaniem do ciągu zasobu definiującego polecenie głosowe. W przypadku prostego polecenia głosowego, który uruchamia możesz natychmiast określić działanie lub usługę, wystarczy, że określisz element trigger:

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

    Aby utworzyć wyzwalacz głosowy, który poprosi użytkownika o wypowiedzenie dodatkowych słów przed rozpoczęciem działalności lub usługi, wstaw element do wprowadzania danych oraz:

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

Używanie niepublicznych kontekstowych poleceń głosowych

Podczas tworzenia pozycji menu możesz użyć dowolnego tekstu w tytule. Na przykład:

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

Włączam rozpoznawanie mowy


Szklane oprogramowanie do rozpoznawania mowy czeka na wypowiedzi użytkowników i zwraca a następnie transkrybować tekst. Aby rozpocząć aktywność:

  1. Zadzwoń pod numer startActivityForResult() z intencją ACTION_RECOGNIZE_SPEECH. Podczas uruchamiania działania obsługiwane są te dodatkowe intencji:
  2. Zastąp onActivityResult() oddzwanianie, by otrzymać transkrypcję EXTRA_RESULTS intencja użytkownika. To wywołanie zwrotne jest wywoływane po zakończeniu mówienia przez użytkownika.

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