语速、停顿、多音字:合成结果怎么精细调
**合成结果往往不是”完全不能用”,而是”大体可用,但有那么三四处别扭”。**语速稍微赶了点、某个地方该喘口气却一路念下去、一个品牌名读成了另一个字。
这类问题不需要换模型,也不需要重训。各有各的调法,而且手段之间有明确优先级——先试哪个、不行再试哪个。这篇讲的就是这个顺序。至于”为什么会读错”的成因,见 TTS 前端文本处理。
先分清你不满意的是什么
动手前花十秒归类,能省掉大量瞎试:
- 发音错:某个字读成别的音,属注音层。
- 节奏不对:字都对,但快了慢了、该停不停,属时长与韵律层。
- 音质不对:发闷、带金属味,在声学模型与声码器那一段,本篇手段使不上力,见 TTS 的三段流水线。
- 语气不对:没读错也不赶,就是情绪不搭,属风格控制,见 情感与语气控制。
前两类是本篇能修的,而且大多能修干净。
语速:改时长预测,不是改波形
两种做法都叫”调语速”,实际完全不是一回事。
**做法一:在推理时改时长预测比例。**声学模型内部会预测每个音素该持续多久,改这个比例,相当于让模型”本来就打算说得快一点”。生成出来的仍是一段自然语音,音高、气口都按新时长重新算过。
做法二:对已合成的波形做变速。这是纯信号处理。直接改播放速率会连音高一起改变,一听就是快进磁带;想保持音高不变得用变速不变调算法,而这类算法本身会引入失真,语音尤其容易出现颤抖感。
**结论:能在推理阶段调,就别在波形上调。**前者是重新生成,后者是事后拉扯。只有手上只剩一个音频文件、回不到合成环节时,才退而用波形变速。
停顿:标记、标点、切句
三种手段,从直接到间接:
**一、显式停顿标记。**很多系统支持 SSML 一类的标记语言来插入停顿,但是否支持、支持哪些标签、语法长什么样,完全取决于你用的具体实现,必须查文档:有的只支持一个很小的子集,有的用私有语法,有的干脆不支持。
**二、用标点间接控制。**通用性最好,因为前端的韵律预测本来就吃标点:
| 标点 | 前端通常给的停顿 |
|---|---|
| 逗号、顿号 | 短停 |
| 分号、冒号 | 中等 |
| 句号、问号、感叹号 | 长停,且句调会重置 |
| 破折号、省略号 | 偏长,常带语气变化 |
想让某处多停一下,把逗号改成句号往往立刻见效——代价是句调也跟着重置,语气会显得更断。
**三、把长句切短。**该停的地方直接断句,是不支持标记时的兜底。长句本身也容易让韵律预测出错,切短是双重收益。
多音字与专名:注音标注最直接
**给出注音标注强制指定读音,是修复读错最直接的手段。**不依赖模型改进,立刻生效,只影响这一处。
人名、地名、品牌名是重灾区——它们大多是未登录词,前端只能靠猜,别指望换个模型能猜对。具体的注音写法各系统不同,仍要查所用实现的文档。
数字:直接写成中文
**这是最实用的一招。**同一串阿拉伯数字没有唯一读法,前端只能靠上下文猜。与其调规则赌它猜对,不如直接把「二零二五年」写进文本。
你比系统更清楚这个数字该怎么读——把这个知识写进文本,比让它去猜可靠得多。金额、编号、电话号码、比分、日期全都适用。隐藏好处是结果稳定:换模型、升版本,中文字符的读法不会变,而 TN 规则可能变。
分级修法表
拿到一段不满意的音频,按下表逐级往下试:
| 不满意的地方 | 优先试 | 还不行试什么 |
|---|---|---|
| 整体偏快或偏慢 | 调推理时的时长预测比例 | 拆句、加标点重排节奏;波形变速是最后手段 |
| 局部某句偏赶 | 在该句前后加停顿标记 | 这句单独拆一段合成再拼接 |
| 该停没停 | 逗号改句号,或插停顿标记 | 直接断成两句 |
| 停顿太多显得拖沓 | 减少标点、短句合并 | 查原文有无多余的省略号、破折号 |
| 某个字读错 | 注音标注强制指定 | 加词典;再不行改写用词 |
| 专名读错 | 注音标注,并保证专名不被拆开 | 改用更常见的写法或全称 |
| 数字读法不对 | 直接写成中文 | 改写句式让语境更明确 |
| 英文缩写读法怪 | 拉开间隔写成字母,或换中文说法 | 加词典 |
| 语气不搭 | 改写文本(加语气词、换句式) | 换风格控制手段或换音色 |
| 发闷、有金属味 | 本篇手段无效 | 换声码器或音色 |
**用法:从左往右、从上往下,别跳级。**跳过”改文本”直接去调参数,是最常见的时间浪费。
调节的副作用
每种手段都有代价,用过头会引出新问题:
- **语速太快会吞音。**辅音起始被压缩,咬字含糊,可懂度掉得比预期早。
- **语速太慢会显得呆。**音素被均匀拉长,而真人放慢时是重点词拉长、虚词照旧。
- **停顿插太多会显得刻意。**每个短语后都留一口气,像在念稿;真人的停顿是不均匀的。
- **注音标注加太多会难维护。**文本里塞满标注,谁都不敢改这段话。高频专名该沉到词典或预处理层。
**判断标准只有一个:整段连着听。**逐句调时每句都变好、连起来却更怪,是常态。
批量场景:建规则,不要逐句手调
要合成的是几百条播报、一整本书时,逐句手调会崩溃,换个人接手就全乱。应该把修法沉淀成预处理规则:
- **专名注音表。**把业务里的人名、地名、品牌名、产品名收进一份表,合成前自动套用。
- **数字改写规则。**按字段类型固定写法:订单号逐位读、金额按数量读、年份按年份读。这些在你的业务里是确定的,不必每次让 TN 猜。
- **标点规范。**统一文案的标点习惯——韵律的一致性来自输入的一致性。
- **回归清单。**挑十几条覆盖各类模式的代表文本,每次换模型或改规则都重听一遍。
关键:规则放在合成前的预处理层,别污染原始文案——它还要给人读、给别的渠道用。长文本还需处理切分与拼接,见 长文本切分与拼接。
调不动的时候怎么办
有些句子就是调不好。承认这一点能省很多时间:
**第一,改文本比调参数有效得多。**把想要的停顿、语气、断句直接写进文本——加个语气词、换个句式、把长句拆成两句。参数是隔着一层跟模型商量,文本是直接告诉它。
**第二,换个音色可能比死磕当前音色快。**不同音色的韵律风格差异很大,某个音色在长句上就是容易赶。与其花一小时把它压回来,不如换一个试,往往几分钟就有结论。
**第三,接受”这句就是合成不好”,然后改文案。**这是很多人不愿承认但最省时间的选择。一句话反复调都别扭,说明句式和当前系统不合,重写一句意思相同的话通常一次就过。文案不是圣旨,目标是听感而非逐字忠实。至于哪些别扭是调节根本解决不了的,见 为什么合成音听起来像机器。
常见问题
问:语速和停顿应该调到什么数值?
没有通用答案,各实现的参数含义和取值范围都不同,抄别人的数值大概率不适用。做法是在自己的业务文本上做 A/B 试听,固定其他变量只动一个,找到档位后写进规范。
问:调参数会不会影响音色相似度?
大幅调整时会。时长预测拉得太偏,韵律会偏离参考音频原有的说话习惯,听感是”还是那个声音,但不像那个人说话了”。克隆音色场景尤其明显,幅度保守些。
问:能不能只把有问题的那句重新合成再替换进去?
可以,但要注意拼接处:分开合成的片段可能音色漂移、语速不一致,接缝处也容易有爆音。缓解办法是固定随机种子与说话人嵌入、接缝处做短交叉淡化、避免片段切得过短。
相关阅读
- TTS 前端文本处理:多音字、数字、英文缩写怎么读对
- TTS 的三段流水线:前端、声学模型与声码器
- 情感与语气控制:三种方式与它们的取舍
- 为什么合成音听起来像机器:五个常见原因
- 长文本切分与拼接:怎么切才不毁韵律
本文讲的是语音合成精细调节的通用原理,不绑定任何具体实现。 各家系统的参数名称与取值范围、注音标注语法、是否支持 SSML 及支持哪些标签差异极大,请以你所用系统的官方文档为准。 文中不给具体参数数值,因为跨实现不可移植;我们也未对任何方案做过实测,故不提供速度、评分一类的数字。