Festlegen von benutzerdefinierten Erkennungseinschränkungen

Erfahren Sie, wie Sie benutzerdefinierte Einschränkungen für die Spracherkennung definieren und verwenden.

Wichtige APIs: SpeechRecognitionTopicConstraint, SpeechRecognitionListConstraint, SpeechRecognitionGrammarFileConstraint

Die Spracherkennung erfordert mindestens eine Einschränkung, um ein erkennbares Vokabular zu definieren. Wenn keine Einschränkung angegeben ist, wird die vordefinierte Diktiergrammatik universeller Windows-Apps verwendet. Siehe Spracherkennung.

Hinzufügen von Einschränkungen

Verwenden Sie die SpeechRecognizer.Constraints-Eigenschaft , um Einschränkungen zu einer Spracherkennung hinzuzufügen.

Hier behandeln wir die drei Arten von Spracherkennungseinschränkungen, die in einer App verwendet werden. (Informationen zu Einschränkungen für Cortana-Sprachbefehle finden Sie unter Aktivieren einer Vordergrund-App mit Sprachbefehlen über Cortana.)

Jede Spracherkennung kann eine Einschränkungsauflistung aufweisen. Nur diese Kombinationen von Einschränkungen sind gültig:

  • Eine Einschränkung mit einem Thema (Diktat oder Websuche)
  • Für Windows 10 Fall Creators Update (10.0.16299.15) und neuer kann eine einzelne Themeneinschränkung mit einer Listeneinschränkung kombiniert werden.
  • Eine Kombination aus Listeneinschränkungen und/oder Grammatikdateieinschränkungen.

Wichtig

Rufen Sie die SpeechRecognizer.CompileConstraintsAsync-Methode auf, um die Einschränkungen zu kompilieren, bevor Sie den Erkennungsprozess starten.

Angeben einer Grammatik für die Websuche (SpeechRecognitionTopicConstraint)

Themeneinschränkungen (Diktier- oder Websuchgrammatik) müssen der Einschränkungssammlung einer Spracherkennung hinzugefügt werden.

Hinweis

Sie können eine SpeechRecognitionListConstraint in Verbindung mit einer SpeechRecognitionTopicConstraint verwenden, um die Diktiergenauigkeit zu erhöhen, indem Sie eine Reihe von domänenspezifischen Schlüsselwörtern bereitstellen, die Sie wahrscheinlich während des Diktierens verwenden werden.

Hier fügen wir der Einschränkungssammlung eine Grammatik für die Websuche hinzu.

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

    // Listen for audio input issues.
    speechRecognizer.RecognitionQualityDegrading += speechRecognizer_RecognitionQualityDegrading;

    // Add a web search grammar to the recognizer.
    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);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
    //await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Angeben einer programmgesteuerten Listeneinschränkung (SpeechRecognitionListConstraint)

Listeneinschränkungen müssen der Einschränkungsauflistung einer Spracherkennung hinzugefügt werden.

Beachten Sie folgende Punkte:

  • Sie können einer Einschränkungsauflistung mehrere Listeneinschränkungen hinzufügen.
  • Sie können jede Auflistung verwenden, die IIterable<String> für die Zeichenfolgenwerte implementiert.

Hier geben wir programmgesteuert ein Array von Wörtern als Listeneinschränkung an und fügen es der Einschränkungsauflistung einer Spracherkennung hinzu.

private async void YesOrNo_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // You could create this array dynamically.
    string[] responses = { "Yes", "No" };


    // Add a list constraint to the recognizer.
    var listConstraint = new Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint(responses, "yesOrNo");

    speechRecognizer.UIOptions.ExampleText = @"Ex. 'yes', 'no'";
    speechRecognizer.Constraints.Add(listConstraint);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Angeben einer SRGS-Grammatikeinschränkung (SpeechRecognitionGrammarFileConstraint)

SRGS-Grammatikdateien müssen der Einschränkungsauflistung einer Spracherkennung hinzugefügt werden.

Die SRGS Version 1.0 ist die Branchenstandardmarkupsprache zum Erstellen von XML-Formatgrammatiken für die Spracherkennung. Obwohl universelle Windows-Apps Alternativen zur Verwendung von SRGS zum Erstellen von Spracherkennungsgrammatiken bereitstellen, stellen Sie möglicherweise fest, dass die Verwendung von SRGS zum Erstellen von Grammatiken die besten Ergebnisse erzeugt, insbesondere für komplexere Spracherkennungsszenarien.

SRGS-Grammatiken bieten einen vollständigen Satz von Features, mit denen Sie komplexe Sprachinteraktionen für Ihre Apps erstellen können. Beispielsweise können Sie mit SRGS-Grammatiken:

  • Geben Sie die Reihenfolge an, in der Wörter und Ausdrücke erkannt werden müssen.
  • Kombinieren Sie Wörter aus mehreren Listen und Ausdrücken, die erkannt werden sollen.
  • Verknüpfung mit anderen Grammatiken.
  • Weisen Sie einem alternativen Wort oder Ausdruck eine Gewichtung zu, um die Wahrscheinlichkeit zu erhöhen oder zu verringern, dass es für die Spracheingabe verwendet wird.
  • Fügen Sie optionale Wörter oder Ausdrücke ein.
  • Verwenden Sie spezielle Regeln, mit denen sie nicht angegebene oder unerwartete Eingaben herausfiltern können, z. B. zufällige Spracherkennung, die nicht mit der Grammatik übereinstimmt, oder Hintergrundgeräusche.
  • Verwenden Sie die Semantik, um zu definieren, was die Spracherkennung für Ihre App bedeutet.
  • Geben Sie Aussprachen an, entweder inline in einer Grammatik oder über einen Link zu einem Lexika.

Weitere Informationen zu SRGS-Elementen und -Attributen finden Sie in der SRGS Grammar XML Reference . Informationen zum Erstellen einer SRGS-Grammatik finden Sie unter How to Create a Basic XML Grammar.

Beachten Sie folgende Punkte:

  • Sie können einer Einschränkungsauflistung mehrere Grammatikdateieinschränkungen hinzufügen.
  • Verwenden Sie die GRXML-Dateierweiterung für XML-basierte Grammatikdokumente, die SRGS-Regeln entsprechen.

In diesem Beispiel wird eine SRGS-Grammatik verwendet, die in einer Datei mit dem Namen "srgs.grxml" definiert ist (weiter unten beschrieben). In den Dateieigenschaften wird die Paketaktion auf "Inhalt" festgelegt, wobei "In Ausgabeverzeichnis kopieren" immer auf "Kopieren" festgelegt ist:

private async void Colors_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Add a grammar file constraint to the recognizer.
    var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Colors.grxml"));
    var grammarFileConstraint = new Windows.Media.SpeechRecognition.SpeechRecognitionGrammarFileConstraint(storageFile, "colors");

    speechRecognizer.UIOptions.ExampleText = @"Ex. 'blue background', 'green text'";
    speechRecognizer.Constraints.Add(grammarFileConstraint);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Diese SRGS-Datei (srgs.grxml) enthält Semantik-Interpretationstags. Diese Tags bieten einen Mechanismus zum Zurückgeben von Grammatikvergleichsdaten an Ihre App. Grammatiken müssen der Spezifikation 1.0 des World Wide Web Consortium (W3C) Semantic Interpretation for Speech Recognition (SISR) entsprechen.

Hier lauschen wir auf Varianten von "Ja" und "Nein".

<grammar xml:lang="en-US" 
         root="yesOrNo"
         version="1.0" 
         tag-format="semantics/1.0"
         xmlns="http://www.w3.org/2001/06/grammar">

    <!-- The following rules recognize variants of yes and no. -->
      <rule id="yesOrNo">
         <one-of>
            <item>
              <one-of>
                 <item>yes</item>
                 <item>yeah</item>
                 <item>yep</item>
                 <item>yup</item>
                 <item>un huh</item>
                 <item>yay yus</item>
              </one-of>
              <tag>out="yes";</tag>
            </item>
            <item>
              <one-of>
                 <item>no</item>
                 <item>nope</item>
                 <item>nah</item>
                 <item>uh uh</item>
               </one-of>
               <tag>out="no";</tag>
            </item>
         </one-of>
      </rule>
</grammar>

Verwalten von Einschränkungen

Nachdem eine Einschränkungsauflistung für die Erkennung geladen wurde, kann Ihre App verwalten, welche Einschränkungen für Erkennungsvorgänge aktiviert sind, indem Sie die IsEnabled-Eigenschaft einer Einschränkung auf "true" oder "false" festlegen. Die Standardeinstellung ist true.

Es ist in der Regel effizienter, Einschränkungen einmal zu laden, und sie nach Bedarf zu aktivieren und zu deaktivieren, anstatt Einschränkungen für jeden Erkennungsvorgang zu laden, zu entladen und zu kompilieren. Verwenden Sie die IsEnabled-Eigenschaft nach Bedarf.

Das Einschränken der Anzahl von Einschränkungen dient zum Einschränken der Datenmenge, die die Spracherkennung für die Suche und Übereinstimmung mit der Spracheingabe benötigt. Dies kann sowohl die Leistung als auch die Genauigkeit der Spracherkennung verbessern.

Entscheiden Sie, welche Einschränkungen basierend auf den Ausdrücken aktiviert sind, die Ihre App im Kontext des aktuellen Erkennungsvorgangs erwarten kann. Wenn beispielsweise der aktuelle App-Kontext eine Farbe anzeigt, müssen Sie wahrscheinlich keine Einschränkung aktivieren, die die Namen von Tieren erkennt.

Verwenden Sie die SpeechRecognizerUIOptions.AudiblePrompt- und SpeechRecognizerUIOptions.ExampleText-Eigenschaften, die mithilfe der SpeechRecognizer.UIOptions-Eigenschaft festgelegt werden, um den Benutzer aufzufordern, was gesprochen werden kann. Die Vorbereitung der Benutzer auf das, was sie während des Erkennungsvorgangs sagen können, erhöht die Wahrscheinlichkeit, dass sie einen Ausdruck sprechen, der mit einer aktiven Einschränkung abgeglichen werden kann.

Beispiele