我有一个使用SpeechRecognitionEngine在System.Speech上很好地识别语音的程序。然而,尽管准确,它似乎扔掉了它收到的一些音频输入。如果我说“一,二,三”在每个单词之间有暂停,它会正确地转录每个作品。但是,如果我在每个单词之间没有停顿地说它们,它将正确地转录第一个单词,有时甚至是第三个单词。第二个词被忽略了。
其他人遇到过这个问题,但我无法发现他们的解决方案。 Microsoft Speech Recognition Speed
如果我可以,我想将录音机音频位置设置为音频流中的较早点,但我没有在API中找到允许我这样做的功能。我正在考虑的另一种方法是拥有多个识别引擎,每个识别引擎都会尝试只使用一个单词,并在完成处理该单词后重复使用,但这是一个非常复杂且资源匮乏的解决方案。
对此问题的任何帮助将不胜感激。
我把它剪切到这段C#代码:
public void Init()
{
// Create an in-process speech recognizer for the en-US locale.
var cultureInfo = new System.Globalization.CultureInfo("en-US");
recognizer_ = new SpeechRecognitionEngine(cultureInfo);
// Create and load a dictation grammar.
var numbers = new Choices();
numbers.Add(new string[] { "one", "two", "three" });
// Create a GrammarBuilder object and append the Choices object.
GrammarBuilder gb = new GrammarBuilder();
gb.Append(numbers);
var g = new Grammar(gb);
recognizer_.LoadGrammar(g);
// Add a handler for the speech recognized event.
recognizer_.SpeechRecognized +=
new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
recognizer_.SpeechDetected += recognizer_SpeechDetected;
// Configure input to the speech recognizer.
recognizer_.SetInputToDefaultAudioDevice();
// Start asynchronous, continuous speech recognition.
recognizer_.RecognizeAsync(RecognizeMode.Multiple);
}
void recognizer_SpeechDetected(object sender, SpeechDetectedEventArgs e)
{
Console.WriteLine("\nspeech detected event audio position:\t\t" + e.AudioPosition);
Console.WriteLine("speech detected current audio position:\t\t" + recognizer_.AudioPosition);
Console.WriteLine("speech detected recognizer audio position:\t" + recognizer_.RecognizerAudioPosition);
}
// Handle the SpeechRecognized event.
void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
Console.WriteLine("speech recognized event audio position:\t\t" + e.Result.Audio.AudioPosition);
Console.WriteLine("speech recognized event audio start time: " + e.Result.Audio.StartTime);
Console.WriteLine(e.Result.Text);
// do things
// ...
}
答案 0 :(得分:2)
而不是
gb.Append(numbers);
其中指定识别孤立的数字尝试类似
gb.Append(new GrammarBuilder(numbers), 1, 5);
这将允许识别最多5个数字的数字序列。根据您的需要调整重复次数。