【问题标题】:System.Speech.Recognition fails to accurately recognize continuous inputSystem.Speech.Recognition 无法准确识别连续输入
【发布时间】:2014-02-04 22:55:02
【问题描述】:

我有一个使用 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
    // ...
}

【问题讨论】:

  • 这与速度无关。可能你只是写错了你的语法,它不允许连续识别。展示你的语法。
  • 特别是当您创建语法构建器时,您需要正确指定允许的重复次数。
  • 我进行了编辑以包含我的语法。您提出的解决方案是否仍然适用?

标签: c# speech-recognition speech-to-text


【解决方案1】:

代替

gb.Append(numbers);

这指定识别孤立的数字尝试类似

gb.Append(new GrammarBuilder(numbers), 1, 5);

这将允许识别最多 5 个数字的数字序列。根据需要调整重复次数。

【讨论】:

  • 哇。我没有认为语法是罪魁祸首。谢谢。顺便说一句,拥有像 20 左右这样的大数字有缺点吗?只是内存使用?我可以忍受。
  • 没有明显的缺点,这完全取决于您要解决的任务。如果你想允许多次重复也没关系。
猜你喜欢
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多