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:
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 wVoiceTriggers.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>
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>
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>
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:
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.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 funkcjiMenu.add()
metod tworzenia systemu menu głosowego.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>
(Opcjonalnie) Zastąp
onPreparePanel()
sprawdzanie, czyWindowUtils.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óttrue
) 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
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>
Utwórz zasób XML dla wyzwalacza głosowego w
res/xml/<my_voice_trigger>.xml
W przypadku niepublicznych poleceń głosowych użyj atrybutkeyword
zamiast atrybutucommand
używanego do zatwierdzenia poleceń głosowych. Atrybutkeyword
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 elementtrigger
:<?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ść:
- Zadzwoń pod numer
startActivityForResult()
z intencjąACTION_RECOGNIZE_SPEECH
. Podczas uruchamiania działania obsługiwane są te dodatkowe intencji: 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); }