首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpeechRecognition识别背景噪声为语音

SpeechRecognition识别背景噪声为语音
EN

Stack Overflow用户
提问于 2015-02-16 16:57:55
回答 3查看 2.8K关注 0票数 6

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

例如,如果敲击我的手指,敲击桌子,或移动我的椅子,它就会把它当作语音。

为什么在世界范围内,它把背景噪声识别为语音。

我咬我的手指不像我说“记事本”!

这是代码

代码语言:javascript
复制
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");
        }
}

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-16 22:56:48

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

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

把敏感度降低到20或30左右就成功了。

票数 1
EN

Stack Overflow用户

发布于 2015-02-16 20:09:56

避免使用任何过滤算法,您可以检查当前显示的信心属性。它介于0.01.0之间,其中1非常自信。我发现0.7运行得很好,但是您可以处理反复的问题。

代码语言:javascript
复制
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();
    }        
}
票数 4
EN

Stack Overflow用户

发布于 2015-02-17 22:46:07

从识别器到识别器,非语音声音被拒绝的程度和强度有很大的不同。我使用微软识别器的经验是,它非常努力地寻找单词。例如,使用DragonDictate或Google识别,你可以折断手指或咳嗽,但它们却被拒绝了。此外,微软的识别器积极跟踪音频水平,因此,如果它听了大量的安静,它将在内部模拟通过缩小检测阈值来增加增益。(我经历过,它认识到文件的沙沙声或空调的声音是人类的语言。)

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

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

您应该在列表中添加(您正在收听的)一些类似的单词(但也不是)。例如,添加“围裙”和“发生”实际上将是蜂蜜陷阱附近的“开放”一词。当结果出现时,你可以更多地相信那个人真的说了“打开”。此外,添加一些与命令词无关的简短单词将捕获更多的非语音声音。我怀疑当你敲击手指时,“踢踏舞”可能会被识别出来。

概括地说:承认这个较长的单词列表,但只有当它们在命令列表中时才采取行动。如果在代码中使用case语句,那么这是非常简单的,只是命令的分支。否则,您需要根据“好”列表进行测试。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28546498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档