SpeechRecognition将背景噪声识别为语音

时间:2015-02-16 16:57:55

标签: c# speech-recognition noise

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

例如,如果用我的手指拍打,点击桌子,或移动我的椅子,它会将其作为演讲选择。

为什么在世界范围内它会将背景噪音识别为语音。

我啪的一声,听起来不像我说的那样#34;记事本" !!!

这是代码

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");
        }
}

}

3 个答案:

答案 0 :(得分:4)

避免使用任何过滤算法,您可以检查当前显示的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();
    }        
}

答案 1 :(得分:1)

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

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

将灵敏度降低到20或30左右就可以了。 enter image description here A more appropriate sensitivity

答案 2 :(得分:1)

识别器拒绝非语音声音的强度和强度,从识别器到识别器的差异很大。我使用Microsoft识别器的经验是,它很难找到单词。例如,使用DragonDictate或谷歌网络识别,你可以抓住你的手指或咳嗽,他们被拒绝。此外,Microsoft识别器会积极跟踪音频电平,因此如果它听到很多安静,它将在内部模拟通过缩小检测阈值来增加增益。 (我经历过它认识到纸张的沙沙声或空调声音作为人类的言语。)

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

您目前正在收听: “Open”,“Close”,“Then”,“Volume”,“Up”,“Firefox”,“Notepad”,“Steam”,“turn”,“the”,“now”

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

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

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