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


然后,在SpeechRecognized事件上,我输入了一个逻辑,即如果识别出占位符,则启用命令。如果识别出命令,请重新启用命令并禁用所有命令:

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}
}

10-08 13:48
查看更多