2015-04-19 39 views
1

我有一个语音激活程序抛出的唯一错误。它的System.InvalidOperationException我尝试了很多方法,我无法弄清楚为什么它没有被纠正。我recieving的System.InvalidOperationException

我使用System.Speech。我有一个计时器,并在计时器中,我已启用它并将其从True切换为False并将False切换为True。它也没有解决这个问题。

我宣布我的课

SpeechRecognitionEngine startlistening = new SpeechRecognitionEngine(); 

我指定我的活动

startlistening.SetInputToDefaultAudioDevice(); 
startlistening.LoadGrammarAsync(new Grammar(new GrammarBuilder(new Choices("alexis")))); 
startlistening.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(startlistening_SpeechRecognized); 

,然后我把命令

case "quit listening":  
Alexis.SpeakAsync("I will await further commands "); 
_recognizer.RecognizeAsyncCancel(); 
startlistening.RecognizeAsync(RecognizeMode.Multiple); 
break; 

的话,我已经把我的定时器

private void tmrSpeech_Tick(object sender, EventArgs e) 
    { 
     if (recTimeOut == 10) 
     { 
      _recognizer.RecognizeAsyncCancel(); 
     } 
     else if (recTimeOut == 11) 
     { 
      startlistening.RecognizeAsync(RecognizeMode.Multiple); 
      tmrSpeech.Stop(); 
      recTimeOut = 0; 
     } 
     recTimeOut += 1; 
    } 

我已经宣布了启动监听

void startlistening_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 

     string speech = e.Result.Text; 
     switch (speech) 
     { 
      case "alexis": 
       startlistening.RecognizeAsyncCancel(); 
       Alexis.SpeakAsync("I am back online"); 
       _recognizer.RecognizeAsync(RecognizeMode.Multiple); 
       break; 
     } 
    } 

我很茫然的结构。我有所有的参考设置,以及定时器设置在

Enabled False 
Interval 10000 
GenerateMember True 
Modifiers Private 

有没有我丢失的东西。当我告诉程序退出侦听时,它使用AsyncCancel,然后如果说亚历克西斯那么程序响应没有错误。但是,如果我说Quit Listening并等待超过10秒钟,它将抛出异常。我已经尝试了我所知道的一切。有任何想法吗?我使用Visual Studio 2013群落及其WinForms和.NET 4.5框架

+5

什么异常说呢? – SLaks

+0

包含例外的全文,该消息将包含重要细节 –

+0

以及哪行代码导致异常... –

回答

1

是为时已晚,但对于其他人可能会有所帮助。

在SpeechRecognized事件SpeechRecogniser还没有完成它的作用。 但在您的代码中,您正在强制SpeechRecogniser开始收听。 SpeechRecogniser无法执行此操作。

startlistening.RecognizeAsyncCancel(); 
Alexis.SpeakAsync("I am back online"); 
_recognizer.RecognizeAsync(RecognizeMode.Multiple); 

您应该在SpeechRecognized事件完成执行后开始收听。

您可以使用RecognizeCompleted事件, _recognizer.RecognizeAsync(RecognizeMode.Multiple);

相关问题