Freigeben über


Implementieren von Sprachassistenten unter Windows

In dieser Anleitung werden wichtige Implementierungsdetails für die Erstellung eines Sprachassistenten unter Windows beschrieben.

Implementieren der Sprachaktivierung

Nachdem Sie die Umgebung eingerichtet und sich mit der Funktionsweise der Sprachaktivierung vertraut gemacht haben, können Sie damit beginnen, die Sprachaktivierung für Ihren eigenen Sprachassistenten zu implementieren.

Registrierung

Sicherstellen der Verfügbarkeit und Zugänglichkeit des Mikrofons und Überwachen des Status

Bei MVA muss ein Mikrofon vorhanden und zugänglich sein, damit eine Sprachaktivierung erkannt werden kann. Verwenden Sie die Klassen AppCapability, DeviceWatcher und MediaCapture, um den Datenschutz in Bezug auf den Zugriff auf das Mikrofon, das Vorhandensein des Geräts und den Gerätestatus (z. B. Lautstärke und Stummschaltung) zu überprüfen.

Registrieren der Anwendung beim Hintergrunddienst

Damit MVA die Anwendung im Hintergrund starten kann, muss sie beim Hintergrunddienst registriert sein. Einen vollständigen Leitfaden zur Registrierung beim Hintergrunddienst finden Sie hier.

Entsperren des Features für eingeschränkten Zugriff

Verwenden Sie den von Microsoft bereitgestellten Schlüssel für das Feature für eingeschränkten Zugriff, um die Funktion für den Sprachassistenten zu entsperren. Nutzen Sie hierfür die LimitedAccessFeature-Klasse aus dem Windows SDK.

Registrieren des Schlüsselworts für die Anwendung

Die Anwendung muss sich selbst, das Schlüsselwortmodell und die zugehörige Sprache bei Windows registrieren.

Rufen Sie zunächst das Erkennungsmodul für Schlüsselwörter ab. In diesem Beispielcode rufen wir das erste Erkennungsmodul ab, aber Sie können über configurableDetectors auch ein bestimmtes Erkennungsmodul auswählen.

private static async Task<ActivationSignalDetector> GetFirstEligibleDetectorAsync()
{
    var detectorManager = ConversationalAgentDetectorManager.Default;
    var allDetectors = await detectorManager.GetAllActivationSignalDetectorsAsync();
    var configurableDetectors = allDetectors.Where(candidate => candidate.CanCreateConfigurations
        && candidate.Kind == ActivationSignalDetectorKind.AudioPattern
        && (candidate.SupportedModelDataTypes.Contains("MICROSOFT_KWSGRAPH_V1")));

    if (configurableDetectors.Count() != 1)
    {
        throw new NotSupportedException($"System expects one eligible configurable keyword spotter; actual is {configurableDetectors.Count()}.");
    }

    var detector = configurableDetectors.First();

    return detector;
}

Rufen Sie nach dem Abrufen des ActivationSignalDetector-Objekts die zugehörige ActivationSignalDetector.CreateConfigurationAsync-Methode mit Signal-ID, Modell-ID und Anzeigename ab, um Ihr Schlüsselwort zu registrieren und das ActivationSignalDetectionConfiguration-Element Ihrer Anwendung abzurufen. Bei der Signal- und der Modell-ID sollte es sich um GUIDs handeln, die vom Entwickler festgelegt und für ein Schlüsselwort dann nicht mehr geändert werden.

Überprüfen, ob die Einstellung für die Sprachaktivierung aktiviert ist

Um die Sprachsteuerung nutzen zu können, muss ein Benutzer bzw. eine Benutzerin die Sprachsteuerung für sein bzw. ihr System und seine bzw. ihre Anwendung aktivieren. Sie finden die entsprechende Einstellung in den Windows-Einstellungen unter den „Datenschutzeinstellungen für die Sprachaktivierung“. Verwenden Sie die Instanz von ActivationSignalDetectionConfiguration, die Sie beim Registrieren des Schlüsselworts genutzt haben, um den Status der Einstellung für die Sprachaktivierung in Ihrer Anwendung zu überprüfen. Das Feld AvailabilityInfo unter ActivationSignalDetectionConfiguration enthält einen Enumerationswert, der den Status der Einstellung für die Sprachaktivierung beschreibt.

Abrufen von „ConversationalAgentSession“ zum Registrieren der App beim MVA-System

ConversationalAgentSession ist eine Klasse im Windows SDK, mit der Ihre App den App-Status (Leerlauf, Erkennen, Lauschen, Arbeiten, Sprechen) für Windows aktualisieren und Ereignisse empfangen kann, z. B. Aktivierungserkennung und Systemstatusänderungen wie das Sperren des Bildschirms. Das Abrufen einer Instanz von „AgentSession“ dient auch zum Registrieren der Anwendung bei Windows als „aktivierbar per Sprache“. Die bewährte Methode besteht darin, einen Verweis auf ConversationalAgentSession zu verwenden. Verwenden Sie die ConversationalAgentSession.GetCurrentSessionAsync-API, um die Sitzung abzurufen.

Lauschen auf die beiden Aktivierungssignale: „OnBackgroundActivated“ und „OnSignalDetected“

Windows signalisiert Ihrer App, wenn auf eine der beiden Arten ein Schlüsselwort erkannt wird. Falls die App nicht aktiv ist (d. h. kein Verweis auf eine nicht geschlossene Instanz von ConversationalAgentSession vorhanden ist), wird Ihre App gestartet und die OnBackgroundActivated-Methode in der Datei „App.xaml.cs“ Ihrer Anwendung aufgerufen. Wenn das Feld BackgroundActivatedEventArgs.TaskInstance.Task.Name der Ereignisargumente mit der Zeichenfolge „AgentBackgroundTrigger“ übereinstimmt, wurde der Start der Anwendung per Sprachaktivierung ausgelöst. Die Anwendung muss diese Methode außer Kraft setzen und eine Instanz von „ConversationalAgentSession“ abrufen, um für Windows zu signalisieren, dass sie jetzt aktiv ist. Wenn die Anwendung aktiv ist, signalisiert Windows mit dem Ereignis ConversationalAgentSession.OnSignalDetected das Auftreten einer Sprachaktivierung. Fügen Sie diesem Ereignis einen Ereignishandler hinzu, sobald Sie ConversationalAgentSession abgerufen haben.

Schlüsselwortüberprüfung

Nachdem eine Sprach-Agent-Anwendung per Sprache aktiviert wurde, wird im nächsten Schritt überprüft, ob die Schlüsselworterkennung gültig war. Windows bietet keine Lösung zur Überprüfung von Schlüsselwörtern, aber es erlaubt Sprachassistenten, auf die Audiodaten der vermuteten Aktivierung zuzugreifen und die Überprüfung eigenständig durchzuführen.

Abrufen der Audiodaten für die Aktivierung

Erstellen Sie ein AudioGraph-Element, und übergeben Sie es an das CreateAudioDeviceInputNodeAsync-Element von ConversationalAgentSession. Dadurch wird der Audiopuffer des Graphen mit den Audiodaten geladen, die etwa 3 Sekunden vor der Erkennung des Schlüsselworts beginnen. Dieser Vorlauf wird für die Audiodaten verwendet, um unterschiedliche Schlüsselwortlängen und Sprechgeschwindigkeiten abzudecken. Verarbeiten Sie anschließend das QuantumStarted-Ereignis des Audiographen, um die Audiodaten abzurufen.

var inputNode = await agentSession.CreateAudioDeviceInputNodeAsync(audioGraph);
var outputNode = inputGraph.CreateFrameOutputNode();
inputNode.AddOutgoingConnection(outputNode);
audioGraph.QuantumStarted += OnQuantumStarted;

Hinweis: Dieser Vorabzeitraum mit Audiodaten im Audiopuffer kann dazu führen, dass für die Schlüsselwortüberprüfung ein Fehler auftritt. Sie können dieses Problem beheben, indem Sie den Anfang der Daten im Audiopuffer abschneiden, bevor Sie die Audiodaten an die Schlüsselwortüberprüfung absenden. Dieses Abschneiden der Anfangsdaten sollte auf jeden Assistenten speziell zugeschnitten werden.

Starten im Vordergrund

Wenn die Überprüfung des Schlüsselworts erfolgreich ist, muss die Anwendung in den Vordergrund verschoben werden, damit die Benutzeroberfläche sichtbar ist. Rufen Sie die ConversationalAgentSession.RequestForegroundActivationAsync-API auf, um Ihre Anwendung in den Vordergrund zu verschieben.

Übergang von der Kompakt- zur Vollansicht

Wenn Ihre Anwendung zum ersten Mal per Sprache aktiviert wird, wird sie in der Kompaktansicht gestartet. Informationen zu den verschiedenen Ansichten und den entsprechenden Übergängen für Sprachassistenten unter Windows finden Sie unter Entwurfsleitfaden für Sprachaktivierungsvorschau.

Verwenden Sie die ApplicationView-API TryEnterViewModeAsync, um den Übergang von der Kompaktansicht zur vollständigen App-Ansicht durchzuführen:

var appView = ApplicationView.GetForCurrentView();
await appView.TryEnterViewModeAsync(ApplicationViewMode.Default);

Implementieren der Aktivierung der Anzeige oberhalb des Sperrbildschirms

Mit den folgenden Schritten wird für einen Sprachassistenten unter Windows die Anzeige oberhalb des Sperrbildschirms aktiviert. Sie enthalten zudem Verweise auf Beispielcode und Richtlinien zur Verwaltung des Anwendungslebenszyklus.

Informationen zum Entwerfen der Anzeige oberhalb des Sperrbildschirms finden Sie im Leitfaden zu den bewährten Methoden.

Wenn eine App eine Ansicht über dem Sperrbildschirm anzeigt, wird dies als „Kioskmodus“ bezeichnet. Weitere Informationen zur Implementierung einer App mit Kioskmodus finden Sie in der Dokumentation zum Kioskmodus.

Übergang zur Anzeige oberhalb des Sperrbildschirms

Eine Aktivierung oberhalb des Sperrbildschirms ähnelt einer Aktivierung unterhalb des Sperrbildschirms. Wenn keine aktiven Instanzen der Anwendung vorhanden sind, wird eine neue Instanz im Hintergrund gestartet, und OnBackgroundActivated wird in „App.xaml.cs“ aufgerufen. Ist eine Instanz der Anwendung vorhanden, dann erhält diese Instanz über das Ereignis ConversationalAgentSession.SignalDetected eine Benachrichtigung.

Wenn die Anwendung nicht über dem Sperrbildschirm angezeigt wird, muss sie ConversationalAgentSession.RequestForegroundActivationAsync aufrufen. Hierdurch wird die OnLaunched-Methode in „App.xaml.cs“ ausgelöst, die einen Navigationsvorgang zu der Ansicht bewirkt, die oberhalb des Sperrbildschirms angezeigt wird.

Erkennen von Sperrbildschirm-Übergängen

Die Bibliothek „ConversationalAgent“ im Windows SDK verfügt über eine API, über die leicht auf den Status des Sperrbildschirms und die zugehörigen Änderungen zugegriffen werden kann. Verwenden Sie das Feld ConversationalAgentSession.IsUserAuthenticated, um den aktuellen Status des Sperrbildschirms zu ermitteln. Fügen Sie zum Erkennen von Änderungen im gesperrten Zustand dem SystemStateChanged-Ereignis des ConversationalAgentSession-Objekts einen Ereignishandler hinzu. Sie wird immer dann ausgelöst, wenn der Bildschirm aus dem nicht gesperrten in den gesperrten Zustand wechselt (oder umgekehrt). Wenn der Wert der Ereignisargumente ConversationalAgentSystemStateChangeType.UserAuthentication lautet, hat sich der Status des Bildschirmstatus geändert.

conversationalAgentSession.SystemStateChanged += (s, e) =>
{
    if (e.SystemStateChangeType == ConversationalAgentSystemStateChangeType.UserAuthentication)
    {
        // Handle lock state change
    }
};

Erkennen der vom Benutzer bevorzugten Einstellung für die Aktivierung der Anzeige oberhalb des Sperrbildschirms

Der Anwendungseintrag auf der Seite mit den Datenschutzeinstellungen für die Sprachaktivierung enthält einen Umschalter für die Funktion zum Anzeigen oberhalb des Sperrbildschirms. Damit Ihre App über dem Sperrbildschirm gestartet werden kann, muss der Benutzer bzw. die Benutzerin diese Einstellung aktivieren. Der Status der Berechtigungen für die Anzeige oberhalb des Sperrbildschirms wird ebenfalls im „ActivationSignalDetectionConfiguration“-Objekt gespeichert. Der Status von „AvailabilityInfo.HasLockScreenPermission“ spiegelt wider, ob der Benutzer seine Einwilligung für die Anzeige oberhalb des Sperrbildschirms erteilt hat. Wenn diese Einstellung deaktiviert ist, kann eine Sprachanwendung den Benutzer auffordern, unter dem Link „ms-settings:privacy-voiceactivation“ zur entsprechenden Seite mit den Einstellungen zu navigieren. Die Seite enthält eine Anleitung zur Aktivierung der Anzeige oberhalb des Sperrbildschirms für die Anwendung.

Schließen der Anwendung

Verwenden Sie die WindowService.CloseWindow()-API, um die Anwendung richtig programmgesteuert zu schließen, während sie oberhalb oder unterhalb des Sperrbildschirms angezeigt wird. Hierdurch werden alle UWP-Lebenszyklusmethoden ausgelöst, z. B. OnSuspend, damit die Anwendung das ConversationalAgentSession-Objekt vor dem Schließen verwerfen kann.

Hinweis

Die Anwendung kann geschlossen werden, ohne dass die unterhalb des Sperrbildschirms angezeigte Instanz geschlossen wird. In diesem Fall muss die Anzeige oberhalb des Sperrbildschirms „bereinigt“ werden. Hierbei wird sichergestellt, dass nach dem Entsperren des Bildschirms keine Ereignishandler oder Aufgaben vorhanden sind, die versuchen, die oberhalb des Sperrbildschirms angezeigte Ansicht zu manipulieren.

Nächste Schritte