也许您想使用 .net System.Speech 命名空间而不是 SAPI?几年前在http://msdn.microsoft.com/en-us/magazine/cc163663.aspx上发表了一篇非常好的文章。这可能是迄今为止我发现的最好的介绍性文章。它有点过时了,但很有帮助。(AppendResultKeyValue 方法在 beta 之后被删除。)
您是否尝试使用共享识别器?这可能就是您看到命令的原因。您有特定的识别任务吗?在这种情况下,使用特定于任务的语法和 inproc 识别器会更好。
如果您需要处理任何单词,请使用 System.Speech 附带的 DictationGrammar。请参阅http://msdn.microsoft.com/en-us/library/system.speech.recognition.dictationgrammar%28VS.85%29.aspx
为了好玩,我拼凑了一个最简单的 .NET windows 窗体应用程序,以使用我能想到的听写语法。我创建了一个表格。在上面放了一个按钮并使按钮变大。添加了对 System.Speech 的引用和以下行:
using System.Speech.Recognition;
然后我将以下事件处理程序添加到 button1:
private void button1_Click(object sender, EventArgs e)
{
SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine();
Grammar dictationGrammar = new DictationGrammar();
recognizer.LoadGrammar(dictationGrammar);
try
{
button1.Text = "Speak Now";
recognizer.SetInputToDefaultAudioDevice();
RecognitionResult result = recognizer.Recognize();
button1.Text = result.Text;
}
catch (InvalidOperationException exception)
{
button1.Text = String.Format("Could not recognize input from default aduio device. Is a microphone or sound card available?\r\n{0} - {1}.", exception.Source, exception.Message);
}
finally
{
recognizer.UnloadAllGrammars();
}
}