App-Entwicklung

So implementieren Sie eine Voice Interaction Application (VIA):

  1. Erstellen Sie ein VIA-Skelett.
  2. Optional: Implementieren Sie einen Einrichtungs-/Anmeldeprozess.
  3. Optional: Implementieren Sie einen Einstellungsbildschirm.
  4. Deklariere die erforderlichen Berechtigungen in der Manifestdatei.
  5. Implementieren Sie eine Sprachplatten-UI.
  6. Spracherkennung implementieren (muss die RecognitionService API-Implementierung umfassen).
  7. Äußerungen implementieren (optional können Sie die TextToSpeech API implementieren)
  8. 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 Aktion VoiceInteractionService.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:

Lebenszyklen

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.

Benachrichtigungserinnerung

Abbildung 2: Benachrichtigungserinnerung

So würde dieser Ablauf funktionieren:

Ablauf für Erinnerungsbenachrichtigungen

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:

  1. Informieren Sie die Nutzenden mündlich über die Situation (z. B. „Um richtig zu funktionieren, Bitte führen Sie einige Schritte aus ...").
  2. 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.
  3. 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

Integration von Einstellungen

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

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:

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.

Unterhaltungsfenster wird angezeigt

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:

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 Methode startRecognition().
  • 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:

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: