So implementieren Sie eine Voice Interaction Application (VIA):
- Erstellen Sie ein VIA-Skelett.
- Optional: Implementieren Sie einen Einrichtungs-/Anmeldeprozess.
- Optional: Implementieren Sie einen Einstellungsbildschirm.
- Deklariere die erforderlichen Berechtigungen in der Manifestdatei.
- Implementieren Sie eine Sprachplatten-UI.
- Spracherkennung implementieren (muss die RecognitionService API-Implementierung umfassen).
- Äußerungen implementieren (optional können Sie die TextToSpeech API implementieren)
- Implementieren Sie die Befehlsausführung. Diese Inhalte ansehen in Auffüllende Befehle.
In den folgenden Abschnitten wird beschrieben, wie Sie die oben genannten Schritte ausführen.
VIA-Skelett erstellen
Manifeste
Eine App wird als eine mit Sprachinteraktion erkannt, wenn Folgendes zutrifft: im Manifest enthalten:
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>
In diesem Beispiel gilt Folgendes:
- VIAs müssen einen Dienst verfügbar machen, der
VoiceInteractionService
erweitert, mit Intent-Filter für die AktionVoiceInteractionService.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService")
. - Dieser Dienst muss die Systemsignaturberechtigung
BIND_VOICE_INTERACTION
enthalten. - Dieser Dienst sollte eine
android.voice_interaction
-Metadatendatei enthalten enthält Folgendes:res/xml/interaction_service.xml
<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" />
Weitere Informationen zu den einzelnen Feldern finden Sie unter R.styleable#VoiceInteractionService
.
Da alle VIAs auch Spracherkennungsdienste sind, müssen Sie
Folgendes in dein Manifest aufnehmen:
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>
Spracherkennungsdienste benötigen außerdem die folgenden Metadaten:
res/xml/recognition_service.xml
<recognition-service xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.MyRecognizerSettingsActivity" />
VoiceInteractionService, VoiceInteractionSessionService und VoiceInteractionSession
Das folgende Diagramm zeigt den Lebenszyklus jeder dieser Entitäten:
Abbildung 1: Lebenszyklen
Wie bereits erwähnt, ist VoiceInteractionService
der Einstiegspunkt
an eine VIA. Die Hauptaufgaben dieses Dienstes sind:
- Alle Prozesse initialisieren, die noch so lange ausgeführt werden sollen Diese VIA ist die aktive. Zum Beispiel die Hotword-Erkennung.
- Meldet unterstützte Sprachbedienungsbefehle (siehe Sprachassistent "Zum Lesen tippen").
- Sprachinteraktionssitzungen über den Sperrbildschirm starten (Keyguard).
In der einfachsten Form sieht eine VoiceInteractionService-Implementierung so aus: wie hier:
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; } ... }
Die Implementierung von VoiceInteractionService#onGetSupportedVoiceActions()
ist
für die Verarbeitung
Sprachassistent „Tap-to-Read“.
Ein VoiceInteractionSessionService wird vom System verwendet, um
mit einer VoiceInteractionSession interagieren können. Es hat nur eine Aufgabe,
um auf Anfrage neue Sitzungen zu starten.
public class MyVoiceInteractionSessionService extends VoiceInteractionSessionService { @Override public VoiceInteractionSession onNewSession(Bundle args) { return new MyVoiceInteractionSession(this); } }
Schließlich arbeitet eine VoiceInteractionSession
was getan werden würde. Eine einzelne Sitzungsinstanz kann wiederverwendet werden, um mehrere
Nutzerinteraktionen. In AAOS ist ein CarVoiceInteractionSession
-Hilfsprogramm vorhanden,
bei der Umsetzung einiger
spezieller Funktionen für die Automobilbranche.
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
verfügt über eine große Anzahl von Callback-Methoden, die
die in den folgenden Abschnitten erläutert wird. finden Sie in der Dokumentation zu VoiceInteractionSession
eine vollständige Liste.
Einrichtungs-/Anmeldevorgang implementieren
Einrichtung und Anmeldung können an folgenden Stellen stattfinden:
- Während des Geräte-Onboardings (Einrichtungsassistent).
- Beim Austausch des Sprachinteraktionsdienstes (Einstellungen)
- Beim ersten Start, wenn die App ausgewählt wird.
Weitere Informationen zur empfohlenen Nutzererfahrung und eine visuelle Anleitung finden Sie unter Vorinstallierte Assistenten: UX-Anleitung.
Einrichtung beim Austausch des Sprachdienstes
Der Nutzer kann immer eine VIA auswählen, die nicht korrekt konfiguriert. Das kann folgende Gründe haben:
- Der Nutzer hat den Einrichtungsassistenten komplett übersprungen oder die Stimme übersprungen. für die Interaktion.
- Der Nutzer hat eine VIA, die nicht auf dem Gerät konfiguriert wurde, ausgewählt. .
Auf jeden Fall bietet ein VoiceInteractionService
mehrere Möglichkeiten, den Nutzer zu ermutigen,
um die Einrichtung abzuschließen:
- Benachrichtigungserinnerung.
- Automatische Sprachantwort, wenn der Nutzer versucht, sie zu verwenden
Hinweis: Wir raten dringend davon ab, eine ViA-Einrichtung zu präsentieren. ohne explizite Nutzeranfrage. Das bedeutet, dass View-through-Conversions automatisch Anzeige von Inhalten auf der HU während des Gerätestarts oder als Folge eines Nutzerwechsels oder entsperren.
Benachrichtigungserinnerung
Eine Benachrichtigungserinnerung ist eine unaufdringliche Möglichkeit, um auf die Notwendigkeit einer Einrichtung hinzuweisen, und den Nutzern die Möglichkeit bieten, die Assistant-Einrichtung aufzurufen. Ablauf.
Abbildung 2: Benachrichtigungserinnerung
So würde dieser Ablauf funktionieren:
Abbildung 3: Ablauf für Erinnerungsbenachrichtigungen
Sprachantwort
Dies ist der einfachste Ablauf, bei dem eine Äußerung
VoiceInteractionSession#onShow()
-Callback, der dem Nutzer erklärt,
ausgeführt werden muss, und fragen Sie ihn dann (falls die Einrichtung gemäß dem Status der UX-Einschränkung erlaubt ist).
wenn sie mit der Einrichtung beginnen möchten. Wenn die Einrichtung derzeit nicht möglich ist, erklären Sie dies
Situation zu berücksichtigen.
Bei der ersten Verwendung einrichten
Der Nutzer kann immer eine VIA auslösen, die nicht ordnungsgemäß konfiguriert. Gehen Sie in solchen Fällen wie folgt vor:
- Informieren Sie die Nutzenden mündlich über die Situation (z. B. „Um richtig zu funktionieren, Bitte führen Sie einige Schritte aus ...").
- Wenn das UX-Einschränkungsmodul dies zulässt (siehe UX_RESTRICTIONS_NO_SETUP), fragen Sie den Nutzer, ob er die und anschließend den Bildschirm "Einstellungen" für VIA.
- Andernfalls (z. B. wenn der Nutzer gerade mit dem Auto fährt) eine Benachrichtigung klicken Sie auf die Option, wenn dies gefahrlos möglich ist.
Einrichtungsbildschirme für Sprachinteraktionen erstellen
Die Einrichtungs- und die Anmeldebildschirm sollten als normale Aktivitäten entwickelt werden. Weitere Informationen finden Sie in der UX- und visuelle Richtlinien für die UI-Entwicklung in Vorinstallierte Assistenten: UX-Anleitung.
Allgemeine Richtlinien:
- VIAs sollten es Nutzern ermöglichen, die Einrichtung jederzeit zu unterbrechen und fortzusetzen.
- Die Einrichtung sollte nicht erlaubt werden, wenn die Einschränkung „
UX_RESTRICTIONS_NO_SETUP
“ gilt. Weitere Informationen finden Sie unter Richtlinien zur Ablenkung von Fahrern - Die Einrichtungsbildschirme sollten dem Designsystem des jeweiligen Fahrzeugs entsprechen. Allgemeiner Bildschirm Layout, Symbole, Farben und andere Aspekte sollten mit dem Rest der Benutzeroberfläche übereinstimmen. Weitere Informationen finden Sie unter Anpassung .
Einstellungsbildschirm implementieren
Abbildung 4: Integration von Einstellungen
Einstellungsbildschirme sind normale Android-Aktivitäten. Der Einstiegspunkt bei der Implementierung
muss im res/xml/interaction_service.xml
als Teil der VIA angegeben werden
Manifests (siehe
Manifeste).
Im Bereich „Einstellungen“ können Sie mit der Einrichtung fortfahren und sich anmelden (falls der Nutzer die Einrichtung nicht abgeschlossen hat).
oder biete bei Bedarf die Option Abmelden oder Nutzer wechseln an. Ähnlich wie bei der Einrichtung
oben beschriebenen Bildschirmen sollten diese Bildschirme:
- Option zum Verlassen des vorherigen Bildschirms im Bildschirmstapel anbieten z. B. „Autoeinstellungen“.
- Während der Fahrt nicht gestattet. Weitere Informationen finden Sie in den Richtlinien zur Ablenkung von Fahrern.
- Ordnen Sie jedem Fahrzeugdesignsystem zu. Weitere Informationen finden Sie unter Anpassung:
Deklariere die erforderlichen Berechtigungen in der Manifestdatei
Berechtigungen, die für eine VIA erforderlich sind, lassen sich in drei Kategorien unterteilen:
- Berechtigungen für Systemsignatur: Dies sind Berechtigungen wird nur vorinstallierten, vom System signierten APKs gewährt. Nutzer können Folgendes nicht gewähren: Berechtigungen können nur OEMs bei der Erstellung ihrer System-Images erteilen. Weitere Informationen zum Abrufen von Signaturberechtigungen finden Sie unter Systemprivilegierte Berechtigungen gewähren.
- Gefährliche Berechtigungen. Dies sind Berechtigungen, die ein Nutzer Berechtigungszuweisung mithilfe des Dialogfelds „PermissionsController“ erteilen. OEMs können einige dieser Berechtigungen für den Standard-VoiceInteractionService. Da diese Standardeinstellung von Gerät zu Gerät ändern können, sollten Apps diese anfordern können. Berechtigungen erteilen.
- Andere Berechtigungen: Dies sind alle anderen Berechtigungen, kein Eingreifen des Nutzers erforderlich. Diese Berechtigungen werden automatisch gewährt, durch das System.
Vor diesem Hintergrund geht es im folgenden Abschnitt nur darum, gefährliche Berechtigungen. Berechtigungen sollten nur angefordert werden, wenn der Nutzer auf dem Anmelde- oder Einstellungsbildschirm.
Wenn die App nicht über die erforderlichen Berechtigungen verfügt, empfohlenen Ablauf ist, dem Kunden mit einer Sprachäußerung die Situation zu erklären. Nutzer und eine Benachrichtigung, um ein Angebot bereitzustellen, mit dem der Nutzer zurück zu den VIA-Einstellungsbildschirmen. Weitere Informationen finden Sie unter 1. Benachrichtigungserinnerung:
Berechtigungen über den Einstellungsbildschirm anfordern
Gefährliche Berechtigungen werden mit der regulären ActivityCompat#requestPermission()
-Methode (oder einer vergleichbaren Methode) angefordert. Weitere Informationen zum Anfordern von Berechtigungen finden Sie unter
App-Berechtigungen anfordern
Abbildung 5: Berechtigungen anfordern
Berechtigung für Benachrichtigungs-Listener
Um den TTR-Ablauf zu implementieren, müssen VIAs als Benachrichtigungs-Listener. Dies ist keine Berechtigung an sich, sondern Konfiguration, mit der das System Benachrichtigungen an registrierte zu hören. Um zu erfahren, ob VIA Zugriff auf diese Informationen erhalten hat, Apps können:
- (Optional) Prüfen Sie vorab, ob Benachrichtigungs-Listener vorhanden sind. Verwenden Sie dazu
CarAssistUtils#assistantIsNotificationListener()
Das kann beispielsweise während der Einrichtung erfolgen. - (Obligatorisch) Reaktion auf die Verarbeitung von
CarVoiceInteractionSession#onShow()
mit AktionVOICE_ACTION_HANDLE_EXCEPTION
und AusnahmeEXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
.
Wenn dieser Zugriff nicht im Voraus gewährt wird, sollte die VIA den Nutzer zum Bereich „Benachrichtigungszugriff“ in den Autoeinstellungen über eine Kombination von Äußerungen und Benachrichtigungen. Mit dem folgenden Code können Sie den entsprechenden Abschnitt der Datei Einstellungen-App:
private void requestNotificationListenerAccess() { Intent intent = new Intent(Settings .ACTION_NOTIFICATION_LISTENER_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); startActivity(intent); }
Sprachplatten-UI implementieren
Wenn ein VoiceInteractionSession
einen onShow()
-Callback empfängt,
kann es eine Benutzeroberfläche
für ein Unterhaltungsfenster anzeigen. Visuelle und UX-Richtlinien zur Implementierung von Sprachplatten finden Sie unter
Vorinstallierte Assistenten: UX-Anleitung.
Abbildung 6: Unterhaltungsfenster wird angezeigt
Es gibt zwei Möglichkeiten, diese UI zu implementieren:
VoiceInteractionSession#onCreateContentView()
überschreiben- Eine Aktivität mit
VoiceInteractionSession#startAssistantActivity()
starten
onCreateContentView() verwenden
Das ist die Standardmethode für die Präsentation eines Unterhaltungsfensters. Das VoiceInteractionSession
erstellt ein Fenster und verwaltet dessen Lebenszyklus so lange wie eine Stimme
Sitzung aktiv ist. Apps müssen VoiceInteractionSession#onCreateContentView()
überschreiben
Sobald die Sitzung abgeschlossen ist,
wird eine Datenansicht zurückgegeben, die diesem Fenster zugeordnet ist.
erstellt. Diese Ansicht sollte zunächst unsichtbar sein. Wenn eine Sprachinteraktion beginnt,
Diese Ansicht sollte am VoiceInteractionSession#onShow()
sichtbar gemacht werden.
und dann wieder auf VoiceInteractionSession#onHide()
wieder unsichtbar.
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); } … }
Wenn Sie diese Methode verwenden, können Sie VoiceInteractionSession#onComputeInsets()
anpassen
um verdeckte Bereiche Ihrer Benutzeroberfläche zu berücksichtigen.
startAssistantActivity() verwenden
In diesem Fall delegiert VoiceInteractionSession
die Verwaltung der Stimme.
mit einer normalen Aktivität verknüpfen. Bei Verwendung dieser Option wird ein VoiceInteractionSession
Durch die Implementierung muss die Erstellung des Standardinhaltsfensters deaktiviert werden (siehe onCreateContentView() verwenden) auf der onPrepareShow()
Callback des Nutzers an. Um VoiceInteractionSession#onShow()
würde die Sitzung die Stimme starten
Kennzeichen für Aktivitäten mit VoiceInteractionSession#startAssistantActivity()
. Dieses
-Methode initiiert die Benutzeroberfläche mit den richtigen Fenstereinstellungen und Aktivitäts-Flags.
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); } … }
Um die Kommunikation zwischen dieser Aktivität und dem
VoiceInteractionSession
hat, kann eine Reihe interner Intents oder Dienstbindungen
erforderlich. Wenn beispielsweise VoiceInteractionSession#onHide()
aufgerufen wird, gibt der Parameter
Sitzung in der Lage sein, diese Anfrage an die Aktivität zu übergeben.
Wichtig. In der Automobilbranche, nur speziell gekennzeichnet
Aktivitäten oder Aktivitäten, die auf der Zulassungsliste für UXRs aufgeführt sind kann angezeigt werden, während
im Auto. Dies gilt für Aktivitäten, die mit
VoiceInteractionSession#startAssistantActivity()
. Denken Sie daran:
Ihre Aktivitäten entweder mit <meta-data
android:name="distractionOptimized" android:value="true"/>
vermerken oder angeben
Aktivität im systemActivityWhitelist
-Schlüssel des /packages/services/Car/service/res/values/config.xml
-Datei. Weitere Informationen finden Sie unter Treiber
Richtlinien zur Ablenkung.
Spracherkennung implementieren
In diesem Abschnitt erfahren Sie, wie Sie mithilfe der und die Erkennung von Hotwords. Ein Hotword ist ein Triggerwort, mit dem eine neue Suchanfrage gestartet wird. oder per Spracheingabe interagieren. Beispiel: „Hey Google“ oder „Hey Google“.
DSP-Hotword-Erkennung
Android bietet Zugriff auf einen immer aktiven Hotword-Detektor auf DSP-Ebene,
der AlwaysOnHotwordDetector
.
die Hotword-Erkennung mit geringer CPU-Leistung implementieren. Die Verwendung dieser Funktion
in zwei Teile gegliedert:
- Instanziierung einer
AlwaysOnHotwordDetector
. - Registrierung eines Tonmodells für die Hotword-Erkennung.
Die Implementierung von VoiceInteractionService
kann einen Hotword-Detektor erstellen,
VoiceInteractionService#createAlwaysOnHotwordDetector()
,
Schlüsselwort und Sprache für die Erkennung übergeben. Daher
App erhält ein onAvailabilityChanged()
Callback mit einem der folgenden möglichen Werte:
STATE_HARDWARE_UNAVAILABLE
Die DSP-Funktion ist auf der . In diesem Fall wird die Software-Hotword-Erkennung verwendet.STATE_HARDWARE_UNSUPPORTED
DSP-Unterstützung ist nicht allgemein verfügbar. Die DSP unterstützt die vorgegebene Kombination aus Schlüsselwort und Sprache nicht. Die App kann die Software-Hotword-Erkennung:STATE_HARDWARE_ENROLLED
Die Schlagworterkennung ist bereit und kann gestartet werden durch durch Aufrufen der MethodestartRecognition()
.STATE_HARDWARE_UNENROLLED
Ein Tonmodell für den angeforderten Suchbegriff ist nicht verfügbar, aber eine Registrierung ist möglich.
Die Registrierung von Geräuschmodellen für die Hotword-Erkennung kann mit IVoiceInteractionManagerService#updateKeyphraseSoundModel()
erfolgen.
Es können mehrere Modelle gleichzeitig im System registriert werden, aber nur eines.
Modell mit einer AlwaysOnHotwordDetector
verknüpft ist.
Die DSP-Hotword-Erkennung ist möglicherweise nicht auf allen Geräten verfügbar. ÜBER DEIN ENTWICKLER
sollte die Hardwarefunktionen mit getDspModuleProperties()
prüfen
. Für Beispielcode, der zeigt,
Informationen zum Registrieren von Soundmodellen findest du unter VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java
.
Siehe Gleichzeitige Aufnahme zu
gleichzeitige Hotword-Erkennung.
Software-Hotword-Erkennung
Wie oben erwähnt, ist die DSP-Hotword-Erkennung möglicherweise nicht Geräte. Der Android-Emulator bietet keine DSP-Emulation. In diesem Fall Software zur Spracherkennung ist die einzige Alternative. Um zu vermeiden, dass andere Apps, die möglicherweise Zugriff auf das Mikrofon benötigen, müssen ViAs folgendermaßen auf die Audioeingabe zugreifen:
- Für die Aufnahme von Audio muss MediaRecorder.AudioSource.HOTWORD verwendet werden.
- Berechtigung „
android.Manifest.permission.CAPTURE_AUDIO_HOTWORD
“ halten.
Beide Konstanten sind @hide
und nur für gebündelte Anwendungen verfügbar.
Audioeingabe und Spracherkennung verwalten
Die Audioeingabe wird mithilfe der MediaRecorder-Klasse implementiert.
Weitere Informationen zur Verwendung dieser API finden Sie unter MediaRecorder
Übersicht. Sprachinteraktionsdienste werden ebenfalls erwartet: RecognitionService
Klassenimplementierungen. Jede App im System, die Spracherkennung erfordert, verwendet die
um auf diese Funktion zuzugreifen. Für die Spracherkennung und Zugriff auf das Mikrofon benötigen Sie Folgendes:
muss android.permission.RECORD_AUDIO
enthalten.
Apps, die auf ein RecognitionService
zugreifen
Implementierung diese Berechtigung ebenfalls enthalten.
Vor Android 10 wurde jeweils nur einer App der Mikrofonzugriff gewährt. (mit Ausnahme der Hotword-Erkennung, siehe oben). Ab Android 10 Mikrofonzugriff kann freigegeben werden. Weitere Informationen finden Sie unter Freigabe Audioeingabe.
Auf Audioausgabe zugreifen
Wenn der VIA für mündliche Antworten bereit ist, ist es wichtig, halten Sie sich an die folgenden Richtlinien:
- Wenn Sie den Audiofokus anfordern oder die Audioausgabe verwalten,
AudioAttributes#USAGE_ASSISTANT
undAudioAttributes#CONTENT_TYPE_SPEECH
müssen als Audioattribute verwendet werden. - Bei der Spracherkennung muss der Audiofokus mit
AudioManage#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
angefordert werden. Beachten Sie, dass einige Medien-Apps möglicherweise nicht richtig auf Medienbefehle reagieren (siehe Auftragsausführung) während der Audiowiedergabe wird der Fokus entfernt.