Comment mélanger la grammaire (règles) et Dictation (discours libre) avec SpeechRecognizer en C #

StackOverflow https://stackoverflow.com/questions/3046921

Question

Je aime vraiment Microsofts dernière reconnaissance vocale d'offres (et SpeechSynthesis).

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

http://estellasays.blogspot.com/2009/ 04 / reconnaissance vocale en cnet.html

Cependant, je sens que je suis un peu limité lors de l'utilisation grammaires.

Ne vous méprenez pas sont parfaits pour grammaires dire la reconnaissance vocale exactement quels mots / phrases pour chercher, mais si je veux qu'il reconnaisse quelque chose que je ne l'ai pas donné une tête au sujet? Ou je veux analyser une phrase qui est la moitié nom de commande prédéterminé et demi mots aléatoires?

Par exemple ..

Scénario A -. Je dis "Google [Oil Spill]" et je veux ouvrir Google avec les résultats de la recherche sur le terme entre parenthèses qui pourrait être quelque chose

Scénario B - Je dis "Locate [Manchester]" et je veux qu'il recherche pour Manchester dans Google Maps ou toute autre chose non prédéterminé

Je veux qu'il sache que « Google » et « situer » sont des commandes et ce qui après sont des paramètres (et pourrait être quelque chose).

Question: Est-ce que quelqu'un sait comment mélanger l'utilisation de grammaires pré-déterminé (mots de la reconnaissance vocale devrait reconnaître) et des mots pas dans sa grammaire prédéterminée

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);
}
Était-ce utile?

La solution

Vous pouvez essayer quelque chose comme ça ... Il spécifie une liste de commandes connues .. mais permet également d'utiliser la dictée ouverte par la suite. Il attend qu'il y ait une commande donnée avant la dictée ouverte .. mais vous pouvez inverser cette ... et append e Cependant, en ajoutant dans un vide dans le type de commande ( » « ), il permettra également de vous directement à la partie de la 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 reconnaisseur il suffit d'utiliser le texte de 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 SemanticResultKeys à la structure pour faire des motifs plus complexes si vous le souhaitez. Aussi un caractère générique (par exemple gb.AppendWildcard ();).

Autres conseils

Vous avez deux choix:

  1. Vous pouvez utiliser le nœud de dictée pour texte libre en utilisant GrammarBuilder :: AppendDictation . Le problème est que, depuis la reconnaissance n'a pas contexte, les reconnaissances ne sont pas la plus haute qualité.
  2. Vous pouvez utiliser un nœud de TextBuffer et de fournir un ensemble d'éléments en utilisant GrammarBuilder: : Append (String, SubsetMatchingMode) . Cela donnera le contexte assez pour obtenir de reconnaissance Reconnaissances de bonne qualité sans avoir à reconstruire à chaque fois que l'ensemble de l'arbre de grammaire.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top