Définir des contraintes de reconnaissance vocale personnalisées

Découvrez comment définir et utiliser des contraintes personnalisées pour la reconnaissance vocale.

API importantes : SpeechRecognitionTopicConstraint, SpeechRecognitionListConstraint, SpeechRecognitionGrammarFileConstraint

La reconnaissance vocale nécessite au moins une contrainte pour définir un vocabulaire reconnaissable. Si aucune contrainte n’est spécifiée, la grammaire de dictée prédéfinie des applications Windows universelles est utilisée. Voir reconnaissance vocale.

Ajouter des contraintes

Utilisez la propriété SpeechRecognizer.Constraints pour ajouter des contraintes à un module de reconnaissance vocale.

Ici, nous abordons les trois types de contraintes de reconnaissance vocale utilisées à partir d’une application. (Pour les contraintes de commande vocale Cortana, consultez Activez une application de premier plan avec des commandes vocales via Cortana.)

Chaque module de reconnaissance vocale peut avoir une collection de contraintes. Seules ces combinaisons de contraintes sont valides :

  • Contrainte à rubrique unique (dictée ou recherche web)
  • Pour Windows 10 Fall Creators Update (10.0.16299.15) et versions ultérieures, une seule contrainte de rubrique peut être combinée avec une contrainte de liste
  • Combinaison de contraintes de liste et/ou de contraintes de fichier de grammaire.

Important

Appelez la méthode SpeechRecognizer.CompileConstraintsAsync pour compiler les contraintes avant de démarrer le processus de reconnaissance.

Spécifier une grammaire de recherche web (SpeechRecognitionTopicConstraint)

Les contraintes de rubrique (grammaire de la dictée ou de recherche web) doivent être ajoutées à la collection de contraintes d’un module de reconnaissance vocale.

Remarque

Vous pouvez utiliser un SpeechRecognitionListConstraint conjointement avec un SpeechRecognitionTopicConstraint pour augmenter la précision de la dictée en fournissant un ensemble de mots clés spécifiques au domaine que vous pensez être utilisés pendant la dictée.

Ici, nous ajoutons une grammaire de recherche web à la collection de contraintes.

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();
}

Spécifier une contrainte de liste programmatique (SpeechRecognitionListConstraint)

Les contraintes de liste doivent être ajoutées à la collection de contraintes d’un module de reconnaissance vocale.

Gardez à l’esprit les points suivants :

  • Vous pouvez ajouter plusieurs contraintes de liste à une collection de contraintes.
  • Vous pouvez utiliser n’importe quelle collection qui implémente la chaîne> IIterable<pour les valeurs de chaîne.

Ici, nous spécifions par programmation un tableau de mots en tant que contrainte de liste et l’ajoutons à la collection de contraintes d’un module de reconnaissance vocale.

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();
}

Spécifier une contrainte de grammaire SRGS (SpeechRecognitionGrammarFileConstraint)

Les fichiers de grammaire SRGS doivent être ajoutés à la collection de contraintes d’un module de reconnaissance vocale.

SRGS version 1.0 est le langage de balisage standard pour créer des grammaires au format XML pour la reconnaissance vocale. Bien que les applications Windows universelles offrent des alternatives à l’utilisation de SRGS pour créer des grammaires de reconnaissance vocale, vous pouvez constater que l’utilisation de SRGS pour créer des grammaires produit les meilleurs résultats, en particulier pour des scénarios de reconnaissance vocale plus impliqués.

Les grammaires SRGS fournissent un ensemble complet de fonctionnalités pour vous aider à concevoir une interaction vocale complexe pour vos applications. Par exemple, avec les grammaires SRGS, vous pouvez :

  • Spécifiez l’ordre dans lequel les mots et expressions doivent être prononcés pour être reconnus.
  • Combinez les mots de plusieurs listes et expressions à reconnaître.
  • Lier à d’autres grammaires.
  • Attribuez un poids à un mot ou une expression de remplacement pour augmenter ou diminuer la probabilité qu’il soit utilisé pour faire correspondre l’entrée vocale.
  • Incluez des mots ou des expressions facultatifs.
  • Utilisez des règles spéciales qui permettent de filtrer les entrées non spécifiées ou inattendues, telles que la parole aléatoire qui ne correspond pas à la grammaire ou au bruit d’arrière-plan.
  • Utilisez la sémantique pour définir ce que signifie la reconnaissance vocale pour votre application.
  • Spécifiez des prononciations, inline dans une grammaire ou via un lien vers un lexique.

Pour plus d’informations sur les éléments et attributs SRGS, consultez la référence XML de grammaire SRGS. Pour commencer à créer une grammaire SRGS, consultez Comment créer une grammaire XML de base.

Gardez à l’esprit les points suivants :

  • Vous pouvez ajouter plusieurs contraintes de fichier grammatical à une collection de contraintes.
  • Utilisez l’extension de fichier .grxml pour les documents de grammaire XML conformes aux règles SRGS.

Cet exemple utilise une grammaire SRGS définie dans un fichier nommé srgs.grxml (décrit plus loin). Dans les propriétés du fichier, l’action de package est définie sur Content with Copy to Output Directory set to Copy to Copy always :

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();
}

Ce fichier SRGS (srgs.grxml) inclut des balises d’interprétation sémantique. Ces balises fournissent un mécanisme permettant de retourner des données de correspondance de grammaire à votre application. Les grammaires doivent être conformes à la spécification W3C (World Wide Web Consortium) sémantique pour la reconnaissance vocale (SISR) 1.0 .

Ici, nous écoutons des variantes de « oui » et « non ».

<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>

Gérer les contraintes

Une fois qu’une collection de contraintes est chargée pour la reconnaissance, votre application peut gérer les contraintes activées pour les opérations de reconnaissance en définissant la propriété IsEnabled d’une contrainte sur true ou false. Le paramètre par défaut est true.

Il est généralement plus efficace de charger des contraintes une fois, en les activant et en les désactivant si nécessaire, plutôt que de charger, décharger et compiler des contraintes pour chaque opération de reconnaissance. Utilisez la propriété IsEnabled , selon les besoins.

La restriction du nombre de contraintes permet de limiter la quantité de données que le module de reconnaissance vocale doit rechercher et faire correspondre à l’entrée vocale. Cela peut améliorer les performances et la précision de la reconnaissance vocale.

Déterminez les contraintes activées en fonction des expressions attendues par votre application dans le contexte de l’opération de reconnaissance actuelle. Par exemple, si le contexte actuel de l’application doit afficher une couleur, vous n’avez probablement pas besoin d’activer une contrainte qui reconnaît les noms des animaux.

Pour demander à l’utilisateur ce qui peut être parlé, utilisez les propriétés SpeechRecognizerUIOptions.AudiblePrompt et SpeechRecognizerUIOptions.ExampleText, définies par le biais de la propriété SpeechRecognizer.UIOptions. La préparation des utilisateurs à ce qu’ils peuvent dire pendant l’opération de reconnaissance augmente la probabilité qu’ils parlent une expression pouvant être mise en correspondance avec une contrainte active.

Exemples