Spracherkennung in Windows-Apps

Verwenden Sie die Spracherkennung, um Eingaben bereitzustellen, Aktionen oder Befehle anzugeben und Aufgaben in Ihrer Windows App SDK-App auszuführen.

Important

Für die Spracherkennung ist MSIX-Paketidentität erforderlich. Die Windows.Media.SpeechRecognition-APIs sind nur verfügbar, wenn Ihre App mit Paketidentität (verpackt oder mit externem Speicherort verpackt) ausgeführt wird. Entpackte Apps können diese APIs nicht verwenden.

Wichtige APIs

Übersicht

Die Spracherkennung besteht aus einer Sprachlaufzeit, Erkennungs-APIs für die Programmierung der Laufzeit, einsatzbereiten Grammatiken für die Diktier- und Websuche sowie einer Standardsystembenutzeroberfläche, mit der Benutzer Spracherkennungsfeatures entdecken und verwenden können.

Konfigurieren der Spracherkennung

Um die Spracherkennung zu unterstützen, muss der Benutzer ein Mikrofon auf dem Gerät anschließen und aktivieren und die Microsoft Datenschutzrichtlinie akzeptieren, die ihrer App die Berechtigung zur Verwendung erteilt.

Legen Sie die Mikrofongerätefunktion im App-Paketmanifest fest, um den Benutzer zur Berechtigung für den Mikrofonzugriff aufzufordern. Weitere Informationen finden Sie unter App-Funktionsdeklarationen.

Wenn der Benutzer Zugriff gewährt, wird Ihre App in der Liste der genehmigten Anwendungen unter "Einstellungen– Datenschutzmikrofon>" >angezeigt. Da der Benutzer diese Einstellung jederzeit deaktivieren kann, vergewissern Sie sich, dass Ihre App über Mikrofonzugriff verfügt, bevor Sie versuchen, sie zu verwenden.

Wenn Sie auch Diktier- oder andere Spracherkennungsdienste unterstützen möchten (z. B. eine vordefinierte Grammatik, die in einer Themeneinschränkung definiert ist), bestätigen Sie, dass die Online-Spracherkennung (Datenschutz-Spracherkennungseinstellungen >>) aktiviert ist.

Das folgende Beispiel zeigt, wie Sie überprüfen, ob ein Mikrofon vorhanden ist und ob Ihre App über die Berechtigung zum Verwenden verfügt.

public class AudioCapturePermissions
{
    private static int NoCaptureDevicesHResult = -1072845856;

    /// <summary>
    /// Checks whether the microphone is available and the app has permission to use it.
    /// Perform this check every time the app gets focus, because the user can change
    /// the setting while the app is suspended or not in focus.
    /// </summary>
    /// <returns>True if the microphone is available.</returns>
    public static async Task<bool> RequestMicrophonePermission()
    {
        try
        {
            var settings = new MediaCaptureInitializationSettings
            {
                StreamingCaptureMode = StreamingCaptureMode.Audio,
                MediaCategory = MediaCategory.Speech
            };
            var capture = new MediaCapture();
            await capture.InitializeAsync(settings);
        }
        catch (TypeLoadException)
        {
            // Media player components are not available.
            return false;
        }
        catch (UnauthorizedAccessException)
        {
            // Permission to use the audio capture device is denied.
            return false;
        }
        catch (Exception exception)
        {
            if (exception.HResult == NoCaptureDevicesHResult)
            {
                // No audio capture devices are present on this system.
                return false;
            }
            throw;
        }
        return true;
    }
}

Erkennen der Spracheingabe

Eine Einschränkung definiert die Wörter und Ausdrücke (Vokabular), die eine App in der Spracheingabe erkennt. Einschränkungen sind der Kern der Spracherkennung und bieten Ihrer App eine bessere Kontrolle über die Erkennungsgenauigkeit.

Sie können die folgenden Arten von Einschränkungen verwenden.

Vordefinierte Grammatiken

Vordefinierte Diktier- und Websuchgrammatiken bieten Spracherkennung, ohne dass Sie eine Grammatik erstellen müssen. Wenn Sie diese Grammatiken verwenden, führt ein Remotewebdienst die Erkennung durch und gibt die Ergebnisse an das Gerät zurück.

Die Standardmäßige Freitext-Diktiergrammatik erkennt die meisten Wörter und Ausdrücke, die ein Benutzer in einer bestimmten Sprache sagen kann, und ist für kurze Ausdrücke optimiert. Wenn Sie keine Einschränkungen für Ihren SpeechRecognizer angeben, wird die vordefinierte Diktiergrammatik verwendet.

Die Grammatik für die Websuche enthält eine große Anzahl von Wörtern und Ausdrücken, die für Ausdrücke optimiert sind, die in der Regel beim Durchsuchen des Webs verwendet werden.

Hinweis

Vordefinierte Diktier- und Websuchgrammatiken können groß sein, und da sie online sind (nicht auf dem Gerät), ist die Leistung möglicherweise nicht so schnell wie bei einer lokal installierten benutzerdefinierten Grammatik.

Diese vordefinierten Grammatiken erkennen bis zu 10 Sekunden Spracheingabe und erfordern keine Erstellungsaufwand. Sie benötigen jedoch eine Netzwerkverbindung.

Siehe SpeechRecognitionTopicConstraint.

Programmgesteuerte Listeneinschränkungen

Programmgesteuerte Listeneinschränkungen bieten einen einfachen Ansatz zum Erstellen einfacher Grammatiken mithilfe einer Liste von Wörtern oder Ausdrücken. Eine Listeneinschränkung eignet sich gut zum Erkennen kurzer, eindeutiger Ausdrücke. Wenn Sie alle Wörter in einer Grammatik angeben, wird die Erkennungsgenauigkeit verbessert, da das Spracherkennungsmodul nur die Spracherkennung verarbeiten muss, um eine Übereinstimmung zu bestätigen. Die Liste kann auch programmgesteuert aktualisiert werden.

Siehe SpeechRecognitionListConstraint.

SRGS-Grammatiken

Eine Grammatik für die Spracherkennung (Speech Recognition Grammar Specification, SRGS) ist ein statisches Dokument, das das durch die SRGS Version 1.0 definierte XML-Format verwendet. Eine SRGS-Grammatik bietet Ihnen die größte Kontrolle über die Spracherkennung, indem Sie mehrere semantische Bedeutungen in einer einzigen Erkennung erfassen können.

Siehe SpeechRecognitionGrammarFileConstraint.

Einschränkungen für Sprachbefehle

Verwenden Sie eine VCD-XML-Datei (Voice Command Definition), um die Befehle zu definieren, die der Benutzer sagen kann, um Aktionen beim Aktivieren der App zu initiieren. Siehe SpeechRecognitionVoiceCommandDefinitionConstraint.

Informationen zu den ersten Schritten mit Einschränkungen finden Sie unter Definieren von benutzerdefinierten Erkennungseinschränkungen.

Beispiel für einfache Erkennung

Im folgenden Beispiel wird ein Spracherkenner erstellt, die Standarddiktatbeschränkungen kompiliert und mit dem Lauschen auf Spracheingaben begonnen.

private async void StartRecognizing_Click(object sender, RoutedEventArgs e)
{
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Compile the default dictation grammar.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult result =
        await speechRecognizer.RecognizeAsync();

    // Display the recognized text.
    if (result.Status == Windows.Media.SpeechRecognition.SpeechRecognitionResultStatus.Success)
    {
        resultTextBlock.Text = result.Text;
    }
}

Hinweis

In diesem Beispiel wird (ohne Benutzeroberfläche) verwendet RecognizeAsync . Wenn Sie die integrierte Erkennungsbenutzeroberfläche verwenden möchten, rufen Sie stattdessen auf RecognizeWithUIAsync . Siehe SpeechRecognizerUIOptions für Anpassungsoptionen.

Anpassen der Erkennungs-UI

Wenn Ihre App SpeechRecognizer.RecognizeWithUIAsync aufruft, zeigt das System mehrere Bildschirme in Sequenz an:

  • Für vordefinierte Grammatiken (Diktat oder Websuche): ZuhörenNachdenkenVerstanden als (oder Fehler).
  • Für Listen- oder SRGS-Einschränkungen: Ich höre zuMeinten Sie (wenn mehrdeutig) → Ich habe verstanden (oder Fehler).

Verwenden Sie die Klasse SpeechRecognizerUIOptions (erhältlich über SpeechRecognizer.UIOptions), um den Bildschirm Listening anzupassen:

private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    speechRecognizer.RecognitionQualityDegrading += SpeechRecognizer_RecognitionQualityDegrading;

    var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(
        Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch");

    speechRecognizer.UIOptions.AudiblePrompt = "Say what you want to search for...";
    speechRecognizer.UIOptions.ExampleText = @"Ex. 'weather for London'";
    speechRecognizer.Constraints.Add(webSearchGrammar);

    await speechRecognizer.CompileConstraintsAsync();

    Windows.Media.SpeechRecognition.SpeechRecognitionResult result =
        await speechRecognizer.RecognizeWithUIAsync();

    resultTextBlock.Text = result.Text;
}