【问题标题】:SpeechRecognition recognizes background noise as speechSpeechRecognition 将背景噪声识别为语音
【发布时间】:2015-04-17 06:19:08
【问题描述】:

我在我的程序中使用 MSDN 的 SpeechRecognitionEngine。问题在于它将背景噪音识别为语音。

例如,如果我打响指、敲击桌子或移动我的椅子,它会将这些内容作为语音来识别。

为什么它会将背景噪音识别为语音。

我打响指听起来不像我说“记事本”!!!

这里是代码

using System;
using System.Threading;
using System.Speech;
using System.Speech.Synthesis;
using System.Speech.Recognition;

namespace SpeachTest
{
    public class MainClass
    {
        static void Main()
        {
        MainClass main = new MainClass(); 
        SpeechRecognitionEngine sre = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));
            Choices choiceList = new Choices();
            choiceList.Add(new string[]{"Open", "Close", "Then", "Volume", "Up", "Firefox", "Notepad", "Steam","turn", "the", "now" } );

            GrammarBuilder builder = new GrammarBuilder();
            builder.Append(choiceList);
            Grammar grammar = new Grammar(new GrammarBuilder(builder,0, 10) );

            sre.SpeechRecognized += main.sreRecognizedEvent;
            sre.SpeechDetected += main.sreDetectEvent;
            sre.SpeechRecognitionRejected += main.sreRejectEvent;
            sre.RecognizeCompleted += main.sreCompleteEvent;

            sre.InitialSilenceTimeout = TimeSpan.FromSeconds(0);
            sre.BabbleTimeout = TimeSpan.FromSeconds(0);
            sre.EndSilenceTimeout = TimeSpan.FromSeconds(0);
            sre.EndSilenceTimeoutAmbiguous = TimeSpan.FromSeconds(0);


            sre.SetInputToDefaultAudioDevice();
            sre.LoadGrammar(grammar);

            while(true){
            sre.Recognize();
            }
        }


        void sreRecognizedEvent(Object sender, SpeechRecognizedEventArgs e){
        Console.Write("Reconized ~ " + e.Result.Text + " ~ with confidence " + e.Result.Confidence);
        Console.WriteLine();
        }


        void sreDetectEvent(Object sender, SpeechDetectedEventArgs e){
        Console.WriteLine("Detected some type of input");
        }

        void sreRejectEvent(Object sender,  SpeechRecognitionRejectedEventArgs e){
        Console.WriteLine("Rejected Input ~ " + e.Result.Text) ;
        }

        void sreCompleteEvent(Object sender, System.Speech.Recognition.RecognizeCompletedEventArgs e){
        Console.WriteLine("Completed Recongnization");
        }
}

}

【问题讨论】:

  • 阅读文档,您可能想查看 BabbleTimeout、InitialSilenceTimeout、EndSilenceTimeout 和 EndSilenceTimeoutAmbiguous 属性?
  • 刚刚更新了代码并添加了所有设置为 0 的属性。没有改变任何东西
  • @JackBarn 你为什么要为BabbleTimeout 尝试0?我没有检查其他人,但BabbleTimeout 0 是默认值。几秒钟左右的值会发生什么?
  • @SAM 我将其设置为 ti 0 以排除任何 poisiblites。我改变它的价值没有做任何事情。
  • 我怀疑在这种情况下,报告的“语音”的置信度得分非常低。低置信度结果有点像您在静态中仔细聆听可能的声音;如果你足够认真地听,你可能会发现一些听起来有点像演讲的东西,但你可能不会打赌。

标签: c# speech-recognition noise


【解决方案1】:

避免任何过滤算法,您可以检查您当前显示的Confidence 属性。它的范围在 0.01.0 之间,其中 1 非常有信心。我发现0.7 效果很好,但你可以反复试验。

void sreRecognizedEvent(Object sender, SpeechRecognizedEventArgs e)
{
    if(e.Result.Confidence >= 0.7)
    {
        Console.Write("Reconized ~ " + e.Result.Text + " ~ with confidence " + e.Result.Confidence);
        Console.WriteLine();
    }        
}

【讨论】:

  • 我已经试过了。大多数时候,它会以同样的自信识别出我说的一句话和背景噪音。大约 0.90 到 0.95。
  • 检查系统上的麦克风设置是否正确。你可能太敏感了。
  • 是的。调低我的麦克风灵敏度表明准确性有了很大提高。本来是 100,但我现在把它调低到 20。仍然偶尔会出现误报(仍然很烦人,但暂时可以)
【解决方案2】:

原来我的麦克风灵敏度太高了。准确地说,非常非常高。它是 100,这意味着它会拾取最小的声音(例如背景噪音)。

我的猜测是,这些小声音会被放大到如此高的程度,以至于SpeechRecognitionEngine 很难将其与实际语音区分开来。

将灵敏度降低到 20 或 30 左右就可以了。

【讨论】:

    【解决方案3】:

    识别器拒绝非语音声音的内容和强度因识别器而异。我对 Microsoft 识别器的体验是它非常努力地寻找单词。例如,使用 DragonDictate 或 Google 网络识别,您可以打响指或咳嗽,但它们会被拒绝。此外,Microsoft 识别器积极地跟踪音频电平,因此如果它听到很多安静的声音,它将在内部模拟通过缩小检测阈值来增加增益。 (我体验过它可以将纸张的沙沙声或空调的声音识别为人类语言。)

    我多年来一直使用并取得巨大成功的解决方案有点违反直觉。您需要添加自己的“垃圾”语音模型。由于您只是使用单词列表而不是复杂的语法,因此这应该很好用并且很容易做到。

    您目前正在收听: “打开”、“关闭”、“然后”、“音量”、“向上”、“Firefox”、“记事本”、“Steam”、“转”、“该”、“现在”

    您应该在列表中(您正在听的)添加一些有些(但不是)相似的单词。例如,添加“围裙”和“发生”将有效地成为“开放”一词附近的蜜罐。你可以更相信这个人在结果出现时实际上说的是“开放”。此外,添加一些与您的命令词无关的短词会捕获更多的非语音。我怀疑当你打响指时可能会识别“点击”。

    总结:识别这个较长的单词列表,但仅当它们在您的命令列表中时才对它们进行操作。如果您在代码中使用 case 语句,那么这非常简单,只在您的命令上分支。否则,您需要根据“好”列表进行测试。

    注意:当您使用语音识别语法进行更复杂的识别时,此技术也适用。您只需将所有这些“垃圾”短语置于名为“垃圾”的语法规则下,您就可以拒绝该规则识别的任何话语。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多