C# 语音识别将背景噪声识别为语音

C# 语音识别将背景噪声识别为语音,c#,speech-recognition,noise,C#,Speech Recognition,Noise,我正在程序中使用MSDN的SpeechRecognitionEngine。问题是它将背景噪音识别为语音 例如,如果我的手指折断,轻拍桌子,或者移动椅子,它就会把这些当作演讲 为什么它会把背景噪音认作语音呢 我弹手指的声音和我说“记事本”的声音不一样 这是密码 using System; using System.Threading; using System.Speech; using System.Speech.Synthesis; using System.Speech.Recognitio

我正在程序中使用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");
        }
}

}

避免使用任何过滤算法,您可以检查当前显示的属性。它的范围介于
0.0
1.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();
    }        
}

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

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


将灵敏度降低到20或30左右就成功了

识别器对非语音声音的拒绝程度和拒绝程度因识别器而异。我使用微软识别器的经验是,它很难找到单词。例如,使用DragonDetect或Google web识别,您可以折断手指或咳嗽,但被拒绝。此外,Microsoft识别器还积极跟踪音频级别,因此如果它收听大量的静音,它将在内部模拟通过降低检测阈值来增加增益。(我曾体验过,将纸张沙沙作响或空调声视为人类的语言。)

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

您当前正在收听: “打开”、“关闭”、“然后”、“音量”、“向上”、“Firefox”、“记事本”、“蒸汽”、“旋转”、“现在”

您应该在列表(您正在收听的)中添加一些有点相似(但不太相似)的单词。例如,添加“停机坪”和“发生”将有效地成为“开放”一词附近的蜂蜜陷阱。你可以更加相信,当结果出现时,那个人实际上说了“打开”。此外,添加一些与命令词无关的短单词将捕获更多的非语音。我怀疑当你折断手指时,很可能会认出“轻敲”

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


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

阅读文档时,您可能需要查看BabbleTimeout、InitialSilenceTimeout、EndSilenceTimeout、,和EndSilenceTimeOutUnligular属性?刚刚更新了代码并将所有这些属性设置为0。没有改变thing@JackBarn为什么要为
BabbleTimeout
尝试0?我没有检查其他人,但是对于
BabbleTimeout
0是默认值。几秒钟后的值会发生什么情况?@SAM我将其设置为ti 0以排除任何posiblite。我改变它的值没有任何作用。我怀疑,在这种情况下,报告的“讲话”的置信度很低。低置信度的结果有点像你在静默中仔细聆听可能的声音;如果你认真听的话,你可能会发现一些听起来像说话的东西,但你可能不会打赌。我已经试过了。大多数情况下,它都能认出我在说一个词,以及背景噪音,并有着同样的自信。大约0.90到0.95。检查系统上的麦克风设置是否正确。你可能太敏感了,是的。调低麦克风的灵敏度显示了准确度的重大提高。当时是100,但我现在把它调低到20。偶尔还是会出现误报(仍然非常令人恼火,但现在就可以了)