← 所有文章

AI 配音中的 SSML:如何控制停顿、语调和重音

浅色背景上发光的玻璃质声波和透明球体

SSML 是一种标记语言,它告诉语音合成引擎不仅读什么,还要怎么读:在哪里停顿、用多快的语速、强调哪个词、数字怎么念。普通文本给不了这种精度:逗号可能变成停顿,也可能不会。下面是一份实用拆解:哪些标签在真实引擎里可用、中文的多音字和数字怎么处理、在长配音之前该先验证什么,以及最常见的错误在哪里。

有标点,为什么还需要标记

标点只能提供粗放的控制:多数引擎在句号处停顿,对破折号几乎不敏感。短句够用。但给视频、有声书或语音应答配音就不够:那里需要停顿正好是 300 毫秒,而不是「看情况」;价格也不能被念成一串数字。SSML 补上了普通文本没有的三样东西:精确停顿、声音参数(语速、音高、音量),以及数字、日期和缩写的读法提示。

先说一句能省时间的提醒:标记本身不会让文本变好。句子写得差,SSML 只会把差句子念得更清楚。

SSML 在哪里能用,在哪里不能用

SSML 是 W3C 标准,但各引擎的支持并不一样。有的合成器支持完整标签集,有的除了停顿什么都不认,还有的把标记当成普通文本、直接念出来。所以第一步不是写一大段带标记的长文,而是用一句短话测试引擎。dev.to 上关于语音 AI 与 SSML 的拆解(2026 年 10 月 25 日)列出了基础标签;完整规范见 W3C 的 SSML 1.1。

值得记住的是,失败是任何生成的正常部分。根据生产库的匿名汇总(server/seo/benchmarkData.json,窗口 2026-09-25 至 10-25),平台 30 天内完成了 14,784 次生成:12,323 张图片、2,001 条视频和 460 段音乐。即便是成熟模型也会有失败:90 天内 gpt-image-2 的成功率为 93.3%(2,991 次完结生成),seedream-4.5 为 91.2%(1,395 次)。配音也是同样的逻辑:先短句,后长文。

骨架:<speak>、<p> 和 <s>

严格的引擎要求整段文本都包在根标签 <speak> 里。里面再标注段落和句子,方便在需要的地方加停顿、改语速。

<speak>
  <p><s>第一句。</s><s>第二句。</s></p>
</speak>

文本里的特殊符号要转义:&amp; 代替 &,&lt; 代替 <。否则有的引擎会拒绝请求,有的会把「and 符号」念出来。

停顿:<break>

<break> 有两种写法:精确时间(time="300ms" 或 time="1.2s")或强度(strength="weak|medium|strong|x-strong")。第二种适合不在意毫秒数、而要自然层次的场景:词间短停、句间中停、段落间长停。

第一段。<break time="400ms"/>
第二段。<break strength="strong"/>
新的想法。

中文旁白的参考值:句间 250–400 毫秒,语义块之间 600–800 毫秒。这不是标准,只是起点——试听时通常想缩短而不是加长。也不要在每个词后面都放 <break>:语音会变得支离破碎。

语速、音高和音量:<prosody>

<prosody> 管理三个参数。rate 是语速:用词(x-slow、slow、medium、fast)或百分比(rate="90%")。pitch 是音高:low、high、百分比或半音(pitch="+1st")。volume 是音量:soft、loud 或 0 到 100 的数字。

<prosody rate="95%" pitch="+1st">
这句话会稍微慢一点、高一点。
</prosody>

长篇旁白把语速保持在 90–100%:更快只适合广告和短提示。音高只调半音到一音,不要「拉满」:+20st 会让声音变成卡通音,而且常常超出引擎允许范围。音量最好交给引擎,成片在编辑器里再统一响度。

重音:<emphasis>

<emphasis level="strong|moderate|reduced"> 用来突出一个词或短语。它比听起来更克制:不是喊叫,而是语调的轻微偏移。规则很简单——每段一到两处。如果半段文字都被强调,那就等于没有强调。

注意:优惠<emphasis level="strong">仅限今天</emphasis>。
三个透明玻璃球由细细的光线连接

数字、日期和缩写:<say-as> 和 <sub>

这是 SSML 最实用的部分——给有歧义的地方加提示。<say-as interpret-as="..."> 告诉引擎怎么读:按数字、日期、时间、电话或逐字读。<sub alias="..."> 则把写出来的内容替换成要念的内容。

价格是 <say-as interpret-as="cardinal">12500</say-as> 元。
会议在 <say-as interpret-as="date">2026-11-01</say-as> 举行。
<sub alias="人工智能">AI</sub>模型。

各引擎支持的 interpret-as 取值不同:有的支持「currency」和「telephone」,有的只有「cardinal」和「characters」。标签不被支持时,文本通常会被原样读出——但这一定要用短例验证。

读音与多音字

SSML 为此提供了 <phoneme alphabet="ipa" ph="..."> 和 x-sampa 写法。问题是音素标注只有少数引擎支持,中文里更少见。实际可用的办法有三个:使用引擎自己的注音语法(这不是 SSML 的一部分,而且不一定生效)、换一个同义词、或者改写句子让歧义消失。不要把想强调的字写成大写:有些引擎会逐字念出来。

如果引擎支持 <sub>,可以用它固定读音——替换成明确写法或足够清楚的上下文。办法笨一点,但在 <phoneme> 沉默的地方能用。

不要依赖的标签

<voice>(在文本中换声音)、<audio>(插入音频文件)和 <mark>(播放器书签)在标准里有定义,但云合成引擎很少支持:通常不允许中途换声,外部音频可能被拦截,书签也只有自建播放器才用得上。在基于它们设计流程之前,先查具体引擎的文档。

验证顺序:从短句到长文

这套流程花十分钟,能省几个小时:

  1. 用一句话覆盖你准备使用的全部标签。
  2. 生成语音并试听:标签是被念出来了、被忽略了,还是生效了?
  3. 对比两个版本——带标记和不带标记:停顿和语速真的变了吗?
  4. 只有确认之后,再处理完整文本,分成段落,并把可用的标记保存成模板。

网站上的配音工具单次最多接受 5000 个字符——长文最好拆成几段,再在编辑器里拼接。这样重录一段就行,不必推翻全部。

常见错误

  • 缺少根标签 <speak>——严格引擎直接拒绝请求。
  • & 和 < 没有转义——请求出错或被逐字念出。
  • <break> 太多——语音不自然地断裂。
  • 音高用赫兹而不是半音或百分比——超出范围报错。
  • 嵌套 <prosody> 且参数互相矛盾——结果取决于引擎。
  • 把标记发给不支持的引擎——标签被念出声。

简短检查清单

  • 在引擎文档里确认标签支持情况。
  • 先用一句话测试全部所需标签。
  • 句间停顿保持 250–400 毫秒。
  • 语速 90–100%,音高 ±1–2 个半音。
  • 每段一到两处强调。
  • 数字、日期、缩写用 <say-as> 和 <sub>。
  • 长文拆成几段。

常见问题

SSML 和 AI 配音是一回事吗?

不是。SSML 是标记语言,AI 配音是把文本变成语音的引擎。引擎可能完整支持 SSML、部分支持,或者完全不支持。

为什么引擎把标签念了出来?

因为它期待普通文本,没有识别出标记。去掉标签,或者在设置里打开 SSML 模式(如果有)。

能给中文多音字指定读音吗?

没有通用标签。引擎支持 <phoneme> 就用它;否则用引擎自己的注音语法、换词,或者改写句子。

一次能配多长的文本?

各服务限制不同。NeuralSpace 的配音工具单次最多 5000 字符;长文请分段处理。

想实际试试这些标记,可以到免费文字转语音和带语调的配音两个工具。若引擎不支持 SSML,它会按原样读文本——这时停顿靠标点和分段来控制,语速与音高更适合在编辑器里调整。