Comment mélanger grammaire (règles) et Dictée (liberté d'expression) avec SpeechRecognizer en C#

J'aime vraiment les dernières offres de reconnaissance vocale (et de synthèse vocale) des Microsofts.

http://msdn.microsoft.com/en-us/library/ms554855.aspx

http://estellasays.blogspot.com/2009/04/speech-recognition-in-cnet.html

cependant je me sens comme je suis un peu limité en utilisant des grammaires.

Ne vous méprenez pas, les grammaires sont grands pour dire la reconnaissance de la parole exactement ce que les mots / phrases à regarder dehors mais si je veux qu'il reconnaisse quelque chose que je ne lui ai pas dit? Ou je veux analyser une phrase qui est moitié nom de commande pré-déterminé et moitié mots aléatoires?

Par exemple..

Scénario - je dis "Google [Oil Spill]" et je veux qu'il ouvre Google avec des résultats de recherche pour le terme entre parenthèses qui pourrait être n'importe quoi.

Scénario B - je dis "Locate [Manchester]" et je veux qu'il cherche Manchester dans Google Maps ou quoi que ce soit d'autre Non prédéterminé

je veux qu'il sache que 'Google' et 'Locate' sont des commandes et que ce qui vient après ce sont des paramètres (et pourraient être n'importe quoi).

Question: Est-ce que quelqu'un sait mélanger l'utilisation de grammaires prédéfinies (mots que la reconnaissance de la parole devrait reconnaître) et des mots qui ne sont pas dans sa grammaire prédéfinie?

fragments de Code..

using System.Speech.Recognition;

...
...

SpeechRecognizer rec = new SpeechRecognizer();
rec.SpeechRecognized += rec_SpeechRecognized;

var c = new Choices();
c.Add("search");

var gb = new GrammarBuilder(c);
var g = new Grammar(gb);
rec.LoadGrammar(g);
rec.Enabled = true; 

...
...

void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    if (e.Result.Text == "search")
    {
        string query = "How can I get a word not defined in Grammar recognised and passed into here!";

        launchGoogle(query);
    }
}

...
...


private void launchGoogle(string term)
{
    Process.Start("IEXPLORE", "google.com?q=" + term);
}
11
demandé sur Eric Brown 2010-06-15 20:07:47

2 réponses

vous pourriez essayer quelque chose comme ça... Il spécifie une liste des commandes.. mais vous permet également d'utiliser la dictée ouverte après. Il s'attend à une commande donnée avant l'ouverture de la dictée.. mais tu pourrais Inverser ça... et d'ajouter th Cependant, en ajoutant un blanc dans la commande type ( "" ), vous pourrez aussi accéder directement à la partie dictée.

Choices commandtype = new Choices();
commandtype.Add("search");
commandtype.Add("print");
commandtype.Add("open");
commandtype.Add("locate");

SemanticResultKey srkComtype = new SemanticResultKey("comtype",commandtype.ToGrammarBuilder());

 GrammarBuilder gb = new GrammarBuilder();
 gb.Culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-GB");
 gb.Append(srkComtype);
 gb.AppendDictation();

 Grammar gr = new Grammar(gb);

puis sur votre recognizer il suffit d'utiliser le texte du résultat etc

private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    System.Console.WriteLine(e.Result.Text);

}

vous pouvez ajouter plus d'options de choix, et Semanticresultkesà la structure pour faire des modèles plus complexes si vous le souhaitez. Aussi un joker (par exemple gb.AppendWildcard ();).

5
répondu timemirror 2010-07-29 23:16:21

Vous avez deux choix:

  1. vous pouvez utiliser le noeud de dictée pour du texte libre en utilisant GrammarBuilder:: AppendDictation. Le problème est que depuis le recognizer n'a pas de contexte, les reconnaissances ne sont pas de la plus haute qualité.
  2. vous pouvez utiliser un noeud textuel et fournir un ensemble d'éléments en utilisant GrammarBuilder:: Ajoute (String, SubsetMatchingMode). Cela donnera au recognizer suffisamment de contexte pour obtenir des reconnaissances de bonne qualité sans avoir à reconstruire tout l'arbre de la grammaire à chaque fois.
4
répondu Eric Brown 2010-06-15 17:08:15