Aby wdrożyć aplikację do interakcji głosowej (VIA), wykonaj te czynności:
- Utwórz szkielet VIA.
- (Opcjonalnie) Skonfiguruj proces konfiguracji lub logowania.
- (Opcjonalnie) Wdróż ekran ustawień.
- Zadeklaruj wymagane uprawnienia w pliku manifestu.
- Wdróż interfejs tablicy głosowej.
- Zaimplementuj rozpoznawanie głosu (musi obejmować implementację interfejsu RecognitionService API).
- Implementacja wypowiedzi (opcjonalnie możesz zaimplementować interfejs TextToSpeech API).
- Wdrażanie wykonywania poleceń. Zobacz tę treść w: Wykonywanie poleceń.
Instrukcje wykonywania wszystkich powyższych czynności znajdziesz w sekcjach poniżej.
Utwórz szkielet VIA
Pliki manifestu
Aplikacja jest wykrywana jako aplikacja obsługująca interakcję głosową, jeśli: zawarte w pliku manifestu:
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myvoicecontrol"> ... <application ... > <service android:name=".MyInteractionService" android:label="@string/app_name" android:permission="android.permission.BIND_VOICE_INTERACTION" android:process=":interactor"> <meta-data android:name="android.voice_interaction" android:resource="@xml/interaction_service" /> <intent-filter> <action android:name= "android.service.voice.VoiceInteractionService" /> </intent-filter> </service> </application> </manifest>
W tym przykładzie:
- VIA muszą udostępniać usługę, która rozszerza możliwości
VoiceInteractionService
, z filtr intencji dla działaniaVoiceInteractionService.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService")
. - Ta usługa musi mieć systemowe uprawnienia dotyczące podpisu w
BIND_VOICE_INTERACTION
. - Ta usługa powinna zawierać plik metadanych
android.voice_interaction
następujące elementy:res/xml/interaction_service.xml (w języku angielskim)
<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android" android:sessionService= "com.example.MyInteractionSessionService" android:recognitionService= "com.example.MyRecognitionService" android:settingsActivity= "com.example.MySettingsActivity" android:supportsAssist="true" android:supportsLaunchVoiceAssistFromKeyguard="true" android:supportsLocalInteraction="true" />
Szczegółowe informacje o poszczególnych polach znajdziesz tutaj: R.styleable#VoiceInteractionService
.
Ponieważ wszystkie ViA są również usługami rozpoznawania głosu,
w pliku manifestu umieść te elementy:
AndroidManifest.xml
<manifest ...> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <application ...> ... <service android:name=".RecognitionService" ...> <intent-filter> <action android:name="android.speech.RecognitionService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.speech" android:resource="@xml/recognition_service" /> </service> </application> </manifest>
Usługi rozpoznawania mowy wymagają też tych metadanych:
res/xml/recognition_service.xml
<recognition-service xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.MyRecognizerSettingsActivity" />
VoiceInteractionService, VoiceInteractionSessionService i VoiceInteractionSession
Poniższy diagram przedstawia cykl życia każdego z tych elementów:
Rysunek 1. Cykle życia
Jak już wspomnieliśmy, punktem początkowym jest VoiceInteractionService
do VIA. Główne obowiązki związane z tą usługą to:
- Zainicjuj wszystkie procesy, które powinny działać tak długo, jak ten VIA jest aktywny. Dotyczy to na przykład wykrywania słów-kluczy.
- Zgłoszenia obsługiwanych komend głosowych (patrz Czytanie jednym kliknięciem w Asystencie głosowym).
- Uruchamiaj sesje interakcji głosowej z ekranu blokady.
W najprostszej formie implementacja VoiceInteractionService wyglądałaby podobny do tego:
public class MyVoiceInteractionService extends VoiceInteractionService { private static final List<String> SUPPORTED_VOICE_ACTIONS = Arrays.asList( CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION, CarVoiceInteractionSession.VOICE_ACTION_REPLY_NOTIFICATION, CarVoiceInteractionSession.VOICE_ACTION_HANDLE_EXCEPTION ); @Override public void onReady() { super.onReady(); // TODO: Setup hotword detector } @NonNull @Override public Set<String> onGetSupportedVoiceActions( @NonNull Set<String> voiceActions) { Set<String> result = new HashSet<>(voiceActions); result.retainAll(SUPPORTED_VOICE_ACTIONS); return result; } ... }
Implementacja funkcji VoiceInteractionService#onGetSupportedVoiceActions()
jest
wymagane do obsługi
Funkcja „Dotknij, by odczytać” z Asystentem głosowym
System VoiceInteractionSessionService używa do tworzenia
wejdź w interakcję z VoiceInteractionSession. Ma tylko jedną odpowiedzialność:
aby rozpoczynać nowe sesje, gdy o to poprosisz.
public class MyVoiceInteractionSessionService extends VoiceInteractionSessionService { @Override public VoiceInteractionSession onNewSession(Bundle args) { return new MyVoiceInteractionSession(this); } }
Wreszcie większość pracy jest wykonywana w ramach VoiceInteractionSession.
co można zrobić. Jedno wystąpienie sesji może być wielokrotnie wykorzystywane do realizacji wielu zadań
interakcji użytkowników. W AAOS istnieje pomocnik CarVoiceInteractionSession
,
pomagając we wdrożeniu niektórych unikalnych funkcji
z branży motoryzacyjnej.
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { public InteractionSession(Context context) { super(context); } @Override protected void onShow(String action, Bundle args, int showFlags) { closeSystemDialogs(); // TODO: Unhide UI and update UI state // TODO: Start processing audio input } ... }
VoiceInteractionSession
ma duży zestaw metod wywołania zwrotnego
w kolejnych sekcjach. pełną listę znajdziesz w dokumentacji VoiceInteractionSession
.
Wdrażanie procesu konfiguracji/logowania
Konfiguracja i logowanie mogą się odbywać:
- Podczas rejestrowania urządzenia (kreator konfiguracji).
- Podczas zmiany usługi interakcji głosowej (Ustawienia).
- Przy pierwszym uruchomieniu, gdy aplikacja jest wybrana.
Szczegółowe informacje na temat zalecanego komfortu użytkowania i wskazówek wizualnych znajdziesz w artykule Wstępnie załadowani asystenci: wskazówki UX.
Konfiguracja podczas zamiany usług głosowych
Użytkownik zawsze może wybrać interfejs VIA, który nie został poprawnie skonfigurowany. Możliwe powody:
- Użytkownik całkowicie pominął kreatora konfiguracji lub pominął głos konfiguracji interakcji.
- Użytkownik wybrał VIA inny niż ten skonfigurowany na urządzeniu .
VoiceInteractionService
ma kilka sposobów zachęcenia użytkownika
aby dokończyć konfigurację:
- Przypomnienie o powiadomieniu.
- Automatyczna odpowiedź głosowa, gdy użytkownik spróbuje jej użyć.
Uwaga: zdecydowanie odradzamy stosowanie procesu konfiguracji VIA. bez wyraźnej prośby użytkownika. Oznacza to, że ViA powinny automatycznie unikać wyświetlanie zawartości na wyświetlaczu HU podczas uruchamiania urządzenia lub w wyniku przełączenia urządzenia przez użytkownika lub odblokowywanie.
Przypomnienie o powiadomieniu
Przypomnienia to nienachalne powiadomienie o konieczności konfiguracji. i zapewnić użytkownikom dostęp do konfiguracji Asystenta przepływu danych.
Rysunek 2. Przypomnienie o powiadomieniu
Jak to działa:
Rysunek 3. Proces przypomnień o powiadomieniach
Odpowiedź głosowa
To najprostszy proces do wdrożenia, polegający na zainicjowaniu wypowiedzi w filmie,
wywołanie zwrotne VoiceInteractionSession#onShow()
z wyjaśnieniem użytkownikowi,
należy zrobić to, a następnie zapytać klienta (jeśli konfiguracja jest dozwolona ze względu na stan ograniczenia UX)
w celu rozpoczęcia procesu konfiguracji. Jeśli konfiguracja nie jest w danym momencie możliwa, wyjaśnij to.
do takiego przypadku.
Konfiguracja przy pierwszym użyciu
Użytkownik zawsze może wywołać VIA, który nie został prawidłowo skonfigurowany. W takich przypadkach:
- Słownie poinformuj użytkownika o tej sytuacji (na przykład: „Aby działać prawidłowo, Musisz wykonać kilka czynności... ”).
- Jeśli na to pozwala mechanizm ograniczeń UX (patrz UX_RESTRICTIONS_NO_CONFIG), zapytaj użytkownika, czy chce uruchomić a następnie otwórz ekran ustawień VIA.
- W przeciwnym razie (np. gdy użytkownik jedzie samochodem) możesz pozostawić kliknij tę opcję, gdy będzie można to bezpiecznie zrobić.
Tworzenie ekranów konfiguracji interakcji głosowej
Ekrany konfiguracji i logowania należy wprowadzać jako zwykłe działania. Zobacz Wskazówki UX i wizualne dotyczące programowania UI w Wstępnie załadowani asystenci: wskazówki UX.
Wytyczne ogólne:
- VIA powinny umożliwić użytkownikom przerwanie i wznawianie konfiguracji w dowolnym momencie.
- Konfiguracja nie powinna być dozwolona, jeśli obowiązuje ograniczenie
UX_RESTRICTIONS_NO_SETUP
. Więcej informacji: Wskazówki dotyczące rozpraszania uwagi kierowców - Ekrany konfiguracji powinny być zgodne z systemem projektowania poszczególnych pojazdów. Ekran ogólny układ, ikony, kolory i inne aspekty powinny być spójne z resztą interfejsu użytkownika. Zobacz Personalizacja .
Implementowanie ekranu ustawień
Rysunek 4. Integracja ustawień
Ekrany ustawień to standardowa aktywność w Androidzie. Jeśli są zaimplementowane, ich punkt wejścia
musi zostać zadeklarowana w res/xml/interaction_service.xml
w ramach VIA
plików manifestu (zobacz
Pliki manifestu).
W sekcji Ustawienia możesz kontynuować konfigurację i logowanie (jeśli użytkownik nie ukończył procesu)
) lub w razie potrzeby zaoferować opcję wylogowania się lub zmiany użytkownika. Podobnie jak w przypadku konfiguracji
opisane powyżej ekrany, powinny:
- Musi umożliwiać powrót do poprzedniego ekranu w grupie ekranów. (na przykład do ustawień samochodu).
- Niedozwolone podczas jazdy. Szczegółowe informacje znajdziesz w artykule Wskazówki dotyczące rozpraszania uwagi kierowcy.
- Dopasuj każdy system projektowy pojazdu. Więcej informacji: Dostosowywanie.
Zadeklaruj wymagane uprawnienia w pliku manifestu
Uprawnienia wymagane przez VIA można podzielić na 3 kategorie:
- Uprawnienia dotyczące podpisu systemu. To są uprawnienia przyznawane tylko wstępnie zainstalowanym, podpisanym przez system plikom APK. Użytkownicy nie mogą przyznawać uprawnień tych uprawnień, tylko producenci OEM mogą je przyznawać podczas tworzenia obrazów systemu. Więcej informacji o uzyskiwaniu uprawnień do podpisu znajdziesz w artykule Przyznawanie uprawnień z podwyższonymi uprawnieniami systemowymi.
- Niebezpieczne uprawnienia. Są to uprawnienia, które musi mieć użytkownik w oknie PermissionsController. OEM może wstępnie przyznać niektóre z tych do domyślnej usługi VoiceInteractionService. Biorąc jednak pod uwagę, że ten parametr domyślny może się zmieniać w zależności od urządzenia, aplikacje powinny mieć możliwość żądania tych żądań. gdy tylko są potrzebne.
- Inne uprawnienia. Są to wszystkie pozostałe uprawnienia, które nie wymagają interwencji użytkownika. Te uprawnienia są przyznawane automatycznie przez system.
Biorąc pod uwagę powyższe kwestie, poniższa sekcja skupia się wyłącznie na zgłaszaniu próśb niebezpiecznych uprawnień. O uprawnienia należy prosić tylko wtedy, gdy użytkownik jest: na ekranach logowania lub ustawień.
Jeśli aplikacja nie ma uprawnień wymaganych do działania, zalecaną metodą jest wypowiedzenie się przez ton, aby wyjaśnić sytuację oraz powiadomienie z informacją o ofercie, którą może wykorzystać wróć do ekranów ustawień VIA. Więcej informacji znajdziesz w sekcji 1. Przypomnienie o powiadomieniu.
Poproś o uprawnienia w ramach ekranu ustawień
Niebezpieczne uprawnienia są wysyłane za pomocą zwykłej metody ActivityCompat#requestPermission()
(lub jej odpowiednika). Szczegółowe informacje o tym, jak prosić o uprawnienia, znajdziesz w artykule
Poproś o uprawnienia aplikacji.
Rysunek 5. Poproś o uprawnienia
Uprawnienia nasłuchiwania powiadomień
Aby wdrożyć procedurę TTR, należy oznaczyć VIA jako detektor powiadomień. Nie jest to samo uprawnienie, ale Konfiguracja, która umożliwia systemowi wysyłanie powiadomień do zarejestrowanych słuchaczom. Aby dowiedzieć się, czy agencja VIA otrzymała dostęp do tych informacji, aplikacje mogą:
- (Opcjonalnie) Sprawdź wcześniej, czy istnieją detektory powiadomień, używając
CarAssistUtils#assistantIsNotificationListener()
Możesz to zrobić na przykład podczas konfiguracji. - (Wymagane) Zareaguj na element
CarVoiceInteractionSession#onShow()
za pomocą odpowiedniego działaniaVOICE_ACTION_HANDLE_EXCEPTION
i wyjątekEXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
.
Jeśli ten dostęp nie jest wstępnie przyznany, VIA powinien przekierować użytkownika do Sekcja Dostęp do powiadomień w Ustawieniach samochodu, która łączy polecenia głosowe i powiadomieniach. Za pomocą podanego niżej kodu można otworzyć odpowiednią sekcję Ustawienia aplikacji:
private void requestNotificationListenerAccess() { Intent intent = new Intent(Settings .ACTION_NOTIFICATION_LISTENER_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); startActivity(intent); }
Wdróż interfejs tablicy głosowej
Gdy VoiceInteractionSession
otrzyma wywołanie zwrotne typu onShow()
,
może prezentować interfejs tablicy głosowej. Wskazówki dotyczące wyglądu i wygody użytkownika dotyczące implementacji tablic głosowych znajdziesz w artykule
Wstępnie załadowani asystenci: wskazówki UX.
Rysunek 6. Wyświetlam tablicę głosową
Istnieją 2 opcje implementacji tego interfejsu użytkownika:
- Zastąp
VoiceInteractionSession#onCreateContentView()
- Uruchom ćwiczenie przy użyciu dodatku
VoiceInteractionSession#startAssistantActivity()
Używanie onCreateContentView()
To domyślny sposób prezentowania tablicy głosowej. VoiceInteractionSession
klasa bazowa tworzy okno i zarządza cyklem życia tak długo, jak głos
sesja jest żywa. Aplikacje muszą zastąpić regułę VoiceInteractionSession#onCreateContentView()
i zwrócenie widoku dołączonego do tego okna zaraz po zakończeniu sesji.
Utworzono. Taki widok powinien być początkowo niewidoczny. Po rozpoczęciu interakcji głosowej
ten widok powinien być widoczny w VoiceInteractionSession#onShow()
a potem znowu stanie się niewidoczny w VoiceInteractionSession#onHide()
.
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { private View mVoicePlate; … @Override public View onCreateContentView() { mVoicePlate = inflater.inflate(R.layout.voice_plate, null); … } @Override protected void onShow(String action, Bundle args, int showFlags) { // TODO: Update UI state to "listening" mVoicePlate.setVisibility(View.VISIBLE); } @Override public void onHide() { mVoicePlate.setVisibility(View.GONE); } … }
Jeśli korzystasz z tej metody, możesz dostosować VoiceInteractionSession#onComputeInsets()
aby uwzględnić ukryte obszary interfejsu.
Użyj startassistantActivity()
W takim przypadku VoiceInteractionSession
przekazuje dostęp do funkcji głosowych.
do standardowego działania. Gdy ta opcja jest używana, VoiceInteractionSession
musi wyłączyć tworzenie domyślnego okna treści (patrz Korzystanie z onCreateContentView()) na onPrepareShow()
oddzwanianie. O VoiceInteractionSession#onShow()
zostanie on uruchomiony w ramach sesji.
aktywność tablicowa przy użyciu: VoiceInteractionSession#startAssistantActivity()
. Ten
uruchamia interfejs użytkownika z odpowiednimi ustawieniami okien i flagami aktywności.
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { … @Override public void onPrepareShow(Bundle args, int showFlags) { super.onPrepareShow(args, showFlags); setUiEnabled(false); } @Override protected void onShow(String action, Bundle args, int showFlags) { closeSystemDialogs(); Intent intent = new Intent(getContext(), VoicePlateActivity.class); intent.putExtra(VoicePlateActivity.EXTRA_ACTION, action); intent.putExtra(VoicePlateActivity.EXTRA_ARGS, args); startAssistantActivity(intent); } … }
Aby utrzymać komunikację między tą aktywnością a
VoiceInteractionSession
, może to być zestaw wewnętrznych intencji lub powiązań usługi
Na przykład po wywołaniu funkcji VoiceInteractionSession#onHide()
parametr
sesja musi być w stanie przekazać to żądanie do aktywności.
Ważne. W sekcji Motoryzacja tylko specjalne adnotacje
działania lub działania wymienione na „liście dozwolonych” UXR mogą być wyświetlane podczas
podczas jazdy. Dotyczy to aktywności rozpoczętych od
VoiceInteractionSession#startAssistantActivity()
. Pamiętaj:
opisz swoją aktywność w <meta-data
android:name="distractionOptimized" android:value="true"/>
lub dołącz to
aktywność w kluczu systemActivityWhitelist
klucza /packages/services/Car/service/res/values/config.xml
. Więcej informacji można znaleźć w sekcji Kierowca
Wytyczne dotyczące rozpraszania uwagi.
Zastosuj rozpoznawanie głosu
W tej sekcji dowiesz się, jak wdrożyć rozpoznawanie głosu przez wykrywanie i rozpoznawania słów-kluczy. Słowo-klucz to słowo aktywujące, które pozwala rozpocząć nowe zapytanie. lub komendy głosowe. Na przykład „OK Google”. lub „OK Google”.
Wykrywanie słowa-klucza na DSP
Android zapewnia dostęp do zawsze włączonej funkcji wykrywania słów-kluczy na poziomie platformy DSP.
AlwaysOnHotwordDetector
.
jest sposobem wdrożenia wykrywania słów-kluczy o niskim CPU. Użycie tej funkcji jest
podzielone na 2 części:
- Tworzenie instancji
AlwaysOnHotwordDetector
. - Rejestracja modelu dźwięku wykrywania słowa-klucza.
Implementacja VoiceInteractionService może utworzyć wzorzec do wykrywania słów-kluczy, wykorzystując:
VoiceInteractionService#createAlwaysOnHotwordDetector()
,
podając hasło i język, który ma być używany do wykrywania. W rezultacie
aplikacja otrzymuje onAvailabilityChanged()
wywołanie zwrotne z jedną z tych możliwych wartości:
STATE_HARDWARE_UNAVAILABLE
Funkcje platformy DSP nie są dostępne urządzenia. W tym przypadku wykorzystywane jest programowe wykrywanie słowa-klucza.STATE_HARDWARE_UNSUPPORTED
Obsługa DSP jest ogólnie niedostępna, ale Platforma DSP nie obsługuje danej kombinacji wyrażeń kluczowych i języków. Aplikacja może zdecydować się na używanie Wykrywanie słowa-klucza w oprogramowaniu.STATE_HARDWARE_ENROLLED
Wykrywanie słów kluczowych jest gotowe i można je włączyć za pomocą metodystartRecognition()
.STATE_HARDWARE_UNENROLLED
Model dźwięku dla żądanego wyrażenia kluczowego nie jest jest dostępna, ale można się zarejestrować.
Modele dźwięku wykrywania słowa-klucza można zarejestrować za pomocą programu IVoiceInteractionManagerService#updateKeyphraseSoundModel()
.
W systemie może być jednocześnie zarejestrowanych wiele modeli, ale tylko jeden
model jest powiązany z kolumną AlwaysOnHotwordDetector
.
Wykrywanie słowa-klucza na DSP może nie być dostępne na wszystkich urządzeniach. Deweloperzy VIA
powinien sprawdzić możliwości sprzętowe za pomocą getDspModuleProperties()
. Pokazuję przykładowy kod
jak zarejestrować modele dźwięku, zobacz VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java
.
Zobacz Jednoczesne przechwytywanie dotyczące:
równoczesnego rozpoznawania słów-kluczy.
Wykrywanie słowa-klucza w oprogramowaniu
Jak wspomnieliśmy powyżej, wykrywanie słowa-klucza na platformach DSP może być niedostępne w niektórych urządzeń (na przykład emulator Androida nie obsługuje emulacji DSP). W tym przypadku programowe rozpoznawanie głosu jest jedyną alternatywą. Aby uniknąć zakłócania działania innych w przypadku aplikacji, które mogą potrzebować dostępu do mikrofonu, interfejsy VIA muszą mieć dostęp do wejścia audio za pomocą:
- Przechwytywanie dźwięku musi być możliwe przy użyciu klasy MediaRecorder.AudioSource.HOTWORD.
- Przyznaj uprawnienie
android.Manifest.permission.CAPTURE_AUDIO_HOTWORD
.
Obie te stałe wartości mają wartość @hide
i są dostępne tylko w przypadku aplikacji w pakiecie.
Zarządzanie rozpoznawaniem dźwięku i rozpoznawaniem głosu
Dane wejściowe audio można zaimplementować za pomocą klasy MediaRecorder.
Więcej informacji o korzystaniu z tego interfejsu API znajdziesz w sekcji MediaRecorder
Przegląd. Usługi interakcji głosowej powinny być też dostępne w wersji RecognitionService
i klasach. Każda aplikacja w systemie, która wymaga rozpoznawania głosu, używa
na dostęp do tej funkcji. Aby obsługiwać rozpoznawanie głosu i mieć dostęp do mikrofonu, ViA
musi zawierać android.permission.RECORD_AUDIO
.
Aplikacje uzyskujące dostęp do: RecognitionService
implementacja również powinna mieć to uprawnienie.
Przed Androidem 10 dostęp do mikrofonu był przyznawany tylko jednej aplikacji (z wyjątkiem wykrywania słowa-klucza, patrz wyżej). Od Androida 10 dostęp do mikrofonu można przyznać. Więcej informacji na ten temat można znaleźć w sekcji Udostępnianie Wejście audio.
Dostęp do wyjścia audio
Gdy VIA jest gotowe do udzielania ustnych odpowiedzi, należy: przestrzegaj tych zaleceń:
- Podczas wysyłania prośby o zaznaczenie lub zarządzania wyjściem audio aplikacja
musi używać atrybutów audio
AudioAttributes#USAGE_ASSISTANT
iAudioAttributes#CONTENT_TYPE_SPEECH
. - Podczas rozpoznawania mowy urządzenie
AudioManage#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
wymaga włączenia ostrości dźwięku. Pamiętaj, że niektóre aplikacje do multimediów mogą nie reagować prawidłowo na polecenia multimedialne (patrz Fulfilling Media Commands) podczas odtwarzania dźwięku zaznaczenie zostanie usunięte.