SpeechRecognitionEngine无法切换至fr-CA CultureInfo,识别质量待优化
如何让SpeechRecognitionEngine使用fr-CA文化信息并提升法语加拿大语音识别质量?
我正在构建一项服务,用于读取指定位置的音频文件并向对应负责人发送邮件。目前应用虽能运行,但识别效果不佳——当说话不清晰时,识别结果多为乱码。
问题核心:我希望服务使用本地的fr-CA CultureInfo来提升识别质量,但它始终默认使用fr-FR。我已将电脑全局配置为fr-CA,也参考了官方相关文档进行开发,但尝试多种方法后仍未解决问题。
当前代码
using System; using System.IO; using System.Globalization; using System.Speech.AudioFormat; using System.Speech.Recognition; using System.Threading; namespace DefaultInput { class Program { // Indicate whether asynchronous recognition has finished. static bool completed; static void Main(string[] args) { using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new CultureInfo("fr-CA"))) { Console.WriteLine(" Culture: {0}", recognizer.RecognizerInfo.Culture.ToString()); // Create and load the exit grammar. GrammarBuilder gramBuild = new GrammarBuilder("exit"); gramBuild.Culture = new CultureInfo("fr-FR"); Grammar exitGrammar = new Grammar(gramBuild); exitGrammar.Name = "Exit Grammar"; recognizer.LoadGrammar(exitGrammar); // Create and load the dictation grammar. Grammar dictation = new DictationGrammar(); dictation.Name = "Dictation Grammar"; recognizer.LoadGrammar(dictation); // Attach event handlers to the recognizer. recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(SpeechRecognizedHandler); recognizer.RecognizeCompleted += new EventHandler<RecognizeCompletedEventArgs>(RecognizeCompletedHandler); Console.WriteLine(); // Assign input to the recognizer. //recognizer.SetInputToDefaultAudioDevice(); recognizer.SetInputToAudioStream(File.OpenRead(@"C:\Users\pgirard\Documents\Enregistrements audio\Enregistrement2.wav"), new SpeechAudioFormatInfo(44100, AudioBitsPerSample.Sixteen, AudioChannel.Mono)); //recognizer.SetInputToWaveFile(@"C:\Users\pgirard\Documents\Enregistrements audio\Enregistrement4.wav"); // Begin asynchronous recognition. Console.WriteLine("Starting recognition..."); completed = false; recognizer.RecognizeAsync(RecognizeMode.Multiple); // Wait for recognition to finish. while (!completed) { Thread.Sleep(333); } Console.WriteLine("Done."); } Console.WriteLine(); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } static void SpeechRecognizedHandler( object sender, SpeechRecognizedEventArgs e) { Console.WriteLine(" Speech recognized:"); string grammarName = "<not available>"; if (e.Result.Grammar.Name != null && !e.Result.Grammar.Name.Equals(string.Empty)) { grammarName = e.Result.Grammar.Name; } Console.WriteLine(" {0,-17} - {1}", grammarName, e.Result.Text); if (grammarName.Equals("Exit Grammar")) { ((SpeechRecognitionEngine)sender).RecognizeAsyncCancel(); } } static void RecognizeCompletedHandler( object sender, RecognizeCompletedEventArgs e) { Console.WriteLine(" Recognition completed."); completed = true; } } }
解决方案及优化建议
- 统一文化信息配置:当前代码中
exit语法的Culture设置为fr-FR,与SpeechRecognitionEngine初始化时的fr-CA冲突,这会导致识别器混淆文化规则。将gramBuild.Culture改为new CultureInfo("fr-CA"),确保所有语法与识别器使用相同的文化信息。 - 确认fr-CA语音识别引擎已安装:Windows系统默认可能未预装法语加拿大的语音识别包,需前往「设置-时间和语言-语音」中添加并安装对应的fr-CA语音识别引擎,否则识别器会自动 fallback 到可用的fr-FR引擎。
- 优化音频文件参数:部分语音识别引擎对采样率敏感,建议将音频转换为16kHz、16位单声道的WAV格式(当前代码用的44100Hz也可,但16kHz是很多引擎的最优采样率);同时确保音频无明显背景噪音,说话者发音清晰、语速适中。
- 显式指定DictationGrammar的文化:创建
DictationGrammar时,可通过设置属性确保它使用fr-CA文化,避免继承系统默认值:Grammar dictation = new DictationGrammar(); dictation.Culture = new CultureInfo("fr-CA"); - 调整识别超时参数:根据音频内容调整
InitialSilenceTimeout和EndSilenceTimeout,避免因停顿过长导致识别提前终止或遗漏内容:recognizer.InitialSilenceTimeout = TimeSpan.FromSeconds(2); recognizer.EndSilenceTimeout = TimeSpan.FromSeconds(1);
修改后的关键代码片段
using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new CultureInfo("fr-CA"))) { Console.WriteLine(" Culture: {0}", recognizer.RecognizerInfo.Culture.ToString()); // 统一exit语法的文化为fr-CA GrammarBuilder gramBuild = new GrammarBuilder("exit"); gramBuild.Culture = new CultureInfo("fr-CA"); Grammar exitGrammar = new Grammar(gramBuild); exitGrammar.Name = "Exit Grammar"; recognizer.LoadGrammar(exitGrammar); // 显式设置听写语法的文化 Grammar dictation = new DictationGrammar(); dictation.Culture = new CultureInfo("fr-CA"); dictation.Name = "Dictation Grammar"; recognizer.LoadGrammar(dictation); // 调整超时参数 recognizer.InitialSilenceTimeout = TimeSpan.FromSeconds(2); recognizer.EndSilenceTimeout = TimeSpan.FromSeconds(1); // 剩余代码保持不变... }
内容的提问来源于stack exchange,提问作者Magellus
相关产品推荐
相关产品推荐

