我收到System.InvalidOperationException

时间:2015-04-19 23:21:45

标签: c# .net winforms timer speech

我有一个语音激活程序,它抛出了唯一的错误。它是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;
    }

我已经为Start listen

声明了结构
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然后如果说Alexis然后程序响应没有错误。但是,如果我说Quit Listening并等待超过10秒,它将抛出异常。我已经尝试过我所知道的一切。有任何想法吗?我正在使用Visual Studio 2013社区及其在Winforms和.NET 4.5 Framework

1 个答案:

答案 0 :(得分:1)

是的,为时已晚,但对其他人来说可能有所帮助。

在SpeechRecognized事件中,SpeechRecogniser尚未完成其操作。 但是在您的代码中,您正在强制SpeechRecogniser开始收听。 SpeechRecogniser无法执行此操作。

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

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

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