声学模型和声码器:TTS 两段式结构讲清楚

2026-08-24

主流语音合成系统不是从文字一步跳到声音的,中间隔着一张梅尔频谱:声学模型负责”文字 → 频谱”,声码器负责”频谱 → 波形”。前者决定这句话该怎么念,后者决定这个念法听起来像不像真人发声。

这两段是整条 TTS 流水线的后两段,前面还有一段文本前端(三段的全貌见TTS 三段流水线)。很多人第一反应是:既然最终要的是波形,为什么不让模型一口气生成完?

为什么非要在中间插一张频谱

因为文字和波形之间的信息量差得太远了。

文字太干瘪。“你好”两个字里,没有音高、没有时长、没有音色——同样两个字,可以用兴奋的语调半秒说完,也可以用低沉的语气拖两秒。这些信息文字里一个都没有。

波形又太啰嗦。一秒钟的音频是上万个采样点(常见输出采样率有 16 kHz、22.05 kHz、24 kHz 直到 48 kHz),每个点都是一个要预测的数字。让模型直接从两个汉字预测出几万个数字,中间跨度太大,学习目标太散。

梅尔频谱正好卡在中间这个位置:它比文字丰富得多,音高、时长、音色都写在里面;又比波形紧凑得多,每秒只有几十帧,每帧几十上百维。这一层中间表示把一个大问题切成了两个小问题:

  • 声学模型只需回答”这句话的频谱长什么样”——它管的是内容和表现力。
  • 声码器只需回答”给定这张频谱,波形该是什么样”——它管的是音质,而且跟具体说什么话无关

切开之后有三个实打实的好处:两个子问题各自可解、可以分别训练、可以单独替换。声码器换成更好的一版,声学模型一行代码不用改。这也是为什么开源生态里声码器常常是可以单拎出来复用的组件。

有意思的是,语音识别那边也用梅尔频谱,但方向相反——识别是把频谱当输入,合成是把频谱当输出,同一种表示,一个当起点一个当终点(识别侧的用法见梅尔频谱和 fbank)。

声码器真正难在哪:频谱把相位丢了

这是本篇最该记住的一点。

从波形算频谱,是一次有损的操作。做短时傅里叶变换时,每个频率成分本来有两个属性:幅度(这个频率有多强)和相位(这个频率的波峰出现在什么位置)。而我们通常只留下幅度,把相位扔掉了。

相位听起来抽象,打个比方:一个乐队里,每件乐器该多大声,这是幅度;每件乐器该在什么时刻起拍,这是相位。同一份”各乐器音量表”,配上不同的起拍时刻,可以拼出完全不同的声音——有的整齐有力,有的一塌糊涂。

所以”从梅尔频谱恢复波形”是个欠定问题:目标信息本来就不全,答案不唯一。声码器必须自己把丢掉的那一半补出来。

早期的做法是 Griffin-Lim:反复在时域和频域之间来回变换,一点点迭代逼近一个自洽的相位。它不需要训练,实现简单,但补出来的相位并不是真实相位,只是”数学上说得通”的一个解。听感上就会有那种典型的金属感、水下感——所有细节都在,就是不像人在说话。

神经声码器换了个思路:不去猜相位,直接学习”频谱 → 波形”这个映射本身。模型在海量真实语音上见过无数次”这样的频谱对应这样的波形”,于是它输出的波形自带合理的相位结构。音质因此大幅改善,这也是现代 TTS 听感能接近真人的关键一步。

反过来说,当合成语音听起来发闷、带毛刺或者有金属味时,问题往往出在声码器这一段,而不是声学模型——这类”像机器”的成因还有好几种,另文再谈(见合成语音为什么一听就像机器)。

声码器的三条技术路线

它们的差别,说到底就是”怎么把波形生成出来”。

路线生成方式速度特征音质特征适合场景
自回归一个采样点一个采样点地往外吐,每个点都依赖前面已生成的点天然串行,逐点生成因而慢,且无法靠并行硬件缓解建模细腻,历史上最早证明神经声码器可行离线渲染、对音质要求高于时效的场合
基于流 / GAN一次前向把整段波形并行生成出来无串行依赖,快得多已能满足大多数实用需求实时对话、流式播报,当前实时场景的主流
扩散 / 流匹配从噪声出发,迭代若干步去噪,逐步逼近目标波形介于两者之间,步数直接决定延迟质量高,可通过调步数在质量和速度之间换质量优先、或可接受调参权衡的场景

三条路线是并存的技术选择,不是新旧替代关系。自回归的慢是结构性的:第 N 个采样点必须等第 N-1 个算完,再多的算力也压不下去。而并行路线一次成型,代价是要用更巧的训练方式(对抗训练、可逆流变换)来保证质量。

扩散和流匹配这一路的特点是步数可调:多迭代几步质量更好,少迭代几步更快。这个旋钮在流式场景里格外要紧,因为它直接换算成用户等待的首包时间(为什么首包比总耗时更重要,见流式 TTS 与首包延迟)。开源实例里,F5-TTS 自述使用 flow matching,属于这一类生成路线。

两段式的经典毛病:训练和推理见到的不是同一张频谱

分成两段带来了灵活性,也带来了一道缝。

声码器训练时,喂给它的是从真录音里算出来的真实频谱——干净、锐利、细节完整。可实际推理时,它拿到的是声学模型预测出来的频谱——多少会偏平滑,高频细节偏弱,还带着声学模型自己的系统性误差。

两者的分布不一致。 声码器在训练中从没见过这种”略糊”的输入,面对它时表现自然打折,听感上可能表现为发闷、齿音不清或者偶发的杂音。工程上常见的缓解办法是用声学模型的预测频谱去微调声码器,让它提前适应真实输入。

这道缝正是端到端 TTS 想消除的东西之一:文字直接到波形,中间不再显式生成梅尔频谱,也就不存在两段之间的误差累积。但端到端也有自己的代价——模块不再能单独替换,训练资源要求更高。两条路各有各要解决的问题,谁也没有一统天下(详细对比见端到端 TTS 和两段式)。

常见问题

问:声码器和声学模型可以随便配对吗?

不能。声码器认的是具体的频谱格式:采样率、帧长帧移、梅尔滤波器数量、频率范围、是否取对数——这些参数必须和声学模型的输出严格对齐。任何一项对不上,声码器看到的就是一张”含义错位”的图,输出往往是噪声。换任一侧之前,先核对双方的频谱配置。

问:为什么识别可以扔掉相位,合成却不行?

因为任务目标不同。识别只要知道”说了什么”,这件事主要写在频谱的幅度包络里,相位贡献很小,扔掉反而是减负。合成的目标是产出能听的声音,而人耳对相位结构是敏感的——相位不对,同样的幅度谱听起来就是不自然。同一个信息,在一个任务里是噪声,在另一个任务里是命门。

问:现在还有必要了解 Griffin-Lim 吗?

有,但主要是作为理解工具。它把”相位缺失”这个问题赤裸裸地摆出来了——你能亲耳听到只靠数学猜相位是什么效果,也就理解了神经声码器到底改善了什么。此外在调试链路时,它不需要模型、算得快,可以用来快速验证”频谱本身对不对”:如果 Griffin-Lim 出来的音频虽然有金属感但内容和语调是对的,那说明声学模型没问题,锅在声码器那一段。

相关阅读


本文讲的是语音合成的通用结构原理,不绑定某一个具体实现。 各家系统的中间表示、声码器路线与频谱参数差异很大,请以你所用系统的官方文档为准。 我们没有对文中提到的任何方案做过性能实测,因此不给速度、延迟、音质评分一类的数字。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。