你好,我尝试创建一个简单的AI程序,因此我定义了两个语法并加载它们,但出现了这个错误:至少需要加载一个语法才能进行识别。Visual Studio的错误信息是:
在System.Speech.dll中发生类型为’System.InvalidOperationException’的异常,但在用户代码中未处理
附加信息:至少需要加载一个语法才能进行识别。
这是代码,这是类定义:
class DefineGrammar{ /// <summary> /// 定义选择 /// </summary> Choices greeting; Choices DateAndTime; /// <summary> /// 定义语法变量 /// </summary> Grammar greetingGrammar; Grammar DateAndTimeGrammar; SpeechRecognitionEngine rec = new SpeechRecognitionEngine(); public void LoadGrammar() { // 把数据放入选择中 greeting = new Choices(new string[] { "hello", "how are you" }); DateAndTime = new Choices(new string[] { "what time is it", "what is today" }); // 定义语法构建器以便将选择放入其中 GrammarBuilder greetingGrammarBuillder = new GrammarBuilder(greeting); GrammarBuilder DateAndTimeGrammarBuilder = new GrammarBuilder(DateAndTime); // 将语法构建器放入语法中 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类中,你有一个SpeechRecognitionEngine类型的成员字段,当调用LoadGrammar()
时,你会向这个字段加载语法。
在你的主类中,你有另一个该类型的实例,并尝试在这个实例上进行识别操作。
现在,错误的原因是你有两个独立的SpeechRecognitionEngine实例。
解决这个问题的一种方法可以是修改你的DefineGrammar类如下:
将public void LoadGrammar()
改为public void LoadGrammar( SpeechRecognitionEngine rec )
,并删除该类中的成员字段rec
。
还有其他可能的解决方案,但这种方法可以解决问题。区别在于现在你将语法加载到主类中使用的实例,而不是另一个实例。