You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

System.Speech.Synthesis获取Windows语音与系统显示不一致问题求助

解决System.Speech.Synthesis仅识别部分Windows语音的问题

我懂你碰到的这个坑——本来以为用System.Speech.SynthesisGetInstalledVoices()能列出所有安装的语音,结果只拿到了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

火山引擎 最新活动