System.Speech.Synthesis.SpeechSynthesizer在Win10/Win11部分系统因语音引擎缺失会抛InvalidOperationException,需启用讲述人、安装中文TTS语言包,并运行时检测GetInstalledVoices;推荐显式SelectVoice按Name匹配中文神经语音;SpeakAsync需订阅事件处理异常与完成;桌面程序仍依赖System.Speech,Neural TTS需预生成音频或改用Azure等第三方服务。

System.Speech.Synthesis.SpeechSynthesizer 在 Win10/Win11 上默认不可用
直接 new SpeechSynthesizer() 并调用 Speak(),在部分 Windows 10/11 系统(尤其是精简版、教育版或关闭了语音功能的系统)会抛出 InvalidOperationException: Failed to create voice。这不是代码写错了,而是系统级依赖缺失。
必须确认:控制面板 → “轻松使用” → “讲述人”已启用,且“文本转语音”语言包已安装(如中文(简体,中国))。更可靠的做法是运行时检测:
var synth = new SpeechSynthesizer();
if (synth.GetInstalledVoices().Count == 0)
{
MessageBox.Show("未检测到可用语音引擎,请检查系统TTS设置");
return;
}
中文发音不准?优先指定 VoiceInfo.Name 而非仅靠 Culture
SpeechSynthesizer 的 SelectVoiceByHints() 对中文支持弱,容易选到英文语音或合成生硬。推荐显式枚举并匹配 VoiceInfo.Name:
-
zh-CN区域下常见有效值:"Microsoft Server Speech Text to Speech Voice (zh-CN, HuihuiRUS)"(旧版)、"Microsoft Server Speech Text to Speech Voice (zh-CN, XiaoxiaoNeural)"(Win11 22H2+ Neural TTS) - 不要只设
Culture = new CultureInfo("zh-CN")就以为能自动选对——它可能 fallback 到英文语音 - 神经语音(Neural)需 Windows 11 22H2 或更新 + 单独下载语言包,普通
SpeechSynthesizer默认不支持 Neural,仅支持传统 SAPI5 语音
实操建议:
var voices = synth.GetInstalledVoices(new CultureInfo("zh-CN"));
if (voices.Count > 0)
{
synth.SelectVoice(voices[0].VoiceInfo.Name); // 取第一个中文语音
}
SpeakAsync() 不阻塞但需手动处理异常和完成回调
SpeakAsync() 是异步方法,但它的异常不会抛到主线程,也不会触发 Task 的 awaitable 行为——它走的是事件驱动模型。
- 必须订阅
Synth.SpeakStarted、Synth.SpeakCompleted和Synth.SpeakProgress才能感知状态 - 异常(如语音中断、资源被占用)通过
Synth.SpeakCompleted的e.Error属性返回,不是 throw 出来 - 若在 UI 线程调用,事件回调默认回到 UI 线程;但若
SpeechSynthesizer初始化在后台线程,则需自行同步上下文
最小可靠调用模式:
synth.SpeakCompleted += (s, e) =>
{
if (e.Error != null)
Debug.WriteLine($"TTS error: {e.Error.Message}");
else
Debug.WriteLine("TTS done");
};
synth.SpeakAsync("你好,世界");
替代方案:Windows.Media.SpeechSynthesis 更现代但仅限 UWP/WinUI
如果你的目标平台是 Windows 10/11 应用(而非 .NET Framework 桌面程序),Windows.Media.SpeechSynthesis 是微软主推的新 API,支持 Neural TTS、音调/语速精细控制、SSML,并且无需管理员权限。
- 它不属于
System.Speech命名空间,需引用Windows.winmd(通过 NuGet 包Microsoft.Windows.SDK.Contracts) - 桌面应用(WPF/WinForms)无法直接使用该 API,除非通过
AppContainer模式或包装成 WinRT 组件 - 对传统 .NET Framework 或 .NET 6+ 桌面项目,
System.Speech仍是唯一内置选择,别指望靠 NuGet 升级解决底层限制
真正想用 Neural 语音又不想换架构?只能接受现实:把语音文件预生成(SpeakToAudioStream()),或改用第三方 SDK(如 Azure Cognitive Services Text-to-Speech)。


















