语音合成是怎么工作的:从文本到波形的三段流水线
语音合成(TTS)是把一段文字变成可播放音频的技术,它在工程上通常由三段接力完成:前端做文本分析,声学模型把语言学特征变成声学中间表示,声码器再把中间表示还原成时域波形。
把这三段记牢的实际价值是:当合成音听着不对劲时,你能判断该动哪一段。同样是”听着别扭”,多音字读错和音色发闷完全不是一个问题,修的地方也完全不同。
这条链路和语音识别的四个环节正好是镜像关系:ASR 把波形一层层剥成文字,TTS 把文字一层层长成波形。有意思的是,两者的中间站是同一个东西——梅尔频谱。
第一段:前端,把文字翻译成”该怎么念”
前端不产生任何声音,它做的是把书面文本变成一份发音说明书。输入是人写的字,输出是带发音标注与韵律标注的序列。它至少要处理四件事:
- 文本规范化(TN):把书面写法转成口语读法。“2025 年”要变成”二零二五年”,“3.14”要变成”三点一四”。注意这个方向——TTS 前端做的是书面到口语,而 ASR 后端的 ITN 做的是口语到书面,两者是一对反向操作。
- 分词:中文没有天然词边界,分词错了后面全错。
- 注音:中文多音字必须靠上下文消歧,“银行”和”行走”、“重复”和”重量”、“了解”和”算了”,字形一样读音不同。
- 韵律预测:哪里停顿、哪个字重读、句尾升调还是降调。
前端是中文 TTS 最容易翻车的地方,因为规则离不开语义。同样是 2025,当年份读”二零二五”,当数量读”两千零二十五”,当房间号又可能逐位读——光看字符串永远判断不出来。类似的还有 1-2 到底是”一到二”还是”一杠二”,3/4 是”四分之三”还是一个日期。
英文缩写更是没有通法:API 逐字母读、NASA 当一个单词读、iOS 有约定俗成的读法,只能靠词典。多音字消歧也有两条路——词典加规则可控、专名能手工补,神经网络 G2P 覆盖广但会出意外错误。工业系统常常两条都用,并且一定保留人工干预的入口。更细的拆解见TTS 前端到底在做什么。
第二段:声学模型,把发音说明书变成声音的”设计图”
声学模型接过前端的标注序列,输出一份声学中间表示。最常见的中间表示是梅尔频谱:一张时间与频率的二维图,记录了每个时刻各频段的能量。
它决定的是音高走向、每个音持续多久、整体的音色特征。你可以把它理解成一张声音的设计图——已经把”这句话听起来什么样”定下来了,但还不是能播放的音频。
为什么非要在中间停一站
这是理解 TTS 架构最关键的一点。
梅尔频谱是一个信息量适中的中间表示。往上看,它比纯文字丰富得多——文字里没有音高、没有时长、没有音色,频谱里都有。往下看,它又比原始波形紧凑得多——波形每秒有上万个采样点,而频谱每秒只有几十帧,数量级差得很远。
这个”不多不少”的位置带来三个实际好处:
- 两个子问题各自可解。前一半是”这句话该怎么念”,后一半是”这张频谱该怎么发出声”,两者的难点完全不同,硬塞进一个模型反而更难训。
- 可替换。换个声码器不用重训声学模型,反之亦然。
- 可单独训练。声码器的训练不需要文本,只要音频,数据来源宽得多。
代价也有:声学模型训练时见到的是真实频谱,推理时声码器却要吃预测出来的频谱,这个不匹配是两段式的经典问题。也正因如此,有一类做法干脆省掉显式的中间表示,让文本直接到波形。两条路各有各解决的问题,这里不下”哪种是未来”的结论。想细看两段的分工与配合,见声学模型和声码器各管什么;想理解梅尔频谱本身,可以从 ASR 侧的梅尔频谱入门,那边讲的是同一个东西。
第三段:声码器,把设计图变成真实波形
声码器负责最后一步:从梅尔频谱还原出时域波形。
这一步比看上去难,因为它是个欠定问题——频谱只记了各频段的能量,把相位信息丢掉了。早年用 Griffin-Lim 迭代去估计相位,结果就是那种典型的金属感。神经声码器改成直接学习频谱到波形的映射,音质有了很大改善。
现在主要有三条技术路线,各有取舍,不分高下:
- 自回归:逐个采样点生成,音质好,但慢。
- 基于流或 GAN:一次性并行生成整段波形,快得多,是当前实时场景常见的选择。
- 扩散或流匹配:迭代去噪生成,质量高,迭代步数直接影响延迟。
出问题时,先看症状落在哪一段
| 症状 | 大概率出在 |
|---|---|
| 多音字读错(“银行”读成”行走”的行) | 前端注音 |
| 数字读法不对(年份读成了数量) | 前端 TN |
| 断句停顿离谱,该停不停 | 前端韵律预测 |
| 人名、地名、专业术语读错 | 前端词典,缺词条 |
| 英文缩写读法不对 | 前端词典,没有通法只能补 |
| 语气平板,每句一个调子 | 声学模型,韵律建模能力或控制信号 |
| 语速忽快忽慢、字被拖长 | 声学模型的时长预测 |
| 音色发闷、高频糊、有金属感 | 声码器 |
| 出现电流声、爆音、杂音 | 声码器 |
| 长文本前后音色漂移 | 分段合成的拼接策略,不在三段内 |
用这张表的方式是:先定位到段,再决定要不要换模型。很多被当成”模型不行”的问题,其实是前端缺了几个词条,加上就好了;而真正需要换模型的音色问题,改文本再多次也没用。合成音整体”像机器”的成因不止一条,为什么合成语音听起来像机器里有更完整的归因。
常见问题
问:一定要分三段吗?有没有一个模型全包的方案?
有。端到端 TTS 让文本直接到波形,省掉显式的梅尔频谱,好处是没有两段之间的误差累积与不匹配。两段式的好处则是模块可替换、可分别优化、训练资源要求更低。近年还有一类做法把语音离散化成 token,用语言模型的方式预测语音 token 再解码成波形,这让零样本音色克隆和用提示词控制风格变得自然。各条路解决的问题不同,按场景选就行。
问:合成一句话要多久?
这个数字脱离场景没有意义。更值得关心的是首包延迟——从请求发出到收到第一块可播放音频的时间。只要首包够快、后续生成速度跟得上播放速度,用户听到的就是连续无卡顿的语音,总耗时再长也感知不到;反过来总耗时很短但一次性返回,用户还是得干等。详见流式 TTS 与首包延迟。
问:换一个更好的模型能解决所有问题吗?
不能。前端的多音字、数字读法、专名,本质是知识与规则问题,换模型只是换一批错误。这类问题最直接的修法是给出注音标注强制指定读音,或者干脆把数字写成中文,绕开规范化的歧义。
问:三段之外还有什么会影响最终听感?
采样率与音频格式。采样率不是越高越好——目标信道是 8 kHz 电话时,合成 48 kHz 再降采样是白费算力。另外长文本的切分与拼接也在三段之外,切得不好会让韵律断裂。
相关阅读
- 语音识别是怎么工作的:从声波到文字的四个环节
- 梅尔频谱和 fbank:ASR 的输入为什么不是原始波形
- 流式 TTS 与首包延迟
- 声学模型和声码器各管什么
- TTS 前端到底在做什么
- 为什么合成语音听起来像机器
本文讲的是语音合成领域的通用原理,不绑定某一个具体实现。 各家系统的段落划分、默认配置与能力边界差异很大,请以你所用系统的官方文档为准。 我们没有对文中提到的任何方案做过性能实测,因此不给延迟、音质评分一类的数字。