【问题标题】:Recognition reads twice after stopping it and resuming it again?识别在停止并再次恢复后读取两次?
【发布时间】:2015-05-11 15:08:50
【问题描述】:

我制作了一个语音处理程序对象,当我第一次使用按钮打开语音识别并对其进行测试时,它的响应很好。但是当我用命令停止语音识别并用按钮再次切换它时,如果我一次又一次地停止和恢复,它会重复两次和三次甚至更多次语音。 这是我的代码:

private void simpleButton1_Click(object sender, EventArgs e)
    {
        try
        {
            JARVIS.Dispose();
            JARVIS= new SpeechSynthesizer();
            JARVIS.Speak("How can i help you sir?");
            _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("test")));
            _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("good bye")));

            _recognizer.SpeechRecognized += _recognizer_SpeechRecognized;
            _recognizer.SetInputToDefaultAudioDevice();
            _recognizer.RecognizeAsync(RecognizeMode.Multiple);
        }
        catch
        {

        }
    }
    private void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        try
        {

            if (e.Result.Text == "test") // e.Result.Text contains the recognized text
            {
                JARVIS.Speak("Test was successful!!");
            }
            if (e.Result.Text == "good bye")
            {
                JARVIS.Speak("Good Bye sir");
                JARVIS.Dispose(); 
            }
        }
    }

【问题讨论】:

    标签: c# speech-recognition speech-synthesis


    【解决方案1】:

    发生这种情况是因为您向事件添加了两次处理程序而没有在此处删除之前添加的处理程序:

    _recognizer.SpeechRecognized += _recognizer_SpeechRecognized;
    

    如果设计得当,您的代码应如下所示:

    // invoke this method only once when you setup the whole system
    private void init() {
            JARVIS= new SpeechSynthesizer();
            _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("test")));
            _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("good bye")));
            _recognizer.SpeechRecognized += _recognizer_SpeechRecognized;
            _recognizer.SetInputToDefaultAudioDevice();
    
    }
    
    // Recognizer is already configured, just speak and recognize
    private void simpleButton1_Click(object sender, EventArgs e)
    {
            JARVIS.Speak("How can i help you sir?");
            _recognizer.RecognizeAsync(RecognizeMode.Multiple);
    }
    
    // Handler for recognition results
    private void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
            if (e.Result.Text == "test") { // e.Result.Text contains the recognized text
                JARVIS.Speak("Test was successful!!");
            }
            if (e.Result.Text == "good bye") {
                JARVIS.Speak("Good Bye sir");
            }
    }
    

    【讨论】:

    • 谢谢老哥,在按钮点击处理程序中取出处理程序解决了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多