System.Speech.Synthesis获取Windows语音与系统显示不一致问题求助
解决System.Speech.Synthesis仅识别部分Windows语音的问题
我懂你碰到的这个坑——本来以为用System.Speech.Synthesis的GetInstalledVoices()能列出所有安装的语音,结果只拿到了David和Zira,但Windows文本转语音设置里明明显示有5个(比如Linda这些)。这其实是新旧语音合成引擎不兼容导致的,下面给你拆解原因和解决办法:
为什么会出现差异?
System.Speech.Synthesis是.NET Framework里的老组件,它依赖的是传统的SAPI 5语音引擎,只能识别专门为SAPI 5开发的语音包。- 你在Windows设置里看到的额外语音(比如Linda),大多是Windows 10/11之后引入的**新UWP语音合成引擎(Windows.Media.SpeechSynthesis)**的产物,这个新引擎的语音默认不会被旧的SAPI 5体系识别。
两种解决方案
方案一:改用新的UWP语音API(推荐)
如果你的项目可以升级到.NET 5+,或者是WPF/WinForms/UWP项目,直接用Windows.Media.SpeechSynthesis就能获取所有语音,包括那些新的神经网络语音。给你个VB的示例代码:
Imports Windows.Media.SpeechSynthesis Imports System.Threading.Tasks ... Async Function GetAllInstalledVoicesAsync() As Task(Of List(Of VoiceInformation)) Dim voiceList As New List(Of VoiceInformation)() ' 获取系统中所有可用的语音,包括新引擎的 Dim allVoices = SpeechSynthesizer.AllVoices For Each voice In allVoices voiceList.Add(voice) ' 可以在这里获取语音的名称、语言等信息 ' 比如 voice.DisplayName, voice.Language Next Return voiceList End Function
注意:如果是.NET Framework的WinForms项目,需要先添加对Windows Runtime组件的引用,或者直接升级到.NET 6/7,这样调用WinRT API会更顺畅。
方案二:让新语音兼容SAPI 5
部分新语音包提供了SAPI 5兼容版本,你可以尝试:
- 打开Windows的「设置」→「时间和语言」→「语音」,选中那个不显示的语音,查看是否有“安装SAPI兼容包”之类的选项。
- 去微软语音官方门户,搜索对应语音的SAPI版本并安装。不过这个方法不是所有语音都支持,而且效果不如新引擎好。
总结
如果项目没有必须用旧API的限制,优先选方案一,新引擎不仅能识别更多语音,合成质量也比旧的SAPI 5高很多,还支持实时语音合成的新特性。
内容的提问来源于stack exchange,提问作者Rob




