Skip to content

语音合成

语音合成 TTS 把文本转换成可播放的语音。它的难点不只是“发出声音”,而是读准文本、控制韵律、保持自然音色,并在真实设备上稳定播放。

TTS 声学模型与声码器

TTS 分成两层问题

TTS 可以拆成“怎么读”和“怎么发声”两层。

层次解决的问题失败表现
文本前端数字、日期、单位、多音字、分词读错字、断错句、金额日期读法不对
声学与波形生成音色、韵律、清晰度、自然度机械、拖沓、破音、气声、卡顿

很多线上 TTS 问题并不是模型音质差,而是文本前端没处理好。例如导航播报、客服金额、设备型号、英文缩写,都需要领域规则。

文本规范化

文本规范化负责把“写给人看的文本”变成“适合朗读的文本”。

原文需要判断的问题
2026-05-17读日期还是读编号
3.14读小数、版本号还是数学常数
100km/h单位读法和语序
RMB 128.5货币、金额、小数位
010-88888888电话区号和号码分组

同一个字符串在不同业务里读法不同。版本号“3.10”不能读成“三点一”,金额“3.10 元”不能读成“三点十版本”。因此 TTS 前端需要业务上下文,而不是只靠通用规则。

分词、多音字和韵律

中文 TTS 要解决词边界和读音。多音字依赖上下文,“重庆”和“重复”的“重”不同,“银行行长”里两个“行”也不同。

韵律决定用户听起来是否自然:

韵律要素作用
停顿让长句可理解,避免一口气读完
重音突出关键信息,如金额、时间、目的地
语速控制信息密度,客服和导航通常不宜过快
语调区分陈述、疑问、提醒和警告
情绪控制品牌角色,但不能牺牲清晰度

长文本合成时,分句非常关键。切分太短会断裂,切分太长会首包慢、韵律漂移。

声学模型

声学模型把文字、音素、韵律和音色条件转成声学特征,例如梅尔谱。它决定一句话的大体“说法”:谁在说、语气如何、哪里停顿、哪里拉长。

常见控制项:

控制项影响
说话人音色和身份感
语速信息密度和响应时长
音高年龄感、情绪和自然度
能量重音、强调和响度趋势
风格客服、导航、播报、角色化表达

控制项不是越多越好。过多可调参数会增加测试矩阵,也容易出现某些组合下不稳定。

声码器

声码器把声学特征还原成波形。它直接影响声音质感、细节和实时性。

关注点说明
音质是否有金属感、毛刺、气泡声
实时率合成是否快于播放速度
稳定性长文本是否漂移或突然变调
算力端侧设备能否长期运行
采样率与设备播放链路是否匹配

端侧 TTS 常常需要在音质、模型大小、功耗和首包延迟之间取舍。云端 TTS 可以使用更大模型,但要承担网络延迟和可用性风险。

流式合成

语音助手和大模型对话需要流式 TTS。流式合成的目标是尽快开始播第一句话,同时避免后续断续。

策略作用风险
按标点切片简单稳定大模型输出没标点时首包慢
按短语切片首包快切错会破坏韵律
缓冲几段再播播放更稳响应变慢
可中断播放支持用户打断需要清理 TTS 和播放器状态

如果文本来自大模型流式输出,不应每来几个字就合成一次。更稳的做法是等待短语或语义边界,再启动合成。

音色和声音克隆

音色是产品体验的一部分。客服、导航、儿童故事、虚拟人对音色要求不同。声音克隆可以用少量样本生成相似音色,但要处理授权、隐私和滥用风险。

场景建议
品牌助手使用授权清晰的固定音色
客服外呼优先清晰、稳定、可懂,不追求强角色化
儿童内容语速、音高、情绪要更保守
个人声音克隆明确授权,增加防滥用策略

高风险场景不应让合成声音冒充真实个人身份。

播放侧适配

TTS 在耳机里好听,不代表在小音箱、车机或手机外放上好听。设备播放链路会改变最终效果。

设备约束处理
小喇叭低频弱限制低频,避免发闷和破音
功放余量小控制峰值和响度,避免削顶
播报和音乐混放统一响度策略,必要时 ducking
播放时要继续听用户TTS 必须进入 AEC 播放参考
多语言混读前端要识别语言和缩写读法

评估指标

指标看什么
读错率数字、单位、多音字、英文缩写是否正确
自然度韵律、停顿、语调是否像真实说话
可懂度噪声和小喇叭下是否听得清
首包延迟从提交文本到开始播放的时间
实时率合成速度是否满足实时播放
播放稳定性长文本是否断续、爆音、变调

TTS 评估要按场景建立样本。导航要测地名、距离、路口;客服要测金额、日期、条款;智能助手要测短回复、长回复和打断。

常见问题

现象优先排查
数字读错文本规范化和业务上下文
多音字错分词、词典、上下文模型
长句不自然分句和韵律预测
首句慢流式切片、模型冷启动、网络
播放破音响度、限幅、功放、扬声器
播放时误唤醒TTS 是否进入 AEC 参考

总结

TTS 的质量来自文本前端、声学模型、声码器和播放链路共同作用。工程上要把“读准、自然、低延迟、可打断、设备上不破音”一起验收,而不是只听离线生成的一段样音。

别急,先让缓存热一下。