C#の文法(ルール)と口述(言論の自由)と音声認識者を混ぜる方法
-
27-09-2019 - |
質問
私はMicrosoftsの最新の音声認識(およびSpeechSynthesis)の提供が本当に好きです。
http://msdn.microsoft.com/en-us/library/ms554855.aspx
http://estellasays.blogspot.com/2009/04/speech-Recognition-in-cnet.html
しかし、文法を使用するとき、私はやや限られているように感じます。
誤解しないでください。グラマーは、スピーチの認識を正確に伝えるのに最適です。または、半分の事前に決定されたコマンド名と半分のランダムワードであるフレーズを解析したいですか?
例えば..
シナリオa - 私は「Google [Oil Spill]」と言います。何でもかかる可能性のある括弧内の用語の検索結果でGoogleを開くことを望んでいます。
シナリオb - 私は「[Manchester]を見つけます」と言います、そして、私はそれをGoogleマップでマンチェスターを検索してもらいたいか、事前に決定されていないもの
「Google」と「Locate」がコマンドであり、それがパラメーターである(そして何でもかかる可能性がある)ことを知ってほしい。
質問:事前に決定された文法の使用を混ぜる方法を知っている人はいますか(音声認識が認識すべき言葉)、およびその先入観の文法ではない言葉を知っていますか?
コードフラグメント..
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);
}
解決
このようなことを試すことができます...既知のコマンドのリストを指定します。ただし、その後のオープンディクテーションを使用することもできます。オープンディクテーションの前に指定されたコマンドがあることを期待しています。しかし、これを逆転させることができます...しかし、コマンドタイプ( "")に空白を追加することで、それはあなたが口述に直接到達することもできます部。
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);
その後、認識者に結果テキストなどを使用するだけです
private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
System.Console.WriteLine(e.Result.Text);
}
選択肢のオプションとSemanticResultkeysを構造に追加して、必要に応じてより複雑なパターンを作成できます。また、ワイルドカード(gb.appendwildcard();)。
他のヒント
2つの選択肢があります。
- Free-Textを使用するためにDictationノードを使用できます GrammarBuilder :: appendDictation. 。問題は、認識者にはコンテキストがないため、認識が最高品質ではないということです。
- TextBufferノードを使用して、使用して一連のアイテムを提供できます grammarbuilder :: append(string、subsetmatchingmode). 。これにより、認識機は、毎回文法ツリー全体を再構築することなく、質の高い認識を得るのに十分なコンテキストを提供します。