SSML 语音合成标记语言 & LaTeX 公式朗读 调研报告
一、概述
SSML(Speech Synthesis Markup Language,语音合成标记语言)是由 W3C 制定的标准 XML 标记语言,用于控制文本转语音(TTS)的输出。通过 SSML 标签,开发者可以精确控制合成语音的语速、音调、音量、停顿、发音方式、朗读风格等。
LaTeX 公式朗读则是在此基础上的能力延伸——将数学公式(以 LaTeX 源码表示)转换为自然语音,让 TTS 能够"读懂"数学表达式并正确朗读。
- **SSML 标准版本:** SSML 1.0(2004)→ SSML 1.1(2010)
- **LaTeX 朗读本质:** 将公式解析后映射到对应的读法规则,结合 SSML 的 say-as、phoneme 等标签输出
- **SSML 本质:** 给 TTS 引擎的"剧本"——告诉它怎么"演"
二、SSML 核心标签一览
| 标签 | 作用 | 备注 |
|------|------|------|
| | 根元素,所有 SSML 的容器 | ✅ 通用标准 |
| | 指定声音(男女/特定语音包) | ✅ 通用标准 |
| | 控制语速、音调、音量 | ✅ 通用标准 |
| | 插入停顿(毫秒或强度) | ✅ 通用标准 |
| | 指定朗读方式(数字/日期/电话等) | ✅ 通用标准 |
| | 自定义发音(IPA 或拼音) | ✅ 通用标准 |
| | 强调文本(强/中/弱) | ✅ 通用标准 |
| | 插入音频文件或音效 | ✅ 通用标准 |
| | 切换语言 | ✅ 通用标准 |
|
/ | 段落 / 句子划分 | ✅ 通用标准 |
| | 替代文本朗读 | ✅ 通用标准 |
| | 设置标记点,用于事件回调/同步 | ✅ 通用标准 |
| | 耳语效果 | ⚠️ 部分平台扩展 |
| | 微软专属:风格+角色扮演 | 🔶 微软 Azure 扩展 |
| | 亚马逊专属:情感控制 | 🔶 Amazon 扩展 |
三、SSML 常用标签详解
1. `` — 根容器
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="zh-CN">
你好世界
</speak>
2. `` — 语速 / 音调 / 音量 控制
<prosody rate="80%">慢一点读这句话</prosody>
<prosody rate="x-slow">非常慢</prosody>
<prosody pitch="+10%">稍微高一点</prosody>
<prosody pitch="low">低沉的声音</prosody>
<prosody volume="loud">大声一点</prosody>
rate:x-slow, slow, medium, fast, x-fast 或百分比(默认 100%)
3. `` — 停顿
<break strength="strong"/>
<break time="500ms"/>
<break time="2.5s"/>
4. `` — 指定朗读方式
<say-as interpret-as="cardinal">123</say-as> <!-- 一百二十三 -->
<say-as interpret-as="date" format="ymd">2024-01-01</say-as>
<say-as interpret-as="telephone">010-12345678</say-as>
<say-as interpret-as="fraction">3/4</say-as> <!-- 四分之三 -->
5. `` — 精确控制发音
<phoneme alphabet="py" ph="zhong1 guo2">中国</phoneme>
<phoneme alphabet="ipa" ph="ˈtʃaɪnə">China</phoneme>
> 最实用场景:纠正多音字、罕见姓氏、专业术语发音
6. 其他标签
<sub alias="世界贸易组织">WTO</sub>
<emphasis level="strong">非常重要</emphasis>
<audio src="https://example.com/notification.mp3">通知音</audio>
<lang xml:lang="en-US">Hello, welcome!</lang>
四、LaTeX 公式朗读
4.1 核心挑战
- **符号歧义**:同一符号在不同上下文读法不同(a' 读"a 撇" vs 'a' 读"单引号 a")
- **嵌套结构**:分数、根式、上下标嵌套时的断句
- **读法约定**:中文"x 的平方" vs 英文"x squared"
- **希腊字母**:α β γ 等的名称和读音
4.2 中文读法规则
| LaTeX | 读法 |
|-------|------|
| x + y | x 加 y |
| x^2 | x 的平方 |
| \frac{x}{y} | y 分之 x |
| \sin x | 正弦 x |
| \int_{a}^{b} f(x) dx | 从 a 到 b f(x) 对 x 的积分 |
| \sum_{i=1}^{n} a_i | i 从 1 到 n 的求和 a_i |
| \lim_{x \to 0} | x 趋向于 0 的极限 |
4.3 实现方案
方案一:预处理替换 — LaTeX → 自然语言 → TTS
方案二:SSML 模板映射(推荐)— LaTeX → SSML → TTS
方案三:MathML → SSML 桥接 — LaTeX → MathML → SSML
五、各平台 SSML 支持对比
| 平台 | 标准 SSML | 中文支持 | 特点 |
|------|-----------|---------|------|
| Azure TTS | ✅ 大部分 | ✅ 优秀 | 30+中文声音,10+风格 |
| 阿里云 | ✅ 大部分 | ✅ 优秀 | 微笑/情感/方言 |
| 腾讯云 | ✅ 大部分 | ✅ 良好 | 支持 break/prosody/say-as |
| 百度 TTS | ⚠️ 部分 | ✅ 一般 | 仅基础标签 |
| 讯飞 | ⚠️ 部分 | ✅ 良好 | 自有扩展格式 |
| Amazon Polly | ✅ 大部分 | ⚠️ 有限 | 中英双语声音较少 |
| OpenAI TTS | ❌ 不支持 | ⚠️ | 不支持 SSML |
| ElevenLabs | ❌ 不支持 | ⚠️ | 不支持 SSML |
六、实用示例
新闻播报
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="zh-CN">
<prosody rate="90%" pitch="0%">
今天是<say-as interpret-as="date" format="ymd">2024-01-15</say-as>,
欢迎收看新闻联播。
<break time="500ms"/>
<emphasis level="strong">央行宣布降准0.5个百分点</emphasis>。
</prosody>
</speak>
数学公式朗读
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="zh-CN">
<prosody rate="85%">
求解一元二次方程:
<break time="400ms"/>
x 的平方 加 2x 减 3 等于 0。
<break time="600ms"/>
根据求根公式,x 等于 负 b 加减根号下 b 平方减 4ac,除以 2a。
</prosody>
</speak>
七、优势与局限
优势
- ✅ 标准通用:一次编写多处使用(部分兼容)
- ✅ 精确发音控制:解决多音字/人名最大痛点
- ✅ 提升自然度:让 TTS 不再"机器感"
- ✅ 节奏控制:精细的停顿和语速调节
- ✅ 音效插入:支持插入音频和音效
局限
- ❌ 非所有 TTS 引擎支持(OpenAI/ElevenLabs 不支持)
- ❌ 各平台扩展标签不兼容
- ❌ LaTeX 朗读没有统一标准,需要自行实现映射
八、适用场景 & 建议
推荐使用 SSML 的场景
- 需要精确发音校正(多音字、人名、专业术语)
- 新闻播报、有声书——需要节奏控制
- 客服语音——需要情感/风格定制
- 需要插入音效的交互式语音场景
推荐接入 LaTeX 公式朗读的场景
- 在线教育平台——数学/物理课程的语音讲解
- 无障碍辅助工具——帮助视障学生
- 数学内容播报——语音播报数学试卷/题目
- 问答机器人——涉及数学公式的语音交互
建议
- 使用 Azure/Aliyun/Tencent TTS → 强烈建议接入 SSML
- 使用 OpenAI/ElevenLabs → 不支持 SSML,需用 prompt 或 API 参数控制
- LaTeX 朗读 → 推荐采用 SSML 模板映射方案,精度最高
文章评论