您好我尝试创建简单的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);
}
}
答案 0 :(得分:1)
在DefineGrammar类中,如果调用了LoadGrammar()
,则会有一个SpeechRecognitionEngine类型的成员字段,您可以在其中加载语法。
在您的主类中,您有该类型的其他实例,您尝试在该实例上调用识别。
现在,错误是您有两个单独的SpeechRecognitionEngine实例。
解决此问题的一种方法是更改DefineGrammar,如下所示:
而不是public void LoadGrammar()
使其成为public void LoadGrammar( SpeechRecognitionEngine rec )
并删除该类中的成员字段rec
。
还有其他可能性,但这将完成这项工作。不同的是,现在您将语法加载到主类中使用的实例,而不是另一个。