语音识别器在处理程序中得到重复的结果

本文关键字:结果 处理 程序 语音识别 | 更新日期: 2023-09-27 18:29:19

这是我当前的代码:(之后我会解释我的问题)

Choices sList;
Grammar gr;
SpeechRecognitionEngine sRecognize = new SpeechRecognitionEngine();
private void BtnStartLuister_Click(object sender, EventArgs e)
    {
        sList = new Choices();
        sList.Add(new string[] { "hallo", "ik", "ben", "Ken", "zoek", "exit", "leeg", "stop", "add" });
        gr = new Grammar(new GrammarBuilder(sList));
        BtnStartLuister.Enabled = false;
        BtnStopLuister.Enabled = true;
        try
        {
            //sRecognize.MaxAlternates = 0;
            sRecognize.RequestRecognizerUpdate();
            sRecognize.LoadGrammar(gr);
            sRecognize.SpeechRecognized += sRecognize_SpeechRecognized;
            sRecognize.SetInputToDefaultAudioDevice();
            sRecognize.RecognizeAsync(RecognizeMode.Multiple);
            sRecognize.Recognize();
        }
        catch
        {
            return;
        }
    }
    private void BtnStopLuister_Click(object sender, EventArgs e)
    {
        sRecognize.RecognizeAsyncStop();
        BtnStartLuister.Enabled = true;
        BtnStopLuister.Enabled = false;
    }
    private void sRecognize_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        switch (e.Result.Text)
        {
            case "exit": { Application.Exit(); break; }
            case "stop": { BtnStopLuister_Click(sender, e); break; }
            case "zoek": { btnZoek_Click(sender, e); break; }
            case "add": { VoegToeBtn_Click(sender, e); break; }
            case "leeg": { tbWoord.Clear(); break; }
            default: { tbWoord.Text = tbWoord.Text + e.Result.Text.ToString() + " "; break; }
        }
    }

因此,如果我点击"BtnStartLuister",它将开始收听sList中的单词。效果很好,如果情况是默认的,可以将它们输出到tbWoord(我表单中的一个文本框)。现在是实际问题:如果我按下按钮"BtnStopLuister",它将停止侦听等。如果我再次按下"BtnStartLuister",然后说"Ken",它会输出两次"Ken"。我试着调试了一下,似乎有一些e.Result携带的Alternate。对我来说很好,但我不希望它们输出到我的文本框中。

有人知道怎么解决这个问题吗?任何帮助都将不胜感激:)

(顺便说一句,我对C#(一般来说是编程)很陌生;很抱歉,如果有一些变量名部分是荷兰语)

语音识别器在处理程序中得到重复的结果

CodeCaster在评论中说了什么:

sRecognize.SpeechRecognized += sRecognize_SpeechRecognized; 

每次BtnStartLuister_Click方法运行时,您都订阅该事件。在停止按钮事件处理程序中取消订阅。"