跳转到主要内容
语音合成

SSML 与 LaTeX

通过 SSML 控制语速、停顿、发音等语音特征,或将 LaTeX 公式转换为自然语音

通过 SSML(Speech Synthesis Markup Language)标记语言,可以精细控制语速、停顿、发音等语音特征;通过 LaTeX 公式朗读功能,可以将数学公式转换为自然语音。这两项功能均适用于 CosyVoice 模型。

概述

SSML(Speech Synthesis Markup Language)是一种基于 XML 的语音合成标记语言。在文本中嵌入 SSML 标签后,可以精细控制语速、语调、停顿和音量等语音特征,也可以添加背景音乐和音效,实现更丰富的语音表达效果。 CosyVoice 还支持解析文本中嵌入的 LaTeX 公式,并按照符合中文阅读习惯的方式将其朗读出来,适用于在线教育、有声读物等包含数学公式的场景。例如,输入文本"这是一道一元二次方程的求根公式:$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$"时,模型会将公式朗读为"x等于负b加减根号下b的平方减四ac,分之二a"。 典型应用场景包括:
  • 有声读物:灵活控制停顿和语速,搭配背景音乐增强沉浸感
  • 智能客服:通过 <say-as> 标签确保电话号码、日期等信息的准确朗读
  • 多语种播报:使用 <phoneme> 标签精确指定外文发音
  • 在线教育:通过 LaTeX 公式朗读功能将数学公式转为自然语音
两项功能均适用于 CosyVoice 模型系列。如需了解各模型的选型建议,请参见语音合成模型

SSML 标记语言

使用限制

  • 模型:qwen-audio-3.0-tts-flash、qwen-audio-3.0-tts-plus、cosyvoice-v3.5-flash、cosyvoice-v3.5-plus、cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2。
  • 音色:克隆音色,以及CosyVoice音色列表中标注为支持 SSML 的系统音色。
  • 接口
    • Java SDK(2.20.3 及以上版本):支持非流式调用和单向流式调用。
    • Python SDK(1.23.4 及以上版本):支持非流式调用和单向流式调用。
    • WebSocket API:需将参数 enable_ssml 设置为 true,且只允许发送一次 continue-task 事件。
    • HTTP API:需将参数 enable_ssml 设置为 true
cosyvoice-v3.5-pluscosyvoice-v3.5-flash 模型专用于声音复刻场景(不提供系统音色)。使用前,请先参见声音复刻创建目标音色。

快速开始

以下示例展示如何使用 SSML 控制语速进行语音合成。运行前,请完成以下准备工作:
  1. 获取 API Key
  2. 安装 DashScope SDK(Python 1.23.4 及以上版本,Java 2.20.3 及以上版本)。详情请参见安装 SDK
  • Java SDK
  • Python SDK
  • WebSocket API
  • cURL
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.utils.Constants;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
/**
 * SSML功能说明:
 *     1. 只有非流式调用和单向流式调用支持SSML功能
 *     2. 只有qwen-audio-3.0-tts-flash、qwen-audio-3.0-tts-plus、cosyvoice-v3-flash、cosyvoice-v3-plus和cosyvoice-v2模型的复刻音色以及音色列表中标记为支持SSML的系统音色支持SSML功能(例如cosyvoice-v3-flash模型的longanyang音色)
 */
public class Main {
    private static String model = "cosyvoice-v3-flash";
    private static String voice = "longanyang";
    public static void main(String[] args) {
        Constants.baseWebsocketApiUrl = "wss://dashscope.aliyuncs.com/api-ws/v1/inference";
        streamAudioDataToSpeaker();
        System.exit(0);
    }
    public static void streamAudioDataToSpeaker() {
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // 若没有配置环境变量,请用API Key将下行替换为:.apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model(model)
                        .voice(voice)
                        .build();
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
        ByteBuffer audio = null;
        try {
            // 非流式调用,阻塞直至音频返回
            // 特殊字符需要进行转义
            audio = synthesizer.call("<speak rate=\"2\">我的语速比正常人快。</speak>");
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // 任务结束关闭websocket连接
            synthesizer.getDuplexApi().close(1000, "bye");
        }
        if (audio != null) {
            // 将音频数据保存到本地文件"output.mp3"中
            File file = new File("output.mp3");
            try (FileOutputStream fos = new FileOutputStream(file)) {
                fos.write(audio.array());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        // 首次发送文本时需建立 WebSocket 连接,因此首包延迟会包含连接建立的耗时
        System.out.println(
                "[Metric] requestId为:"
                        + synthesizer.getLastRequestId()
                        + "首包延迟(毫秒)为:"
                        + synthesizer.getFirstPackageDelay());
    }
}

标签参考

CosyVoice SSML 基于 W3C SSML 1.0,仅支持部分标签。语法规则
  • 所有 SSML 内容必须包裹在 <speak></speak> 标签中。
  • 可以连续使用多个 <speak> 标签,但不能嵌套。
  • 需要转义 XML 特殊字符:"&quot;'&apos;&&amp;<&lt;>&gt;

<speak>:根标签

说明 所有 SSML 内容必须包裹在 <speak></speak> 标签中。 语法
<speak>需要使用 SSML 功能的文本</speak>
属性
属性类型必填说明
voiceString音色名称。覆盖 API 参数 voice。参见音色列表
rateString语速。覆盖 API 参数 speech_rate。推荐范围:0.5 ~ 2,默认值 1。大于 1 加速,小于 1 减速。
pitchString音调。覆盖 API 参数 pitch_rate。推荐范围:0.5 ~ 2,默认值 1。大于 1 升高,小于 1 降低。
volumeString音量。覆盖 API 参数 volume。取值范围:0 ~ 100,默认值 50。
effectString音效。可选值:robotlolita(活泼女声)、lowpassechoeq(均衡器,高级)、lpfilter(低通滤波器,高级)、hpfilter(高通滤波器,高级)。eqlpfilterhpfilter 需配合 effectValue 使用。每个标签只能设置一种音效。音效会增加延迟。
effectValueString自定义 effect 参数。eq:8 个以空格分隔的整数(-20 ~ 20),分别对应 ["40 Hz", "100 Hz", "200 Hz", "400 Hz", "800 Hz", "1600 Hz", "4000 Hz", "12000 Hz"] 频段的增益,示例:"1 1 1 1 1 1 1 1"lpfilter:整数频率,范围 (0, sample_rate/2],示例:"800"hpfilter:整数频率,范围 (0, sample_rate/2],示例:"1200"
bgmString背景音乐 URL。文件需存放在 OSS 上,权限至少为公共读。URL 中的 XML 特殊字符需转义。要求:16 kHz 采样率、单声道、WAV 格式、16-bit。如果合成音频长于背景音乐,音乐将循环播放。
backgroundMusicVolumeString背景音乐音量。
示例 音色:
<speak voice="longcheng_v2">
  我是男声。
</speak>
语速:
<speak rate="2">
  我的语速比正常人快。
</speak>
音调:
<speak pitch="0.5">
  但是我的音调比别人低。
</speak>
音量:
<speak volume="80">
  我的音量也很高。
</speak>
音效:
<speak effect="robot">
  你喜欢机器人瓦力吗?
</speak>
音效 + effectValue:
<speak effect="eq" effectValue="1 -20 1 1 1 1 20 1">
  你喜欢机器人瓦力吗?
</speak>

<speak effect="lpfilter" effectValue="1200">
  你喜欢机器人瓦力吗?
</speak>

<speak effect="hpfilter" effectValue="1200">
  你喜欢机器人瓦力吗?
</speak>
如果音频不是 WAV 格式,可使用 ffmpeg 转换:
ffmpeg -i input_audio -acodec pcm_s16le -ac 1 -ar 16000 output.wav
背景音乐(bgm):
<speak bgm="http://nls.alicdn.com/bgm/2.wav" backgroundMusicVolume="30" rate="-500" volume="40">
  <break time="2s"/>
  阴崖老木苍苍烟
  <break time="700ms"/>
  雨声犹在竹林间
  <break time="700ms"/>
  绵蕝固知裨国计
  <break time="700ms"/>
  绵州风物总堪怜
  <break time="2s"/>
</speak>
上传音频的版权由您自行承担法律责任。
组合属性(空格分隔):
<speak rate="200" pitch="-100" volume="80">
  所以放在一起,我的声音是这样的。
</speak>

<break>:停顿

说明 插入一段停顿。时长单位为秒(s)或毫秒(ms)。 语法
# 无属性
<break/>
# 带 time 属性
<break time="string"/>
break 标签行为
  • 不带属性时,<break/> 默认停顿 1 秒。
  • 注意:连续的 <break> 标签时长会累加,但总时长上限为 10 秒。
例如,以下三个标签总时长为 15 秒,但仅前 10 秒有效:
<speak>
  请闭上眼睛休息一下。<break time="5s"/><break time="5s"/><break time="5s"/>好了,请睁开眼睛。
</speak>
属性
属性类型必填说明
timeString停顿时长,如 "2s""50ms"。秒为单位:1 ~ 10。毫秒为单位:50 ~ 10000。
示例
<speak>
  请闭上眼睛休息一下。<break time="500ms"/>好了,请睁开眼睛。
</speak>

<sub>:替换文本

说明 将显示文本替换为其他发音。 语法
<sub alias="string"></sub>
属性
属性类型必填说明
aliasString替代朗读的文本。
示例
<speak>
   <sub alias="network protocol">W3C</sub>
 </speak>

<phoneme>:设置发音

说明 使用拼音(中文)或 CMU 音标(英文)指定发音。 语法
<phoneme alphabet="string" ph="string">text</phoneme>
属性
属性类型必填说明
alphabetString发音类型:"py"(拼音)或 "cmu"(音标)。参见 The CMU Pronouncing Dictionary
phString拼音或音标符号。每个汉字的拼音之间用空格分隔,音节数必须与字数一致。每个音节带声调号(1 ~ 5,其中 5 为轻声)。
示例
<speak>
<phoneme alphabet="py" ph="dian3 dang4 hang2">典当行</phoneme>把这个玩意<phoneme alphabet="py" ph="dang4 diao4">当掉</phoneme>
</speak>

<speak>
  How to spell <phoneme alphabet="cmu" ph="S AY N">sin</phoneme>?
</speak>

<soundEvent>:插入音效

说明 在合成语音中插入外部音频文件(提示音、环境音等)。 语法
<soundEvent src="URL"/>
属性
属性类型必填说明
srcString音频 URL。文件需存放在 OSS 上,权限至少为公共读。URL 中的 XML 特殊字符需转义。要求:16 kHz 采样率、单声道、WAV 格式、16-bit,最大 2 MB。
如果音频不是 WAV 格式,可使用 ffmpeg 转换:
ffmpeg -i input_audio -acodec pcm_s16le -ac 1 -ar 16000 output.wav
上传音频的版权由您自行承担法律责任。
示例
<speak>
  一匹马受了惊吓<soundEvent src="http://nls.alicdn.com/sound-event/horse-neigh.wav"/>人们四散躲避
</speak>

<say-as>:设置朗读格式

说明 指定文本的朗读方式(如数字、日期、电话号码等)。 语法
<say-as interpret-as="string">text</say-as>
属性
属性类型必填说明
interpret-asString文本类型。可选值:cardinal(数字)、digits(逐位数字)、telephone(电话号码)、name(姓名)、address(地址)、id(账号名/昵称)、characters(逐字符)、punctuation(标点)、date(日期)、time(时间)、currency(货币)、measure(度量单位)。
cardinal
cardinal 支持的格式: 中文输出
格式示例中文输出说明
数字串145一百四十五整数输入范围:20位以内的正负整数,[-99999999999999999999, 99999999999999999999]。小数输入范围:对小数点后小数的位数没有特殊限制,建议不超过10位。
负号+数字串-145负一百四十五
以逗号分隔3位数字串10,000一万
负号+以逗号分隔3位数字串-10,124负一万一百二十四
数字串+小数点+2个零10.00
负号+数字串+小数点+2个零-110.00负一百一十
数字串+小数点+数字串79.090七十九点零九零
负号+数字串+小数点+数字串-79.001负七十九点零零一
英文输出
格式示例英文读法说明
纯数字145one hundred forty five整数范围:最多 13 位,[-999999999999, 999999999999]。小数:整数部分最多 13 位,小数部分最多 10 位。
零开头的数字0145one hundred forty five
负号 + 数字-145minus hundred forty five
千分位逗号分隔的数字60,000sixty thousand
负号 + 千分位逗号分隔的数字-208,000minus two hundred eight thousand
数字 + 小数点 + 零12.00twelve
数字 + 小数点 + 数字12.34twelve point three four
千分位逗号分隔 + 小数点 + 数字1,000.1one thousand point one
负号 + 数字 + 小数点 + 数字-12.34minus twelve point three four
负号 + 千分位逗号分隔 + 小数点 + 数字-1,000.1minus one thousand point one
千分位数字 + 连字符 + 千分位数字1-1,000one to one thousand
其他默认读法012.34twelve point three four
1/2one half
-3/4minus three quarters
5.1/6five point one over six
-3 1/2minus three and a half
1,000.3^3one thousand point three to the power of three
3e9.1three times ten to the power of nine point one
23.10%twenty three point one percent
示例
<speak>
  <say-as interpret-as="cardinal">12345</say-as>
</speak>
<speak>
  <say-as interpret-as="cardinal">10234</say-as>
</speak>
digits
digits 支持的格式: 中文输出
格式示例中文输出说明
数字串129090909一二九零九零九零九对数字串的长度没有特殊限制,建议不超过20位。当数字串超过10位时,每个数字后插入停顿。
英文输出
格式示例英文读法说明
纯数字12034one two zero three four无严格长度限制,建议不超过 20 个字符。
数字 + 空格或连字符 + 数字 + ...1-23-456 7890one, two three, four five six, seven eight nine zero
示例
<speak>
  <say-as interpret-as="digits">12345</say-as>
</speak>
<speak>
  <say-as interpret-as="digits">10234</say-as>
</speak>
telephone
telephone 支持的格式: 中文输出
格式示例中文输出说明
座机号4930286四九三 零二八六支持7~8位座机号,支持空格和"-"作为分隔符。其中,7位座机号支持"3-4"的数字分隔方式;8位座机号支持"4-4"的数字分隔方式。
493 0286四九三 零二八六
493-0286四九三 零二八六
62552560六二五五 二五六零
6255 2560六二五五 二五六零
6255-2560六二五五 二五六零
座机号+分机号4930286-109四九三 零二八六 转幺零九支持1~4位分机号。
4930286转109四九三 零二八六 转幺零九
4930286分机109四九三 零二八六 分机幺零九
4930286分机号109四九三 零二八六 分机号幺零九
区号+座机号01062552560零幺零 六二五五 二五六零支持区号:010、02x、03xx、04xx、05xx、07xx、08xx、09xx。
010 62552560零幺零 六二五五 二五六零
010 6255 2560零幺零 六二五五 二五六零
010 6255-2560零幺零 六二五五 二五六零
010-62552560零幺零 六二五五 二五六零
010-6255-2560零幺零 六二五五 二五六零
(010)62552560零幺零 六二五五 二五六零
03198907098零三幺九 八九零 七零九八
0319-8907098三幺九 八九零 七零九八
区号+座机号+分机号010 62552560-109零幺零 六二五五 二五六零 转幺零九
010-62552560-109零幺零 六二五五 二五六零 转幺零九
(010)62552560-109零幺零 六二五五 二五六零 转幺零九
(010)62552560转109零幺零 六二五五 二五六零 转幺零九
(010)62552560分机109零幺零 六二五五 二五六零 分机幺零九
(010)62552560分机号109零幺零 六二五五 二五六零 分机号幺零九
国家代码+区号+座机号86-010-62791627八六 零幺零 六二七九 幺六二七支持国家代码:86、(86)、+86、(+86)、0086,统一读为"八六"。
(86)10-62791627八六 幺零 六二七九 幺六二七
+86-010-62791627八六 零幺零 六二七九 幺六二七
0086-10-62791627八六 幺零 六二七九 幺六二七
(+86)-10-6279 1627八六 幺零 六二七九 幺六二七
国家代码+区号+座机号+分机号(86)21-58118818-207八六 二幺 五八幺幺 八八幺八 转二零七
(86)021-5811-8818-207八六 零二幺 五八幺幺 八八幺八 转二零七
(86)021-58118818转207八六 零二幺 五八幺幺 八八幺八 转二零七
(86)21-5811-8818分机207八六 二幺 五八幺幺 八八幺八 分机二零七
+86-021-58118818分机号207八六 零二幺 五八幺幺 八八幺八分机号二零七
手机号139 0000 5678幺三九 零零零零 五六七八支持11位手机号,支持3-3-5、3-4-4两种数字分隔方式。
139-000-05678幺三九 零零零 零五六七八
139 000 05678幺三九 零零零 零五六七八
国家代码+手机号+86-13900005678八六 幺三九 零零零零 五六七八
(+86)-139-0000-5678八六 幺三九 零零零零 五六七八
+8613900005678八六 幺三九 零零零零 五六七八
0086-139 000 05678八六 幺三九 零零零 零五六七八
服务号123幺二三支持常用的服务号。支持以400/800开头的10位服务号,支持以"3-3-4"的数字分隔方式。支持以12530/17951/12593开头的16位号码。
95678九五六七八
4008110510四零零 八幺幺 零五幺零
800-810-8888八零零 八幺零 八八八八
1253013520638377幺二五三零 幺三五 二零六三 八三七七
其他(86)(21)9899-80800-0909八六 二幺 九八九九 八零八零零 零九零九支持"数字串+分隔符(左右括号、-)"方式。
英文输出
格式示例英文读法说明
纯数字12034one two oh three four无严格长度限制,建议不超过 20 个字符。
数字 + 空格或连字符 + 数字 + ...1-23-456 7890one, two three, four five six, seven eight nine oh
加号 + 数字 + 空格或连字符 + 数字+43-211-0567plus four three, two one one, oh five six seven
左括号 + 数字 + 右括号 + 空格 + 数字 + 空格或连字符 + 数字(21) 654-3210(two one) six five four, three two one oh
示例
<speak>
  <say-as interpret-as="telephone">12345</say-as>
</speak>
<speak>
  <say-as interpret-as="telephone">10234</say-as>
</speak>
name
示例
<speak>
  Her former name is <say-as interpret-as="name">Zeng Xiaofan</say-as>
</speak>
address
address 支持的格式: 中文输出
格式示例中文输出说明
常用地址格式元和镇嘉元30-9元和镇嘉元三十杠九支持常用地址格式。此处地址指标准的邮寄地址。
市台路388弄1107-1108号市台路三八八弄幺幺零七杠幺幺零八号
华润二十四城六期锦云府3-1-3205华润二十四城六期锦云府三杠一杠三二零五
圣华名都大厦2幢2006室圣华名都大厦二幢二零零六室
五常街道庭院5幢4单元201五常街道庭院五幢四单元二零幺
芙蓉江路150弄19号芙蓉江路幺五零弄十九号
英文文本不支持该格式。
示例
<speak>
  <say-as interpret-as="address">Fulu International, Building 1, Unit 3, Room 304</say-as>
</speak>
id
id 支持的格式:
格式示例输出说明
字符串dell0101D E L L 零 一 零 一大小写英文字符、阿拉伯数字0~9、下划线。输出的空格表示每个字符之间插入停顿,即字符一个一个地读。
myid_1998M Y I D 下划线 一 九 九 八
AiTestA I T E S T
英文文本的效果与 characters 相同。
示例
<speak>
  <say-as interpret-as="id">myid_1998</say-as>
</speak>
characters
characters 支持的格式: 中文输出
格式示例中文输出说明
字符串ISBN 1-001-099098-1I S B N 一 杠 零 零 一 杠 零 九 九 零 九 八 杠 一支持中文汉字、大小写英文字符、阿拉伯数字0~9以及部分全角和半角字符。输出的空格表示每个字符之间插入停顿,即字符一个一个地读。标签内的文本如果包含XML的特殊字符,需要做字符转义。
x10b2345_ux 一 零 b 二 三 四 五 下划线 u
v1.0.1v 一 点 零 点 一
版本号2.0版本号二 点 零
苏M MA000苏M M A 零 零 零
空中客车A330空中客车A 三 三 零
型号s01 s02和s03型号s 零 一 s 零二 和s 零 三
空中客车A330空中客车A 三 三 零
英文输出
格式示例英文读法说明
字符串*b+3$.c-0'=αasterisk B plus three dollar dot C dash zero apostrophe equals alpha支持中文汉字、英文字母、数字 0-9 及常用符号。
示例
<speak>
  <say-as interpret-as="characters">Greek letters αβ</say-as>
</speak>
<speak>
  <say-as interpret-as="characters">*b+3.c$=α</say-as>
</speak>
punctuation
punctuation 支持的格式: 中文输出
格式示例中文输出说明
标点符号...省略号支持常见中英文标点。输出的空格表示每个字符之间插入停顿,即字符一个一个地读。标签内的文本如果包含XML的特殊字符,需要做字符转义。
......省略号
!"#$%&叹号 双引号 井号 dollar 百分号 and
'()*+单引号 左括号 右括号 星号 加号
,-./:;逗号 杠 点 斜杠 冒号 分号
?@小于 等号 大于 问号 at
[]^_左方括号 反斜线 右方括号 脱字符 下划线
英文文本的效果与 characters 相同。
示例
<speak>
  <say-as interpret-as="punctuation"> -./:;</say-as>
</speak>
date
date 支持的格式: 中文输出
格式示例中文输出说明
xx年71年七一年支持2位和4位年份。2位年份支持60年99年、00年09年、10年19年。4位年份支持1000年1999年、2000年~2099年。
04年零四年
19年一九年
1011年一零一一年
1998年一九九八年
2008年二零零八年
xx年xx月98年4月九八年四月当月份为1到9月时,支持开头带"0"和不带"0"两种写法。
1998年04月一九九八年四月
08年8月零八年八月
2008年8月二零零八年八月
xx年xx月xx日/xx年xx月xx号98年4月23日九八年四月二十三日当日期为1到9日时,支持开头带"0"和不带"0"两种写法。
1998年04月23日一九九八年四月二十三日
08年8月8号零八年八月八号
2008年08月08号二零零八年八月八号
xx月xx号3月20日三月二十日
08月07号八月七号
年月缩写2018/08二零一八年八月支持"/"、"-"、"."作为缩写的分隔符。
2018-08二零一八年八月
2018.08二零一八年八月
年月日缩写2018/08/08二零一八年八月八日
2018-8-8二零一八年八月八日
2018.08.08二零一八年八月八日
xx年xx月xx日~xx年xx月xx日04年9月1日~30日零四年九月一日至三十日支持"~"、"-"作为"至"的缩写标志。
2004年09月01号-2008年06月08号二零零四年九月一号至二零零八年六月八号
xx年xx月~xx年xx月01年04月~10年04月零一年四月至一零年四月
2001年04月~2010年04月二零零一年四月至二零一零年四月
xx月xx日~xx月xx日10月1日~10月7日十月一日至十月七日
10月01号~10月07号十月一号至十月七号
xx月xx日~xx日10月1日~7日十月一日至七日
10月01号~07号十月一号至七号
年月日缩写~年月日缩写2018/03/03~2019/01/01二零一八年三月三日至二零一九年一月一日支持"/"、"."作为缩写的分隔符,支持"~"、"-"作为"至"的缩写标志。
1997.9.9~1998.9.9一九九七年九月九日至一九九八年九月九日
月日缩写~月日缩写10/20~10/31十月二十日至十月三十一日
xxxx月/xx月xx月1~10月一至十月
1月~10月一月至十月
月日年缩写10/20/2018二零一八年十月二十日仅支持4位的年份,仅支持"/"作为日期的分隔符,仅支持"月/日/年"的书写方式。
英文输出
格式示例英文读法说明
四位数/两位数 或 四位数-两位数2000/01two thousand, oh one年份跨度。
1900-01nineteen hundred, oh one
2001-02twenty oh one, oh two
2019-20twenty nineteen, twenty
1998-99nineteen ninety eight, ninety nine
1999-00nineteen ninety nine, oh oh
以 1 或 2 开头的四位数2000two thousand四位数年份。
1900nineteen hundred
1905nineteen oh five
2021twenty twenty one
星期-星期 或 星期~星期 或 星期&星期mon-wedmonday to wednesday范围分隔符中的 XML 特殊字符需转义。
tue~frituesday to friday
sat&sunsaturday and sunday
DD-DD MMM, YYYY 或 DD~DD MMM, YYYY 或 DD&DD MMM, YYYY19-20 Jan, 2000the nineteen to the twentieth of january two thousandDD = 两位数日期。MMM = 月份缩写或全称。YYYY = 四位数年份。
01 ~ 10 Jul, 2020the first to the tenth of july twenty twenty
05&06 Apr, 2009the fifth and the sixth of april two thousand nine
MMM DD-DD 或 MMM DD~DD 或 MMM DD&DDFeb 01 - 03february the first to the thirdMMM = 月份。DD = 日期。
Aug 10-20august the tenth to the twentieth
Dec 11&12december the eleventh and the twelfth
MMM-MMM 或 MMM~MMM 或 MMM&MMMJan-Junjanuary to juneMMM = 月份。
Jul - Decjuly to december
sep&octseptember and october
YYYY-YYYY 或 YYYY~YYYY1990 - 2000nineteen ninety to two thousandYYYY = 以 1 或 2 开头的四位数年份。
2001-2021two thousand one to twenty twenty one
WWW DD MMM YYYYSun 20 Nov 2011sunday the twentieth of november twenty elevenWWW = 星期(缩写或全称)。DD = 日期。MMM = 月份。YYYY = 年份。
WWW DD MMMSun 20 Novsunday the twentieth of november
WWW MMM DD YYYYSun Nov 20 2011sunday november the twentieth twenty eleven
WWW MMM DDSun Nov 20sunday november the twentieth
WWW YYYY-MM-DDSat 2010-10-01saturday october the first twenty ten
WWW YYYY/MM/DDSat 2010/10/01saturday october the first twenty ten
WWW MM/DD/YYYYSun 11/20/2011sunday november the twentieth twenty eleven
MM/DD/YYYY11/20/2011november the twentieth twenty eleven
YYYY1998nineteen ninety eight
其他默认读法10 Mar, 2001the tenth of march two thousand one
10 Marthe tenth of march
Mar 2001march two thousand one
Fri. 10/Mar/2001friday the tenth of march two thousand one
Mar 10th, 2001march the tenth two thousand one
Mar 10march the tenth
2001/03/10march the tenth two thousand one
2001-03-10march the tenth two thousand one
2000stwo thousands
2010'stwenty tens
1900'snineteen hundreds
1990snineteen nineties
示例
<speak>
  <say-as interpret-as="date">1000-10-10</say-as>
</speak>
<speak>
  <say-as interpret-as="date">10-01-2020</say-as>
</speak>
time
time 支持的格式: 中文输出
格式示例中文输出说明
时刻12:00十二点支持常用时间和时间范围格式。
12:00:00点十二点
10:20分十点二十分
10:20:30十点二十分三十秒
09:18:14九点十八分十四秒
时刻~时刻11:00~12:00十一点到十二点
09:00-14:00九点到十四点
11:00~11:30十一点到十一点三十分
11:00-12:18十一点到十二点十八分
10:30~11:00十点三十分到十一点
09:28-10:00九点二十八分到十点
10:20~11:20十点二十分到十一点二十分
06:00~08:00六点到八点
上午10:20~下午13:30上午十点二十分到下午十三点三十分
时间缩写5:00 am凌晨五点整
5:30 am凌晨五点半
5:20:12 am凌晨五点二十分十二秒
7:00 am上午七点整
7:30 AM上午七点半
7:20:12 a.m.上午七点二十分十二秒
07:08:12 A.M.上午七点零八分十二秒
5:00 pm下午五点整
5:30 PM下午五点半
5:20:12 p.m.下午五点二十分十二秒
05:09:12 P.M.下午五点零九分十二秒
9:00 pm晚上九点整
9:30 pm晚上九点半
9:20:12 PM晚上九点二十分十二秒
9:02:12 P.M.晚上九点零二分十二秒
12:00 pm中午十二点整
12:30 p.m.中午十二点半
12:20:12 PM中午十二点二十分十二秒
英文输出
格式示例英文读法说明
HH:MM AM 或 PM09:00 AMnine A MHH = 小时(1-2 位)。MM = 分钟(2 位)。AM/PM = 上午或下午。
09:03 PMnine oh three P M
09:13 p.m.nine thirteen p m
HH:MM21:00twenty one hundred
HHMM100one oclock
时间点-时间点8:00 am - 05:30 pmeight a m to five p m时间范围格式。
7:05~10:15 AMseven oh five to ten fifteen A M
09:00-13:00nine oclock to thirteen hundred
示例
<speak>
  <say-as interpret-as="time">5:00am</say-as>
</speak>
<speak>
  <say-as interpret-as="time">0500</say-as>
</speak>
currency
currency 支持的格式: 中文输出
格式示例中文输出说明
数字+金额标识符12.00 RMB十二人民币支持AUD(澳元)、CAD(加元)、HKD(港币)、JPY(日元)、USD(美元)、CHF(瑞士法郎)、NOK(挪威克朗)、SEK(瑞典克朗)、GBP(英镑)、RMB(人民币)、CNY(元)和EUR(欧元)。支持的数字格式包括:整数、小数以及以逗号分隔的国际写法。
12.50 RMB十二点五零人民币
12,000,000 RMB一千二百万人民币
12,000,000.00 RMB一千二百万人民币
12,000.35 RMB一万两千点三五人民币
金额标识符+数字$12十二美元支持 CAD(加元)、$(美元)、Fr(法郎)、kr(丹麦克朗)、£(英镑)、¥(元)和 EUR(欧元)。支持的数字格式包括:整数、小数以及以逗号分隔的国际写法。
$12.00十二美元
$12.12二点一二美元
$12,000一万两千美元
$12,000.00一万两千美元
$12,000.99一万两千点九九美元
其他默认读法1213一千二百一十三
1213 KML一千二百一十三K M L
1213.00 KML一千二百一十三K M L
1213.9 KML一千二百一十三点九K M L
1,000 KML一千K M L
1,000.00 KML一千K M L
1,000.98 KML一千点九八K M L
12,000一万两千
英文输出
格式示例英文读法说明
数字 + 货币标识符1.00 RMBone yuan支持整数、小数和千分位逗号分隔。
2.02 CNYtwo point zero two yuan
1,000.23 CN¥one thousand point two three yuan
1.01 SGDone singapore dollar and one cent
2.01 CADtwo canadian dollars and one cent
3.1 HKDthree hong kong dollars and ten cents
1,000.00 EURone thousand euros
货币标识符 + 数字US$ 1.00one US dollar支持整数、小数和千分位逗号分隔。
$0.01one cent
JPY 1.01one japanese yen and one sen
£1.1one pound and ten pence
€2.01two euros and one cent
USD 1,000one thousand united states dollars
数字 + 量词 + 货币标识符 或 货币标识符 + 数字 + 量词1.23 Tn RMBone point two three trillion yuan量词:thousand、million、billion、trillion、Mil、mil、K、k、Bn、bn、Tn、tn。
$1.2 Kone point two thousand dollars
示例
<speak>
  <say-as interpret-as="currency">13,000,000.00RMB</say-as>
</speak>
<speak>
  <say-as interpret-as="currency">$1,000.01</say-as>
</speak>
measure
measure 支持的格式: 中文输出
格式示例中文输出说明
数字+中文单位2片两片支持常见中文单位及单位缩写。
120公顷一百二十公顷
100多毫克一百多毫克
100来米一百来米
100余人一百余人
1厘米20毫米一厘米二十毫米
120.00平方公里一百二十平方公里
数字+单位缩写120.56 cm2一百二十点五六平方厘米
100 m 12 cm 6 mm一百米十二厘米六毫米
范围10~15 kg十至十五千克
10.24~789.82亩十点二四至七百八十九点八二亩
10米~15米十米至十五米
10.24 cm~19.08 cm十点二四厘米至十九点零八厘米
数字+单位+"/"+单位10元/斤十元每斤
199~299元/件一百九十九至二百九十九元每件
299.99元/g~399.99元/g二百九十九点九九元每克至三百九十九点九九元每克
其他默认读法12扎十二扎
30 rm三十r m
4万万同胞四万万同胞
12.897微克十二点八九七微克
英文输出
格式示例英文读法说明
数字 + 度量单位1.0 kgone kilogram支持整数、小数和千分位逗号分隔。支持常用单位缩写。
1,234.01 kmone thousand two hundred thirty-four point zero one kilometers
纯度量单位mm2square millimeter
示例
<speak>
  <say-as interpret-as="measure">100m12cm6mm</say-as>
</speak>
<speak>
  <say-as interpret-as="measure">1,000.01kg</say-as>
</speak>
符号发音
<say-as> 常用符号发音:
符号中文读法英文读法
!叹号exclamation mark
"双引号double quote
#井号pound
$dollardollar
%百分号percent
&andand
'单引号left quote
(左括号left parenthesis
)右括号right parenthesis
*asterisk
+plus
,逗号comma
-dash
.dot
/斜杠slash
:冒号colon
;分号semicolon
<小于less than
=等号equals
>大于greater than
?问号question mark
@atat
[左方括号left bracket
\反斜线backslash
]右方括号right bracket
^脱字符caret
_下划线underscore
`反引号backtick
\{左花括号left brace
|竖线vertical bar
\}右花括号right brace
~波浪线tilde
全角及特殊符号:
符号中文读法英文读法
叹号exclamation mark
左双引号left double quote
右双引号right double quote
左单引号left quote
右单引号right quote
左括号left parenthesis
右括号right parenthesis
逗号comma
句号full stop
em dash
冒号colon
分号semicolon
问号question mark
顿号enumeration comma
省略号ellipsis
……省略号ellipsis
左书名号left guillemet
右书名号right guillemet
人民币符号yuan
大于等于greater than or equal to
小于等于less than or equal to
不等于not equal
约等于approximately equal
±加减plus or minus
×times
πpi
希腊字母(大写):
符号中文读法英文读法
Α阿尔法alpha
Β贝塔beta
Γ伽玛gamma
Δ德尔塔delta
Ε艾普西龙epsilon
Ζ捷塔zeta
Θ西塔theta
Ι艾欧塔iota
Κ喀帕kappa
拉姆达lambda
Μmu
Νnu
Ξ克西ksi
Ο欧麦克轮omicron
pi
Ρrho
西格玛sigma
Τtau
Υ宇普西龙upsilon
Φfaiphi
Χchi
Ψ普赛psi
Ω欧米伽omega
希腊字母(小写):
符号中文读法英文读法
α阿尔法alpha
β贝塔beta
γ伽玛gamma
δ德尔塔delta
ε艾普西龙epsilon
ζ捷塔zeta
η依塔eta
θ西塔theta
ι艾欧塔iota
κ喀帕kappa
λ拉姆达lambda
μmu
νnu
ξ克西ksi
ο欧麦克轮omicron
πpi
ρrho
σ西格玛sigma
τtau
υ宇普西龙upsilon
φfaiphi
χchi
ψ普赛psi
ω欧米伽omega
常用度量单位
<say-as> 常用度量单位:
类别单位
长度nm(纳米)、μm(微米)、mm(毫米)、cm(厘米)、m(米)、km(千米)、ft(英尺)、in(英寸)
面积cm²(平方厘米)、m²(平方米)、km²(平方千米)、SqFt(平方英尺)
体积cm³(立方厘米)、m³(立方米)、km3(立方千米)、mL(毫升)、L(升)、gal(加仑)
重量μg(微克)、mg(毫克)、g(克)、kg(千克)
时间min(分钟)、sec(秒)、ms(毫秒)
电磁μA(微安)、mA(毫安)、Hz(赫兹)、kHz(千赫兹)、MHz(兆赫兹)、GHz(吉赫兹)、V(伏特)、kV(千伏)、kWh(千瓦时)
声音dB(分贝)
气压Pa(帕斯卡)、kPa(千帕)、MPa(兆帕)
其他还支持 tsp(茶匙)、rpm(转/分)、KB(千字节)、mmHg(毫米汞柱)等单位。

LaTeX 公式转语音

CosyVoice 可以将文本中的数学公式转换为自然语音,适用于有声书、在线教育等数理类音频内容场景。
该功能仅支持中文,其他语言可能无法正确朗读公式。

使用限制

  • 仅支持中文:不支持其他语言
  • 内容限制
    • 仅支持支持的标签和符号中列出的标签和符号
    • 不支持 Markdown 数学代码块(```math ... ```
    • 分隔符内只能包含公式,混入其他内容可能导致合成结果不准确
  • 兼容模型:cosyvoice-v3.5-flash、cosyvoice-v3.5-plus、cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2

使用方法

用指定的分隔符包裹文本中的公式,然后调用语音合成 API。
1

用分隔符标记公式

用以下任意分隔符包裹公式(效果相同):
  • $...$
  • $$...$$
  • \(...\)
  • \[...\]
示例:
这是一元二次方程的求根公式:$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$,请仔细计算。
2

调用 API 合成语音

调用语音合成 API,传入标记好公式的文本。在 JSON 或字符串中,反斜杠(\)是转义字符,需要写成 \\Python 调用示例:
# coding=utf-8

import os
import dashscope
from dashscope.audio.tts_v2 import *

# 如果未配置环境变量,请将下面一行替换为:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')

dashscope.base_websocket_api_url='wss://dashscope.aliyuncs.com/api-ws/v1/inference'

model = "cosyvoice-v3-flash"
voice = "longanyang"

synthesizer = SpeechSynthesizer(model=model, voice=voice)
audio = synthesizer.call("这是一元二次方程的求根公式:$x = \\frac{-b \\pm \\sqrt{b^2-4ac}}{2a}$,请仔细计算。")

print('[Metric] requestId: {}, first-package delay: {} ms'.format(
  synthesizer.get_last_request_id(),
  synthesizer.get_first_package_delay()))

with open('output.mp3', 'wb') as f:
  f.write(audio)

支持的标签和符号

以下是当前支持的标签和符号列表。

基础运算

标签或符号功能公式内容示例公式输入示例朗读效果
+加法2 + 3 = 5$2 + 3 = 5$二加三等于五
-减法3 - 2 = 1$3 - 2 = 1$三减二等于一
\pm正负号\pm 1 \pm 2$\pm 1\pm 2$正负一、正负二
\times乘法2 \times 3 = 6$2 \times 3 = 6$二乘三等于六
×乘法2 × 3 = 6$$2 × 3 = 6$$二乘三等于六
*乘法2 * 3 = 6\(2 * 3 = 6\)二乘三等于六
\div除法6\div2=3\[6\div2=3\]六除以二等于三
÷除法6÷2=3$6÷2=3$六除以二等于三
/除法6/2=3$6/2=3$六除以二等于三
=等于3+5=8$3+5=8$三加五等于八
<小于1< 2$1< 2$一小于二
小于等于3≤5$3≤5$三小于等于五
<=小于等于3<=5$3<=5$三小于等于五
\leq小于等于3\leq5$3\leq 5$三小于等于五
\le小于等于3\le5$3\le 5$三小于等于五
\leqq小于等于3\leqq5$3\leqq 5$三小于等于五
\leqslant小于等于3\leqslant5$3\leqslant 5$三小于等于五
>大于2>1$2>1$二大于一
大于等于5≥3$5≥3$五大于等于三
>=大于等于5>=3$5>=3$五大于等于三
\geq大于等于5\geq3$5\geq 3$五大于等于三
\ge大于等于5\ge3$5\ge 3$五大于等于三
\geqq大于等于5\geqq3$5\geqq 3$五大于等于三
\geqslant大于等于5\geqslant3$5\geqslant 3$五大于等于三
\frac分数2\frac3$\frac {2}{3}$三分之二
^2^1$2^{1}$二的一次方
\sqrt开方\sqrt{9} = 3$\sqrt {9} = 3$根号九等于三
\sqrt开方\sqrt[3]{8} = 2$\sqrt[3]{8} = 2$八的三次方根等于二
%百分号5\%$5\%$百分之五
|绝对值∣3∣=3$|3| =3$三的绝对值等于三
\vert绝对值3\vert=3$\vert 3\vert =3$三的绝对值等于三
\lg对数lg {10}$\lg {10}$lg 十
\log对数\log{5}$\log{5}$log 五
\ln自然对数\lnX$ln {10}$ln 十
!阶乘5!$5!$五的阶乘
()括号(2+1)$(2+1)$括号二加一
\{ \}花括号\{2+1\}$\{2+1\}$花括号二加一

特殊数学符号

标签或符号转换结果公式内容示例公式输入示例朗读效果
\alphaalpha\alpha$\alpha$阿尔法
\Alphaalpha\Alpha$\Alpha$阿尔法
\betabeta\beta$\beta$贝塔
\Betabeta\Beta$\Beta$贝塔
\gammagamma\gamma$\gamma$伽马
\Gammagamma\Gamma$\Gamma$伽马
\deltadelta\delta$\delta$德尔塔
\Deltadelta\Delta$\Delta$德尔塔
\infty无穷大\infty$\infty$无穷大
无穷大$∞$无穷大

几何

标签或符号功能公式内容示例公式输入示例朗读效果
\pi圆周率\pi=3.14159$\pi =3.14159$派等于 3.14159
\sin三角函数\sin 30^\circ=\frac{1}{2}$\sin 30^\circ =\frac {1}{2}$正弦三十度等于二分之一
\cos三角函数\cos 30^\circ=\frac{\sqrt{2}}{2}$\cos 30^\circ =\frac {\sqrt {2}}{2}$余弦三十度等于二分之根号二
\tan三角函数\tan 30^\circ=\frac{\sin 30^\circ}{\cos 30^\circ}$\tan 30^\circ =\frac {\sin 30^\circ}{\cos 30^\circ}$正切三十度等于正弦三十度除以余弦三十度
\csc三角函数\csc A$\csc A$余割 A
\sec三角函数\sec A$\sec A$正割 A
\cot三角函数\cot A$\cot A$余切 A
\angle\angle AB$\angle AB$角 AB
∠AB$∠AB$角 AB
^\circ∠AB = 30^\circ$∠AB = 30^\circ$角 AB 等于三十度
\odot\odot$\odot$
\overset\frown\overset\frown {BC}$\overset\frown {BC}$弧 BC
\rm{Rt}直角\because \rm{Rt}\triangle ABC$\because \rm{Rt}\triangle ABC$因为三角形 ABC 是直角三角形
\mathrm{Rt}直角\therefore AB \perp BC$\therefore AB \perp BC$所以 AB 垂直于 BC
\triangle三角形\triangle ABC$\triangle ABC$三角形 ABC
三角形△ABC$△ABC$三角形 ABC
\parallelogram平行四边形\parallelogram ABCD$\parallelogram ABCD$平行四边形 ABCD
\perp垂直AB \perp BC$AB \perp BC$AB 垂直于 BC
\bot垂直AB \bot BC$AB \bot BC$AB 垂直于 BC
垂直AB ⊥ BC$AB ⊥ BC$AB 垂直于 BC
\parallel平行A\parallel B$A\parallel B$A 平行于 B
\equalparallel平行且等于A\equalparallel B$A\equalparallel B$A 平行且等于 B
\cong全等△ABC\cong△DEF$△ABC\cong△DEF$三角形 ABC 全等于三角形 DEF

条件关系

标签或符号功能公式内容示例公式输入示例朗读效果
\implies推出\implies 1+1=2$\implies 1+1=2$可推出一加一等于二
\iff等价于p\iffq$p\iffq$p 等价于 q
\because因为\because a = b \therefore b=a$\because a = b \therefore b=a$因为 a 等于 b,所以 b 等于 a
\therefore所以\because a = b \therefore b=a$\because a = b \therefore b=a$因为 a 等于 b,所以 b 等于 a

单位

单位必须用 \unit\quantity\mathit\mathrm\rm 标签包裹(例如 \unit{cm})。
标签或符号朗读效果公式内容示例公式输入示例朗读示例
mm毫米5\quantity{mm}$5\quantity{mm}$五毫米
cm厘米5\quantity{cm}$5\quantity{cm}$五厘米
dm分米5\quantity{dm}$5\quantity{dm}$五分米
m5\quantity{m}$5\quantity{m}$五米
km千米5\quantity{km}$5\quantity{km}$五千米
g5\quantity{g}$5\quantity{g}$五克
kg千克5\quantity{kg}$5\quantity{kg}$五千克
t5\quantity{t}$5\quantity{t}$五吨
mm^2平方毫米5\quantity{mm^2}$5\quantity{mm^2}$五平方毫米
cm^2平方厘米5\quantity{cm^2}$5\quantity{cm^2}$五平方厘米
dm^2平方分米5\quantity{dm^2}$5\quantity{dm^2}$五平方分米
m^2平方米5\quantity{m^2}$5\quantity{m^2}$五平方米
km^2平方千米5\quantity{km^2}$5\quantity{km^2}$五平方千米
mm^3立方毫米5\quantity{mm^3}$5\quantity{mm^3}$五立方毫米
cm^3立方厘米5\quantity{cm^3}$5\quantity{cm^3}$五立方厘米
dm^3立方分米5\quantity{dm^3}$5\quantity{dm^3}$五立方分米
m^3立方米5\quantity{m^3}$5\quantity{m^3}$五立方米
km^3立方千米5\quantity{km^3}$5\quantity{km^3}$五立方千米
ml毫升5\quantity{ml}$5\quantity{ml}$五毫升
s5\quantity{s}$5\quantity{s}$五秒
min分钟5\quantity{min}$5\quantity{min}$五分钟
h小时5\quantity{h}$5\quantity{h}$五小时
km/h千米每小时5\quantity{km/h}$5\quantity{km/h}$五千米每小时
g/l克每升5\quantity{g/l}$5\quantity{g/l}$五克每升

常见问题

输入的公式没有被朗读?

  1. 分隔符:确认公式已用 $...$$$...$$\(...\)\[...\] 包裹
  2. 公式复杂度:确认公式仅使用了支持的标签和符号中的内容
  3. 转义字符:确认在 API 请求中,反斜杠(\)已转义为 \\

代码中如何处理反斜杠(\)?

反斜杠(\)在字符串和 JSON 中是转义字符,需要写成 \\。例如:在 Python、Java、JavaScript 等语言中,\frac 应写为 \\frac
SSML 与 LaTeX - 千问AI平台