System.Speech.Synthesis 运行即报 InvalidOperationException 的根本原因是 Windows 未启用语音合成功能或当前用户无访问权限,而非代码错误;需开启系统语音功能、确保交互式用户运行、匹配平台位数、显式选择启用的中文语音引擎,并注意生命周期管理和.NET版本兼容性。

System.Speech.Synthesis 为什么一运行就报 InvalidOperationException
根本原因是 Windows 默认没启用语音合成功能,或者当前用户没权限访问语音引擎。不是代码写错了,而是系统层缺依赖。
常见错误现象:Cannot create instance of type 'System.Speech.Synthesis.SpeechSynthesizer' 或调用 SpeakAsync 时直接抛 InvalidOperationException。
- 确保 Windows 功能已开启:打开「控制面板 → 程序 → 启用或关闭 Windows 功能」,勾选
Speech Platform Runtime和Text-to-Speech(Win10/11 叫「语音识别」和「语音合成」,实际需启用的是底层平台) - 必须以交互式用户身份运行(不能在 Windows 服务、IIS 应用池或计划任务中静默调用)
- 32/64 位不匹配会静默失败:如果项目设为
x64,但系统只装了 32 位语音引擎(或反之),SpeechSynthesizer构造函数不报错,但首次调用Speak就崩
如何正确初始化并切换中文语音引擎
SpeechSynthesizer 默认可能选英文引擎,即使系统语言是中文。必须显式筛选支持中文的安装语音,否则 Speak("你好") 会念成英文音或直接跳过。
实操要点:
- 用
GetInstalledVoices()查所有可用语音,过滤voice.VoiceInfo.Culture.Name == "zh-CN" - 设置前先检查
voice.Enabled,有些预装语音(如 Microsoft David Desktop)在 Win11 上默认被禁用 - 引擎名不等于显示名:
voice.VoiceInfo.Name是内部 ID(如Microsoft Server Speech Text to Speech Voice (zh-CN, HanHan)),别硬编码字符串匹配
简短示例:
var synth = new SpeechSynthesizer();
var zhVoice = SpeechSynthesizer.InstalledVoices
.Where(v => v.VoiceInfo.Culture.Name == "zh-CN" && v.Enabled)
.FirstOrDefault();
if (zhVoice != null) synth.SelectVoice(zhVoice.VoiceInfo.Name);SpeakAsync 不触发、回调不执行的几个隐藏原因
表面看是异步没响应,实际多是生命周期管理出问题:对象被提前释放、线程上下文丢失、或事件未订阅。
-
SpeechSynthesizer是有状态对象,不能 new 完就丢——必须保持引用,直到SpeakCompleted触发(或主动Dispose) - 在 WinForms/WPF 中,如果在非 UI 线程调用
SpeakAsync,且没设置synth.SetOutputToDefaultAudioDevice(),音频可能输出到空设备 - 若用
SpeakSsmlAsync,SSML 字符串里不能含未转义的、<code>>,否则静默失败(不报异常,但无声音) - .NET Core/.NET 5+ 项目无法直接用
System.Speech:它仅支持 .NET Framework 3.0+,跨平台得换Microsoft.CognitiveServices.SpeechSDK
替代方案:什么时候该放弃 System.Speech
当遇到系统兼容性差、中文发音生硬、或需要离线高保真语音时,System.Speech 就是瓶颈本身。
- Windows Server 环境基本不可用:默认不装语音引擎,且策略常禁用音频子系统
- Win11 新装机大概率没中文语音包,用户需手动下载安装(微软官网搜
Microsoft Speech Platform - Runtime和对应语言包) - 想用神经语音(如晓晓、云健)?
System.Speech不支持,只能切到Microsoft.CognitiveServices.Speech+ Azure 订阅
真正卡住人的从来不是代码怎么写,而是你不知道那台目标机器上到底装了几个语音引擎、启用了哪个、有没有权限播声音——这些没法靠编译检查出来。


















