SpeechRecognitionEngine 默认不监听麦克风,需显式调用 SetInputToDefaultAudioDevice();中文识别依赖系统中文语言包,语法应加载于设输入后、识别前;SpeechRecognizer 适合前台应用,SpeechRecognitionEngine 用于后台或自定义音频流。
System.Speech.Recognition 为什么识别不了麦克风输入
默认情况下,SpeechRecognitionEngine 不自动监听系统麦克风,它需要你显式指定输入源。如果你只初始化了引擎但没调用 SetInputToDefaultAudioDevice() 或 SetInputToWaveFile(),识别器会处于“就绪但无输入”状态,RecognizeAsync() 看似运行却永不触发 SpeechRecognized 事件。
实操建议:
- 必须在
SpeechRecognitionEngine实例化后、调用RecognizeAsync()前,执行recognitionEngine.SetInputToDefaultAudioDevice() - 确保系统默认录音设备已启用且未被其他程序独占(如 Teams、Zoom 占用麦克风会导致
InvalidOperationException: "The audio device is in use") - 若需后台持续识别,推荐用
RecognizeAsync(RecognizeMode.Multiple);仅识别一次用RecognizeMode.Single
如何加载中文语音识别语法(Grammar)
System.Speech 的中文识别依赖于操作系统预装的中文语言包和对应语法定义。直接用 DictationGrammar() 支持自由听写,但准确率低;更可靠的是用 GrammarBuilder 或 Grammar 加载自定义词表或 SGRML 文件。
实操建议:
- 确认系统已安装“中文(简体,中国)”语音识别语言包(控制面板 → 轻松使用 → 语音识别 → 安装语言)
- 用
new Grammar(new GrammarBuilder("打开浏览器"))构建简单命令语法,比纯听写稳定 - 避免在
SpeechRecognitionEngine初始化前加载语法;应在调用SetInputToDefaultAudioDevice()后、RecognizeAsync()前执行LoadGrammar() - 中文识别对语速、静音间隔敏感,建议在
SpeechRecognized事件中检查e.Result.Confidence,过滤低于 0.4 的结果
SpeechRecognitionEngine 和 SpeechRecognizer 的关键区别
SpeechRecognitionEngine 是底层引擎,完全可控但需手动管理音频输入与线程;SpeechRecognizer 是封装好的前台识别器,自动绑定默认麦克风并运行在 UI 线程,适合 WinForms/WPF 快速集成,但不支持后台服务或自定义音频流。