Français English

Reconnaissance vocale multi-language avec Windows Phone 8

Tags: WP8, Windows Phone 8, Speech API

 

J’avais envie de tester la reconnaissance vocale depuis longtemps, voilà l’occasion avec le nouveau Windows Phone 8.

C’est assez simple…quand tout est en place.

Préparation

Premièrement, il faut démarrer le service da reconnaissance vocale sur le téléphone :

  

Ne pas oublier d’ajouter les langues que vous voulez utiliser/tester :

Maintenant, il faut ajouter la capacité Micro et reconnaissance locale à votre application :

Voilà, on est prêt !

Reconnaissance de base

Il y a deux façons d’avoir la reconnaissance vocale dans votre application. Avec l’interface de base de WP8 (SpeechRecognizerUI) qui donne ceci :

Où avec votre propre interface. (SpeechRecognizer).

Je vais utiliser ma propre interface, mais le principe est le même avec l’interface de base.

var speechrecognizer = new SpeechRecognizer();

var result = await speechrecognizer.RecognizeAsync();

// check if not rejected
if (result.TextConfidence != SpeechRecognitionConfidence.Rejected)
{
    MessageBox.Show(string.Format("You said {0} (With a confidence of {1})", result.Text, result.TextConfidence));
}

J’instancie un SpeechRecognizer, puis j’attends (de manière asynchrone) qu’il reconnaisse quelque chose.

Après, si le taux de confiance n’est pas trop bas (rejeté), j’affiche un messagebox avec le texte et le taux de confiance. Difficile de faire plus simple.

Il n’y a pas beaucoup de réglages possibles, à part les Grammar (J’en parle après) et les timeouts dans la propriété Settings.

Grammars

Pour faciliter la reconnaissance, vous pouvez utiliser des grammaires. Pour faire simple, une grammaire est une liste de mots/phrases. Vous pouvez avoir plusieurs grammaires, qui peuvent être activée ou pas suivant le contexte.

Il y a deux grammaires pré-définies, une pour la dictée (C’est celle par défaut) et une pour la recherche web.

Pour les activer :

_speechRecognizer.Grammars.AddGrammarFromPredefinedType("Web",SpeechPredefinedGrammar.WebSearch);

Pour optimiser la reconnaissance, vous pouvez créer votre propre grammaire. Avec les mots/phrases qui ont un sens dans le contexte de votre application.

Pour cela, vous pouvez l’ajouter via un IEnumerable<string> :

_speechRecognizer.Grammars.AddGrammarFromList("CustomList", new List<string> {"Hello World!", "Bye"});

Ou alors ajouter un fichier, SRGS, qui est un fichier XML standard pour grammaire reconnaissance vocale.

Pour en ajouter un :

Un exemple de fichier :

<?xml version="1.0" encoding="utf-8" ?>

<grammar version="1.0" xml:lang="en-us" root="commands" tag-format="semantics/1.0" 
         xmlns="http://www.w3.org/2001/06/grammar" 
         xmlns:sapi="http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions">

  <!--Sample SRGS Grammar to show syntax.
      The rule element defines a grammar rule. A rule element 
      contains text or XML elements that define what speakers can 
      say, and the order in which they can say it.-->

  <rule id="commands" scope="public">
    <one-of>
      <item> Up </item>
      <item> Down </item>
      <item> Right </item>
      <item> Left </item>
      <item> Stop </item>
      <item> Restart </item>
    </one-of>
  </rule>

</grammar>

Pour charger la grammaire :

_speechRecognizer.Grammars.AddGrammarFromUri("GrammarEN", new Uri("ms-appx:///SRGSGrammar-en.xml", UriKind.Absolute));

Pour désactiver une grammaire :

 _speechRecognizer.Grammars["GrammarEN"].Enabled = true;

Multilingue

Si vous voulez faire de la reconnaissance vocale en plusieurs langues, dépendant de celle que l’utilisateur choisi, il y a deux étapes :

Premièrement, il faut dire au Recognizer quelle langage il doit utiliser (Ne pas oublier d’installer la langue, voir début de l’article) :

var _englishRecognizer = InstalledSpeechRecognizers.All.FirstOrDefault(d => d.Language.ToUpper() == "EN-US");

var  _speechRecognizer = new SpeechRecognizer();

 _speechRecognizer.SetRecognizer(_englishRecognizer);

Maintenant que c’est fait, vous pouvez ajouter la grammaire spécifique à la langue.

Il faut créer un fichier SRGS, et ne pas oublier de spécifier la langue.

Après :

_speechRecognizer.Grammars.AddGrammarFromUri("GrammarEN", new Uri("ms-appx:///SRGSGrammar-en.xml", UriKind.Absolute));

Erreurs

Pour la liste des erreurs du Speech Recognition API, voir ici.

Parfois j’avais des exceptions ou le message était : “no exception detail available”. Il me semble que ça allait mieux lorsque j’utilisais ceci (Menu DEBUG/EXCEPTION) :

Exemple

J’ai créé une petit appli exemple, ou vous pouvez contrôler un carré en utilisant des commandes en anglais (Up,Down,Left,Right,Stop,Restart) ou en français (Haut,Bas,Droite,Gauche,Stop,Recommencer). Vous pouvez changer la langue dans le menu.

EXEMPLE

 

Comments powered by Disqus