You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用所有可用语音?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来拿到系统里所有的语音,步骤很简单:

  1. 右键你的项目 → 「添加」→ 「引用」→ 选择「Windows」分类,勾选「Windows.Media.SpeechSynthesis」(选对应你系统的版本就行)。
  2. 用这段异步代码获取全部语音:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:36:55