SpeechRecognition 将背景噪音识别为语音
SpeechRecognition recognizes background noise as speech
我在我的程序中使用 MSDN 的 SpeechRecognitionEngine
。问题是它将背景噪音识别为语音。
例如,如果打响指、点击 table 或移动我的椅子,它会将其拾取为语音。
为什么它会将背景噪音识别为语音。
我打响指的声音和我说的不一样 "Notepad"!!!
这是代码
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");
}
}
}
避免任何过滤算法,您可以检查当前显示的 Confidence 属性。它介于 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 左右就可以了。
识别器拒绝非语音声音的内容和强度因识别器而异。我对 Microsoft 识别器的体验是它非常努力地寻找单词。例如,使用 DragonDictate 或 Google 网络识别,您可以打响指或咳嗽,但它们会被拒绝。此外,Microsoft 识别器会主动跟踪音频电平,因此如果它听到很多安静的声音,它会在内部模拟通过降低检测阈值来增加增益。 (我有过将文件的沙沙声或air-conditioning的声音识别为人类语音的体验。)
我用了很多年并取得巨大成功的一个解决方案有点counter-intuitive。您需要添加自己的 "garbage" 语音模型。由于您只是使用单词列表而不是复杂的语法,因此这应该很好用并且很容易做到。
您目前正在收听:
"Open"、"Close"、"Then"、"Volume"、"Up"、"Firefox"、"Notepad"、"Steam"、"turn"、"the"、"now"
您应该在(您正在收听的)列表中添加一些有些相似(但不)相似的词。例如,添加 "apron" 和 "happen" 将有效地成为单词 "open" 附近的美人计。当结果出现时,您可以更加相信这个人实际上说了 "open"。此外,添加一些与命令词无关的短词会捕获更多非语音声音。我怀疑"tap"打响指的时候很有可能被认出来
总结一下:识别这个较长的单词列表,但仅当它们在您的命令列表中时才对它们采取行动。如果您在代码中使用 case 语句,那么这非常简单,只需在您的命令上分支即可。否则,您需要针对 "good" 列表进行测试。
注意:当您使用语音识别语法进行更复杂的识别时,此技术也适用。您只需将所有这些 "garbage" 个短语置于名为 "garbage" 的语法规则下,您就可以拒绝该规则识别的任何话语。
我在我的程序中使用 MSDN 的 SpeechRecognitionEngine
。问题是它将背景噪音识别为语音。
例如,如果打响指、点击 table 或移动我的椅子,它会将其拾取为语音。
为什么它会将背景噪音识别为语音。
我打响指的声音和我说的不一样 "Notepad"!!!
这是代码
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");
}
}
}
避免任何过滤算法,您可以检查当前显示的 Confidence 属性。它介于 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 左右就可以了。
识别器拒绝非语音声音的内容和强度因识别器而异。我对 Microsoft 识别器的体验是它非常努力地寻找单词。例如,使用 DragonDictate 或 Google 网络识别,您可以打响指或咳嗽,但它们会被拒绝。此外,Microsoft 识别器会主动跟踪音频电平,因此如果它听到很多安静的声音,它会在内部模拟通过降低检测阈值来增加增益。 (我有过将文件的沙沙声或air-conditioning的声音识别为人类语音的体验。)
我用了很多年并取得巨大成功的一个解决方案有点counter-intuitive。您需要添加自己的 "garbage" 语音模型。由于您只是使用单词列表而不是复杂的语法,因此这应该很好用并且很容易做到。
您目前正在收听: "Open"、"Close"、"Then"、"Volume"、"Up"、"Firefox"、"Notepad"、"Steam"、"turn"、"the"、"now"
您应该在(您正在收听的)列表中添加一些有些相似(但不)相似的词。例如,添加 "apron" 和 "happen" 将有效地成为单词 "open" 附近的美人计。当结果出现时,您可以更加相信这个人实际上说了 "open"。此外,添加一些与命令词无关的短词会捕获更多非语音声音。我怀疑"tap"打响指的时候很有可能被认出来
总结一下:识别这个较长的单词列表,但仅当它们在您的命令列表中时才对它们采取行动。如果您在代码中使用 case 语句,那么这非常简单,只需在您的命令上分支即可。否则,您需要针对 "good" 列表进行测试。
注意:当您使用语音识别语法进行更复杂的识别时,此技术也适用。您只需将所有这些 "garbage" 个短语置于名为 "garbage" 的语法规则下,您就可以拒绝该规则识别的任何话语。