You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:03:08