C# 为什么微软的语音识别系统会匹配语法,即使没有说过语法中的单词?

C# 为什么微软的语音识别系统会匹配语法,即使没有说过语法中的单词?,c#,speech-recognition,grammar,.net-4.6,system.speech.recognition,C#,Speech Recognition,Grammar,.net 4.6,System.speech.recognition,我正在使用c#和System.Speech.Recognition加载我定义的几个简单语法。当我说出与语法匹配的短语时,引擎会正确识别语法,置信度约为0.95 但是,当我发语法中没有的单词时(即使来自不同的语言或胡言乱语),引擎会随机返回一个匹配到语法的匹配项,该语法中的随机文本从未发过音,并且仍然具有高置信度,如0.92 我是否需要在SpeechRecognitionEngine对象或每个语法对象中设置一些内容来避免此问题?我想我找到了一个适合我的解决方案,但如果存在的话,最好找到一个更优雅的

我正在使用c#和System.Speech.Recognition加载我定义的几个简单语法。当我说出与语法匹配的短语时,引擎会正确识别语法,置信度约为0.95

但是,当我发语法中没有的单词时(即使来自不同的语言或胡言乱语),引擎会随机返回一个匹配到语法的匹配项,该语法中的随机文本从未发过音,并且仍然具有高置信度,如0.92


我是否需要在SpeechRecognitionEngine对象或每个语法对象中设置一些内容来避免此问题?

我想我找到了一个适合我的解决方案,但如果存在的话,最好找到一个更优雅的解决方案:

我定义了听写语法和“占位符”。然后我加载语法并立即禁用它们

using System.Speech.Recognition;
...

private DictationGrammar dictationGrammar;
private Grammar placeholderGrammar;
private List<Grammar> commands;

public void Initialize()
{
    dictationGrammar = new DictationGrammar();
    recognizer.LoadGrammarAsync(dictationGrammar);

    var builder = new GrammarBuilder();
    builder.Append("MYPLACEHOLDER");        
    placeholderGrammar = new Grammar(builder);
    recognizer.LoadGrammarAsync(placeholderGrammar);

    commands = new List<Grammar>();

    foreach (var grammar in grammarManager.GetGrammars())
    {
        commands.Add(grammar);           
        grammar.Enabled = false;
        recognizer.LoadGrammarAsync(grammar);
    }
}
需要明确的是,“MYPLACEHOLDER”是您选择执行任何命令的单词或短语
private async void speechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    if (e.Result.Grammar == placeholderGrammar)
    {
        //go to command mode
        placeholderGrammar.Enabled = false;
        dictationGrammar.Enabled = false;

        foreach (var item in commands)
            item.Enabled = true;
    }
    else if (commands.Any(x => e.Result.Grammar == x))
    {
        Do_something_with_recognized_command("!!");

        //go back in normal mode
        placeholderGrammar.Enabled = true;
        dictationGrammar.Enabled = true;
    }else {//this is dictation.. nothing to do}
}