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

如何让SpeechSynthesis使用丹麦语语音完成语音合成?

解决SpeechSynthesis无法使用丹麦语语音的问题

看起来你遇到的是传统语音API与Windows现代语音系统的兼容性问题,再加上语音自动匹配逻辑的小坑,下面分步骤帮你解决:

1. 手动指定丹麦语语音,替代仅依赖文化设置

有时候PromptBuilder的文化信息不一定能让语音合成器自动匹配到目标语音,尤其是系统内存在多语言语音时。你可以手动遍历已安装语音,筛选出丹麦语选项并强制设置:

var speech = new SpeechSynthesizer { Volume = 100, Rate = 0 };
var text = "Dette er en test";

// 筛选丹麦语语音(忽略大小写避免匹配问题)
var danishVoice = speech.GetInstalledVoices()
    .FirstOrDefault(v => v.VoiceInfo.Culture.Name.Equals("da-DK", StringComparison.OrdinalIgnoreCase));

if (danishVoice != null)
{
    // 强制指定使用丹麦语语音
    speech.SelectVoice(danishVoice.VoiceInfo.Name);
}
else
{
    Console.WriteLine("未找到可用的丹麦语SAPI语音");
}

var builder = new PromptBuilder(new System.Globalization.CultureInfo("da-dk"));
builder.AppendText(text);
speech.SpeakAsync(builder);

2. 为什么代码列出的语音比Windows显示的少?

你在Windows里看到的丹麦语语音(Helle)大概率是Windows现代神经语音,这类语音由Windows.Media.SpeechSynthesis(WinRT API)提供,而你使用的System.Speech.Synthesis基于旧版SAPI 5框架,无法访问这些新语音。

如果要使用这类现代语音,需要切换到WinRT语音API(适用于.NET 6+、WPF/WinForms或Windows App SDK应用),示例代码如下:

using Windows.Media.SpeechSynthesis;
using System.Linq;

async Task SpeakWithModernDanishVoice()
{
    var synthesizer = new SpeechSynthesizer();
    
    // 获取所有丹麦语现代语音
    var danishVoices = SpeechSynthesizer.AllVoices
        .Where(v => v.Language.Equals("da-DK", StringComparison.OrdinalIgnoreCase));
    
    if (danishVoices.Any())
    {
        synthesizer.Voice = danishVoices.First();
    }
    else
    {
        Console.WriteLine("未找到丹麦语现代语音,请检查Windows语音设置");
        return;
    }

    // 合成语音流(播放部分需搭配媒体组件,比如WPF的MediaElement或第三方播放库)
    var text = "Dette er en test";
    var stream = await synthesizer.SynthesizeTextToStreamAsync(text);
    
    // 此处可添加播放逻辑,比如将流保存为WAV文件或直接播放
}

3. 检查Windows语音设置的关键项

确保你的丹麦语语音处于可用状态:

  • 打开Windows设置 → 时间和语言语音
  • 确认丹麦语语音(Helle)已下载并显示在“已安装的语音”列表中
  • 如果是现代神经语音,确保它支持离线使用(部分语音需联网,但多数可下载离线包)

补充说明

如果你的项目是.NET Framework应用,可能无法直接使用WinRT API,这时可以尝试安装兼容SAPI的丹麦语语音包(部分第三方或旧版微软语音支持SAPI),或者升级到.NET 6+以支持WinRT调用。

内容的提问来源于stack exchange,提问作者Jens Borrisholt

火山引擎 最新活动