SSML 简介
SSML(Speech Synthesis Markup Language)是一种基于 XML 的语音合成标记语言。它不仅能让语音合成大模型读出更丰富的文本内容,还支持对语速、语调、停顿、音量等语音特征进行精细控制,甚至可以添加背景音乐,带来更具表现力的语音效果。
SSML 的优势
- 精细控制:精确控制语速、音调、音量等参数
- 多音字处理:通过拼音标注解决多音字读音问题
- 自然停顿:模拟真实说话中的自然停顿
- 特殊读法:数字、日期、电话号码等按规范读法朗读
- 音效增强:支持添加背景音乐和音效
更多文档
CosyVoice语音合成SSML标记语言使用说明 - 云声配音
CosyVoice语音合成LaTeX公式使用说明 - 云声配音
CosyVoice声音设计使用教程:如何编写高质量的声音描述? - 云声配音
CosyVoice语音合成SSML标记语言使用说明 - 云声配音
限制与约束
支持的模型
| 模型名称 | 说明 |
|---|---|
| cosyvoice-v3.5-flash | 支持SSML功能 |
| cosyvoice-v3.5-plus | 支持SSML功能 |
| cosyvoice-v3-flash | 支持SSML功能 |
| cosyvoice-v3-plus | 支持SSML功能 |
| cosyvoice-v2 | 支持SSML功能 |
支持的音色
- 复刻音色(用户自定义克隆的音色)
- 系统音色列表中标记为支持SSML的音色(如 longanyang)
快速开始
基本结构
所有使用 SSML 功能的文本内容必须包含在 <speak></speak> 标签内:
<speak>你好,欢迎使用语音合成服务。</speak>
第一个 SSML 示例
<speak voice="longanyang" rate="1.0" pitch="1.0" volume="50">
大家好,欢迎使用阿里云语音合成服务。
<break time="500ms"/>
<prosody rate="1.2">这是快速朗读的示例文字。</prosody>
</speak>
重要规则
- 必须包含在
<speak>标签内 - 支持多个
<speak>标签并列,但不支持嵌套 - 特殊字符需要转义:
"→"'→'&→&<→<>→>
SSML 标签详解
speak 根节点标签
<speak> 是所有 SSML 标签的根节点,任何使用 SSML 功能的文本内容都必须包含在此标签内。
语法
<speak [属性列表]>文本内容</speak>
属性说明
| 属性名 | 类型 | 必选 | 说明 | 取值范围 |
|---|---|---|---|---|
| voice | String | 否 | 指定发音人(音色) | 具体音色ID |
| rate | String | 否 | 语速 | [0.5, 2] 之间的小数,默认1 |
| pitch | String | 否 | 音高(语调) | [0.5, 2] 之间的小数,默认1 |
| volume | String | 否 | 音量 | [0, 100] 之间的整数,默认50 |
| effect | String | 否 | 音效类型 | robot/lolita/lowpass/echo/eq/lpfilter/hpfilter |
| effectValue | String | 否 | 音效参数 | 根据音效类型而定 |
| bgm | String | 否 | 背景音乐URL | 阿里云OSS上的WAV文件URL |
示例
<!-- 基本用法 -->
<speak>这是最简单的SSML文本。</speak>
<!-- 指定音色 -->
<speak voice="longanyang">我是龙眼杨音色。</speak>
<!-- 控制语速 -->
<speak rate="2">我的语速比正常人快。</speak>
<!-- 控制音调 -->
<speak pitch="0.5">我的音高比别人低。</speak>
<!-- 控制音量 -->
<speak volume="80">我的音量很大。</speak>
<!-- 组合属性 -->
<speak voice="longanyang" rate="1.2" pitch="1.1" volume="60">
综合调整后的语音效果。
</speak>
<!-- 添加音效 -->
<speak effect="robot">你喜欢机器人瓦力吗?</speak>
<!-- 添加背景音乐 -->
<speak bgm="http://your-bucket.oss-cn-beijing.aliyuncs.com/bgm.wav" backgroundMusicVolume="30">
<break time="2s"/>
阴崖老木苍苍烟
<break time="700ms"/>
雨声犹在竹林间
</speak>
音效类型详解
| 音效类型 | 说明 | effectValue |
|---|---|---|
| robot | 机器人音效 | 无需设置 |
| lolita | 萝莉音效 | 无需设置 |
| lowpass | 低通音效 | 无需设置 |
| echo | 回声音效 | 无需设置 |
| eq | 均衡器(高级) | 8个频段增益值,如 "1 -20 1 1 1 1 20 1" |
| lpfilter | 低通滤波器 | 频率值,如 "800" |
| hpfilter | 高通滤波器 | 频率值,如 "1200" |
break 停顿标签
在语音合成过程中添加一段静默时间,模拟自然说话中的停顿效果。
语法
<!-- 空属性,默认停顿1秒 -->
<break/>
<!-- 指定停顿时长 -->
<break time="string"/>
属性说明
| 属性名 | 类型 | 必选 | 说明 |
|---|---|---|---|
| time | String | 否 | 停顿时长,支持秒(s)或毫秒(ms)单位 |
取值范围
- 秒(s):[1, 10] 之间的整数
- 毫秒(ms):[50, 10000] 之间的整数
示例
<speak>
请闭上眼睛休息一下
<break time="500ms"/>
好了,请睁开眼睛。
</speak>
<speak>
第一段内容
<break time="2s"/>
第二段内容
</speak>
<!-- 使用空属性 -->
<speak>
开始
<break/>
结束
</speak>
注意事项
- 连续多个
<break>标签的停顿时长会累加 - 总停顿时长超过10秒时,仅生效前10秒
prosody 韵律标签
控制文本的语速、音调和音量,实现更细腻的语音效果。
语法
<prosody [rate="string"] [pitch="string"] [volume="string"]>文本</prosody>
属性说明
| 属性名 | 类型 | 必选 | 说明 | 取值范围 |
|---|---|---|---|---|
| rate | String | 否 | 语速 | [0.5, 2] 之间的小数 |
| pitch | String | 否 | 音调 | [0.5, 2] 之间的小数 |
| volume | String | 否 | 音量 | [0, 100] 之间的整数 |
示例
<speak>
<!-- 快速朗读 -->
<prosody rate="1.5">这是快速朗读的文字。</prosody>
<!-- 慢速朗读 -->
<prosody rate="0.7">这是慢速朗读的文字。</prosody>
<!-- 高音调 -->
<prosody pitch="1.5">这是音调较高的文字。</prosody>
<!-- 低音调 -->
<prosody pitch="0.7">这是音调较低的文字。</prosody>
<!-- 大音量 -->
<prosody volume="80">这是音量较大的文字。</prosody>
<!-- 小音量 -->
<prosody volume="20">这是音量较小的文字。</prosody>
<!-- 组合使用 -->
<prosody rate="0.8" pitch="0.9" volume="40">这是慢速低沉的文字。</prosody>
</speak>
phoneme 发音标签
控制某段文本的具体发音方式,中文可用拼音,英文可用音标,适用于多音字等需要精准发音的场景。
语法
<phoneme alphabet="string" ph="string">文本</phoneme>
属性说明
| 属性名 | 类型 | 必选 | 说明 |
|---|---|---|---|
| alphabet | String | 是 | 发音类型:py(拼音) 或 cmu(音标) |
| ph | String | 是 | 具体的拼音或音标 |
拼音规则
- 字与字的拼音用空格分隔
- 拼音数目必须与字数一致
- 音调为 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>
<speak>
<!-- 更多多音字示例 -->
这个人很<phoneme alphabet="py" ph="le4">乐</phoneme>观,喜欢听音<phoneme alphabet="py" ph="yue4">乐</phoneme>。
</speak>
常见多音字拼音参考
| 词语 | 拼音 |
|---|---|
| 典当行 | dian3 dang4 hang2 |
| 当掉 | dang4 diao4 |
| 快乐 | kuai4 le4 |
| 音乐 | yin1 yue4 |
| 行业 | hang2 ye4 |
| 行走 | xing2 zou3 |
| 银行 | yin2 hang2 |
| 便宜 | pian2 yi5 |
| 方便 | fang1 bian4 |
sub 替换标签
将某段文本替换为指定的更适合朗读的文本。
语法
<sub alias="string">原文本</sub>
属性说明
| 属性名 | 类型 | 必选 | 说明 |
|---|---|---|---|
| alias | String | 是 | 替换后的朗读文本 |
示例
<speak>
<!-- 缩写展开 -->
<sub alias="网络协议标准">W3C</sub>制定了语音合成标准。
</speak>
<speak>
<!-- 专业术语替换 -->
请使用<sub alias="结构化查询语言">SQL</sub>查询数据库。
</speak>
<speak>
<!-- 英文缩写 -->
<sub alias="人工智能">AI</sub>技术正在快速发展。
</speak>
say-as 读法标签
告诉大模型文本是什么类型,并按该类型的常规读法进行朗读。
语法
<say-as interpret-as="string">文本</say-as>
属性说明
| interpret-as 值 | 说明 |
|---|---|
| cardinal | 按整数或小数的常见读法朗读 |
| digits | 按数字逐个读出 |
| telephone | 按电话号码的常用方式读出 |
| name | 按人名的常规读法朗读 |
| address | 按地址的常见方式读出 |
| id | 适用于账户名、昵称等 |
| characters | 将文本按字符一一读出 |
| punctuation | 将文本按标点符号的方式读出 |
| date | 按日期格式的常见读法朗读 |
| time | 按时间格式的常见方式读出 |
| currency | 按金额的常见读法处理 |
| measure | 按计量单位的常见方式读出 |
示例
<speak>
<!-- 数字读法 -->
<say-as interpret-as="cardinal">12345</say-as>
<!-- 输出:一万二千三百四十五 -->
<!-- 逐个数字 -->
<say-as interpret-as="digits">12345</say-as>
<!-- 输出:一二三四五 -->
<!-- 电话号码 -->
<say-as interpret-as="telephone">138-0013-8000</say-as>
<!-- 输出:幺三八 零零幺三 八零零零 -->
<!-- 日期 -->
<say-as interpret-as="date">2024-01-15</say-as>
<!-- 输出:二零二四年一月十五日 -->
<!-- 时间 -->
<say-as interpret-as="time">14:30</say-as>
<!-- 输出:十四点三十分 -->
<!-- 金额 -->
<say-as interpret-as="currency">$1,234.56</say-as>
<!-- 输出:一千二百三十四点五六美元 -->
<!-- 计量单位 -->
<say-as interpret-as="measure">100kg</say-as>
<!-- 输出:一百千克 -->
<!-- 地址 -->
<say-as interpret-as="address">北京市海淀区中关村大街1号</say-as>
<!-- ID -->
<say-as interpret-as="id">user_12345</say-as>
<!-- 输出:U S E R 下划线 一二三四五 -->
<!-- 字符逐个读 -->
<say-as interpret-as="characters">ABC123</say-as>
<!-- 输出:A B C 一 二 三 -->
</speak>
soundEvent 音效标签
支持在语音中插入音效文件,如提示音、环境音等。
语法
<soundEvent src="URL"/>
属性说明
| 属性名 | 类型 | 必选 | 说明 |
|---|---|---|---|
| src | String | 是 | 外部音频URL |
音频要求
- 采样率:16kHz
- 声道数:单声道
- 文件格式:WAV
- 文件大小:不超过2MB
- 位深度:16位
音频转换命令
ffmpeg -i 输入音频 -acodec pcm_s16le -ac 1 -ar 16000 输出.wav
示例
<speak>
一匹马受了惊吓
<soundEvent src="http://nls.alicdn.com/sound-event/horse-neigh.wav"/>
人们四散躲避。
</speak>
<speak>
电话铃响了
<soundEvent src="http://your-bucket.oss-cn-beijing.aliyuncs.com/ring.wav"/>
请接听电话。
</speak>
实战案例
案例1:新闻播报
<speak voice="longanyang" rate="1.0">
<break time="300ms"/>
各位听众朋友大家好,欢迎收听今日新闻。
<break time="500ms"/>
<prosody rate="0.9">
今天是<say-as interpret-as="date">2024-01-15</say-as>,
星期一,农历腊月初五。
</prosody>
<break time="400ms"/>
首先关注天气情况。
<break time="300ms"/>
北京地区今日晴转多云,气温<say-as interpret-as="cardinal">-5</say-as>到<say-as interpret-as="cardinal">5</say-as>摄氏度。
<break time="400ms"/>
下面播报重要新闻。
<break time="300ms"/>
<prosody rate="1.0">
据新华社报道,我国科技创新取得重大突破...
</prosody>
</speak>
案例2:有声读物
<speak voice="longanyang" rate="0.9">
<break time="500ms"/>
<prosody pitch="1.1">
第一章 初遇
</prosody>
<break time="800ms"/>
<prosody rate="0.85">
那是一个阳光明媚的早晨,
<break time="300ms"/>
小明像往常一样走在上学的路上。
<break time="400ms"/>
突然,一个陌生的声音传来:
</prosody>
<break time="300ms"/>
<prosody pitch="1.3" rate="1.1">
"你好,请问图书馆怎么走?"
</prosody>
<break time="400ms"/>
<prosody rate="0.85">
小明转过身,看到了一个陌生的女孩。
<break time="300ms"/>
她有着一双明亮的眼睛,脸上带着温暖的微笑。
</prosody>
</speak>
案例3:客服语音
<speak voice="longanyang" rate="1.0">
<break time="200ms"/>
您好,欢迎致电客服热线。
<break time="300ms"/>
<prosody rate="0.9">
您的来电对我们非常重要,请耐心等待。
</prosody>
<break time="500ms"/>
为方便为您服务,请输入您的手机号码。
<break time="300ms"/>
<prosody rate="0.85">
如需人工服务,请按<say-as interpret-as="digits">0</say-as>。
<break time="200ms"/>
查询订单,请按<say-as interpret-as="digits">1</say-as>。
<break time="200ms"/>
售后服务,请按<say-as interpret-as="digits">2</say-as>。
</prosody>
<break time="400ms"/>
感谢您的耐心等待,正在为您转接人工客服...
</speak>
案例4:教育课件
<speak voice="longanyang" rate="0.9">
<break time="300ms"/>
<prosody pitch="1.1">
小学语文第三课:多音字学习
</prosody>
<break time="600ms"/>
同学们好,今天我们来学习几个常见的多音字。
<break time="400ms"/>
第一个字是"乐"。
<break time="300ms"/>
<prosody rate="0.85">
当读作<phoneme alphabet="py" ph="le4">乐</phoneme>时,表示快乐、高兴。
<break time="200ms"/>
例如:快乐、欢乐。
</prosody>
<break time="300ms"/>
<prosody rate="0.85">
当读作<phoneme alphabet="py" ph="yue4">乐</phoneme>时,表示音乐。
<break time="200ms"/>
例如:音乐、乐器。
</prosody>
<break time="400ms"/>
请跟读:
<break time="200ms"/>
<prosody rate="0.8">
快乐的<phoneme alphabet="py" ph="le4">乐</phoneme>,
音乐的<phoneme alphabet="py" ph="yue4">乐</phoneme>。
</prosody>
</speak>
案例5:游戏配音
<speak voice="longanyang" effect="robot">
<break time="200ms"/>
<prosody pitch="0.9" rate="0.8">
警告!警告!
</prosody>
<break time="300ms"/>
<prosody rate="1.0">
敌军还有<say-as interpret-as="digits">30</say-as>秒到达战场!
</prosody>
<break time="500ms"/>
<prosody pitch="1.2" rate="1.1">
请所有战士立即就位!
</prosody>
<break time="300ms"/>
<soundEvent src="http://your-bucket.oss-cn-beijing.aliyuncs.com/alarm.wav"/>
<prosody rate="0.9">
重复一遍,敌军还有<say-as interpret-as="digits">30</say-as>秒到达战场!
</prosody>
</speak>
常见问题与解决方案
问题1:SSML文本非法错误
错误信息:SSML text is illegal
原因:
- SSML格式不正确
- 特殊字符未转义
- 标签未正确闭合
解决方案:
<!-- 错误示例 -->
<speak>他说:"你好"</speak>
<!-- 正确示例 -->
<speak>他说:"你好"</speak>
问题2:多音字读音错误
原因:模型无法正确识别多音字
解决方案:使用 <phoneme> 标签明确指定读音
<speak>
去<phoneme alphabet="py" ph="dian3 dang4 hang2">典当行</phoneme>把这个玩意
<phoneme alphabet="py" ph="dang4 diao4">当掉</phoneme>。
</speak>
问题3:语速/音调控制不生效
原因:
- 属性值超出范围
- 标签嵌套导致优先级问题
解决方案:
<!-- 确保属性值在有效范围内 -->
<speak>
<!-- rate: 0.5-2 -->
<prosody rate="1.5">正确的语速设置</prosody>
<!-- pitch: 0.5-2 -->
<prosody pitch="1.2">正确的音调设置</prosody>
<!-- volume: 0-100 -->
<prosody volume="80">正确的音量设置</prosody>
</speak>
问题4:停顿时间不正确
原因:多个 <break> 标签累加超过10秒限制
解决方案:
<!-- 错误:总停顿超过10秒 -->
<speak>
开始
<break time="5s"/>
<break time="5s"/>
<break time="5s"/>
结束
<!-- 实际只生效10秒 -->
</speak>
<!-- 正确:控制总停顿时间 -->
<speak>
开始
<break time="3s"/>
中间
<break time="3s"/>
结束
</speak>
问题5:WebSocket API调用SSML失败
原因:未设置 enable_ssml 参数
解决方案:
{
"header": {
"action": "run-task",
"task_id": "xxx",
"streaming": "duplex"
},
"payload": {
"task_group": "audio",
"task": "tts",
"function": "SpeechSynthesizer",
"model": "cosyvoice-v3-flash",
"parameters": {
"voice": "longanyang",
"enable_ssml": true
},
"input": {}
}
}
附录
SSML 标签速查表
| 标签 | 功能 | 常用属性 |
|---|---|---|
<speak> |
根节点 | voice, rate, pitch, volume, effect, bgm |
<break> |
停顿 | time |
<prosody> |
韵律控制 | rate, pitch, volume |
<phoneme> |
发音标注 | alphabet, ph |
<sub> |
文本替换 | alias |
<say-as> |
读法指定 | interpret-as |
<soundEvent> |
音效插入 | src |
常用音色列表
| 音色ID | 描述 | 支持SSML |
|---|---|---|
| longanyang | 龙眼杨 | ✓ |
| longcheng_v2 | 龙城 | ✓ |
| longxiaochun | 龙小淳 | ✓ |
| longwan | 龙婉 | ✓ |
参考链接
文档版本:v1.0
最后更新:2026年
适用模型:cosyvoice-v3-flash, cosyvoice-v3-plus, cosyvoice-v2
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。


评论(0)