在进行识别之前必须至少加载一种语法
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 中使用的实例,而不是其他实例。
你好,我尝试创建简单的 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 中使用的实例,而不是其他实例。