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

时间:2017-01-20 10:05:14

标签: c# artificial-intelligence voice-recognition

您好我尝试创建简单的AI程序,所以我定义了两个语法并加载它们,我得到这个错误,在进行识别之前必须至少加载一个语法。 视觉工作室的错误是:

  

System.Speech.dll中出现“System.InvalidOperationException”类型的异常但未在用户代码中处理
  附加信息:在进行识别之前,必须至少加载一个语法。

这是代码 这是班级

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

1 个答案:

答案 0 :(得分:1)

在DefineGrammar类中,如果调用了LoadGrammar(),则会有一个SpeechRecognitionEngine类型的成员字段,您可以在其中加载语法。

在您的主类中,您有该类型的其他实例,您尝试在该实例上调用识别。

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

解决此问题的一种方法是更改​​DefineGrammar,如下所示:

而不是public void LoadGrammar()使其成为public void LoadGrammar( SpeechRecognitionEngine rec )并删除该类中的成员字段rec

还有其他可能性,但这将完成这项工作。不同的是,现在您将语法加载到主类中使用的实例,而不是另一个。