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

基于System.Speech.Synthesis,用SSML实现德语电话号码逐位朗读及连字符播报

解决方案:用SSML 标签实现德语电话号码的精准朗读

当然可以通过SSML的<say-as>标签优雅解决这个问题,以下是两种可行的实现方式:

方式1:直接使用电话类型朗读

利用<say-as interpret-as="telephone">标签,System.Speech.Synthesis会自动按电话号码规则朗读,德语环境下会逐位读数字并正确处理连字符/空格:

using System.Speech.Synthesis;
class Element{
    SpeechSynthesizer speaker = new SpeechSynthesizer();

    private void speakPhone(string content){
        string speak_string = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" "
           + "xmlns:mstts=\"https://www.w3.org/2001/mstts\" xml:lang=\"de-DE\">"
           + $"<say-as interpret-as=\"telephone\">{content}</say-as>"
           + "</speak>";
        speaker.SpeakSsml(speak_string);
    }
}

方式2:精准控制每个字符的朗读(更灵活)

如果电话类型的默认处理不符合预期,可以手动拆分字符,用<say-as>分别指定数字和符号的朗读规则:

using System.Speech.Synthesis;
using System.Text;

class Element{
    SpeechSynthesizer speaker = new SpeechSynthesizer();

    private string FormatPhoneForSsml(string content)
    {
        StringBuilder sb = new StringBuilder();
        foreach (char c in content)
        {
            if (char.IsDigit(c))
            {
                // 强制逐位朗读单个数字
                sb.Append($"<say-as interpret-as=\"digits\">{c}</say-as>");
            }
            else if (c == '-')
            {
                // 指定连字符朗读为德语"Strich"
                sb.Append("<say-as interpret-as=\"literal\">Strich</say-as>");
            }
            else if (char.IsWhiteSpace(c))
            {
                // 空格处添加短停顿,提升朗读流畅度
                sb.Append("<break time=\"200ms\"/>");
            }
            else
            {
                sb.Append(c);
            }
        }
        return sb.ToString();
    }

    private void speakPhone(string content){
        string formattedContent = FormatPhoneForSsml(content);
        string speak_string = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" "
           + "xmlns:mstts=\"https://www.w3.org/2001/mstts\" xml:lang=\"de-DE\">"
           + formattedContent
           + "</speak>";
        speaker.SpeakSsml(speak_string);
    }
}

关键说明

  • <say-as interpret-as="digits">:强制TTS引擎逐位朗读数字,避免将连续数字识别为数值(如"789"不会读成"siebenhundertneunundachtzig")。
  • <say-as interpret-as="literal">:直接朗读指定文本,这里用来将连字符替换为德语的"Strich"。
  • <break>:添加停顿,让电话号码的分段朗读更符合听觉习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:44:59