在进行识别之前必须至少加载一种语法

at least one grammar must be loaded before doing a recognition

你好,我尝试创建简单的 AI 程序,所以我定义了两个语法并加载它们,但出现此错误至少必须加载一个语法才能进行识别。 来自 visual studio 的错误是:

An exception of type 'System.InvalidOperationException' occurred in System.Speech.dll but was not handled in user code
Additional information: At least one grammar must be loaded before doing a recognition.

这是代码 这是 class

class DefineGrammar
{
    /// <summary>
    /// Define Choices
    /// </summary>
    Choices greeting;
    Choices DateAndTime;


    /// <summary>
    /// Define the Grammar var
    /// </summary>
    Grammar greetingGrammar;
    Grammar DateAndTimeGrammar;

    SpeechRecognitionEngine rec = new SpeechRecognitionEngine();

    public void LoadGrammar()
    {
        // put the data inside the choice
        greeting = new Choices(new string[] { "hello", "how are you" });
        DateAndTime = new Choices(new string[] { "what time is it", "what is today" });

        // Define Grammar builder to put the choice inside it
        GrammarBuilder greetingGrammarBuillder = new GrammarBuilder(greeting);
        GrammarBuilder DateAndTimeGrammarBuilder = new GrammarBuilder(DateAndTime);

        //put the grammar builder inside the grammar
        greetingGrammar = new Grammar(greetingGrammarBuillder);
        greetingGrammar.Name = "GreetingGrammar";
        DateAndTimeGrammar = new Grammar(DateAndTimeGrammarBuilder);
        DateAndTimeGrammar.Name = "DateAndTimeGrammar";

        rec.LoadGrammar(greetingGrammar);
        rec.LoadGrammar(DateAndTimeGrammar);

    }
}

这是主页:

public partial class MainWindow : Window
{
    SpeechSynthesizer s = new SpeechSynthesizer();
    SpeechRecognitionEngine rec = new SpeechRecognitionEngine();
    DefineGrammar gr = new DefineGrammar();

    public MainWindow()
    {
        rec.RequestRecognizerUpdate();
        gr.LoadGrammar();
        rec.SpeechRecognized += Rec_SpeechRecognized;
        rec.SetInputToDefaultAudioDevice();
        rec.RecognizeAsync(RecognizeMode.Multiple);
    }
}

在您的 DefineGrammar class 中,您有一个 SpeechRecognitionEngine 类型的成员字段,如果 LoadGrammar() 被调用,您可以将语法加载到该字段。

在您的主要 class 中,您有 一个不同的 类型的实例,您试图在该实例上调用识别。

现在,错误是您有两个单独的 SpeechRecognitionEngine 实例。

解决此问题的一种方法是按如下方式更改 DefineGrammar:

public void LoadGrammar() 改为 public void LoadGrammar( SpeechRecognitionEngine rec ) 并删除 class.

中的成员字段 rec

还有其他可能性,但这可以完成工作。不同之处在于,现在您将语法加载到主 class 中使用的实例,而不是其他实例。