如何使用所有可用语音?SpeechSynthesizer仅获桌面语音问题
如何获取Windows系统中全部可用的语音(包括非Desktop类)
你遇到的这个问题其实挺常见的——你用的System.Speech.Synthesis.SpeechSynthesizer是基于旧版的SAPI 5语音框架开发的,它只能识别Windows里的「传统桌面语音」(就是你看到的带-Desktop后缀的那四个)。而Windows 10及之后系统里新增的大部分语音,都是基于UWP的Windows.Media.SpeechSynthesis API的,这些现代语音根本不会被SpeechSynthesizer.GetInstalledVoices()检测到。
下面给你两种解决思路,看哪种更适合你的场景:
方法1:用UWP API获取所有语音(推荐)
不管你是做WPF、WinForms还是控制台应用,都能调用UWP的语音API来拿到系统里所有的语音,步骤很简单:
- 右键你的项目 → 「添加」→ 「引用」→ 选择「Windows」分类,勾选「Windows.Media.SpeechSynthesis」(选对应你系统的版本就行)。
- 用这段异步代码获取全部语音:
using Windows.Media.SpeechSynthesis; public async Task<List<VoiceInformation>> GetAllInstalledVoicesAsync() { var allVoices = new List<VoiceInformation>(); // 这里能拿到所有语音,包括现代语音和传统桌面语音 var voiceCollection = SpeechSynthesizer.AllVoices; foreach (var voice in voiceCollection) { allVoices.Add(voice); // 可以打印出来看看详情: Console.WriteLine($"语音ID: {voice.Id}, 名称: {voice.DisplayName}, 语言: {voice.Language}"); } return allVoices; }
要是你写的是控制台应用,记得把Main方法改成异步的才能用await:
static async Task Main(string[] args) { var allVoices = await GetAllInstalledVoicesAsync(); // 后续处理语音列表... }
方法2:如果必须用System.Speech(仅能拿桌面语音)
要是你的项目必须依赖System.Speech,那只能获取传统桌面语音,但可以排查下有没有漏加载的情况:
- 检查项目的目标平台:右键项目→「属性」→「生成」,把目标平台改成「Any CPU」或者和你系统一致的位数(比如64位)——32位程序可能识别不到64位的桌面语音。
- 手动启用桌面语音:打开Windows设置→「时间和语言」→「语音」→「管理语音」,确认你需要的桌面语音已经安装并启用。
额外提示
现代语音(UWP类)的发音质量和语言覆盖度都比传统桌面语音好很多,要是能切换的话,优先用UWP的API不仅能拿到全量语音,合成效果也会更好。
内容的提问来源于stack exchange,提问作者Vitalis Hommel
相关产品推荐
相关产品推荐

