我正在编写以下代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Windows.Forms;
using System.IO;
namespace US_Speech_Recognizer
{
public class RecognizeSpeech
{
private SpeechRecognitionEngine sEngine; //Speech recognition engine
private SpeechSynthesizer sSpeak; //Speech synthesizer
string text3 = "";
public RecognizeSpeech()
{
//Make the recognizer ready
sEngine = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));
//Load grammar
Choices sentences = new Choices();
sentences.Add(new string[] { "I am hungry" });
GrammarBuilder gBuilder = new GrammarBuilder(sentences);
Grammar g = new Grammar(gBuilder);
sEngine.LoadGrammar(g);
//Add a handler
sEngine.SpeechRecognized +=new EventHandler<SpeechRecognizedEventArgs>(sEngine_SpeechRecognized);
sSpeak = new SpeechSynthesizer();
sSpeak.Rate = -2;
//Computer speaks the words to get the phones
Stream stream = new MemoryStream();
sSpeak.SetOutputToWaveStream(stream);
sSpeak.Speak("I was hungry");
stream.Position = 0;
sSpeak.SetOutputToNull();
//Configure the recognizer to stream
sEngine.SetInputToWaveStream(stream);
sEngine.RecognizeAsync(RecognizeMode.Single);
}
//Start the speech recognition task
private void sEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
string text = "";
if (e.Result.Text == "I am hungry")
{
foreach (RecognizedWordUnit wordUnit in e.Result.Words)
{
text = text + wordUnit.Pronunciation + "\n";
}
MessageBox.Show(e.Result.Text + "\n" + text);
}
}
}
}
在这里,语法是我饿了
,但计算机被要求说我饿了
。但实际情况是,识别事件被触发,并表示文本完全等于我饿了
。在输出框中,您还可以检查音素!
避免这种情况的唯一方法是加载DictationGrammar
我认为提供自定义语法是限制应用程序监听不需要的所有内容的最佳方法,但似乎自定义语法失败了!
我的问题是,有没有办法避免这种情况?为什么会发生这种情况?
最佳答案
我找到了答案。 自定义语法
将通过给引擎很大的压力来过滤用户的发音,以使用提供的有限语法来识别用户的语音。
听写语法
不是这样的,它只是尝试匹配计算机理解的内容,而不是用户确切所说的内容。
可以通过训练语音引擎来最大限度地减少这种情况。
关于c# - 听写语法与自定义语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16809031/