语音识别器在处理程序中得到重复的结果
Speech recognizer gets duplicated results in handler
这是我当前的代码:
(之后我会解释我的问题)
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 携带的替代品。对我来说很好,但我不希望它们输出到我的文本框。
有人知道怎么解决吗?
任何帮助将不胜感激:)
(顺便说一句,我对 C#(和一般编程)还很陌生,如果有一些变量名部分用荷兰语,我很抱歉)
CodeCaster 在评论中说的:
sRecognize.SpeechRecognized += sRecognize_SpeechRecognized;
you're subscribing to the event every time the BtnStartLuister_Click method runs. Unsubscribe in the stop button event handler."
这是我当前的代码: (之后我会解释我的问题)
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 携带的替代品。对我来说很好,但我不希望它们输出到我的文本框。
有人知道怎么解决吗? 任何帮助将不胜感激:)
(顺便说一句,我对 C#(和一般编程)还很陌生,如果有一些变量名部分用荷兰语,我很抱歉)
CodeCaster 在评论中说的:
sRecognize.SpeechRecognized += sRecognize_SpeechRecognized;
you're subscribing to the event every time the BtnStartLuister_Click method runs. Unsubscribe in the stop button event handler."