直觉:文字到声音,中间隔着一张"声谱"

让机器把"今天天气不错"念出来,难点在于:文字是离散的符号序列(几个字),而声音是连续的高采样率波形(16kHz 意味着 1 秒就有 16000 个采样点)。从十几个字到几万个浮点数,是一次巨大的信息扩张,而且充满不确定性——同一句话可以有无数种合理的语调、节奏、音色。

现代 TTS 几乎都采用两段式架构来分而治之:

1
2
文本 ──[声学模型]──▶ 梅尔频谱(mel-spectrogram) ──[声码器]──▶ 波形
预测"怎么念" 一张时频图 还原成声音

中间的梅尔频谱是关键枢纽。它是一张二维图:横轴时间、纵轴频率(按人耳敏感的梅尔刻度划分),每个像素表示某时刻某频段的能量。它比原始波形紧凑得多(一帧覆盖约 10ms,且只有几十到上百个频率维度),又保留了足够的语音信息,所以成了天然的中间表示。

机制一:声学模型——从文字到频谱

声学模型负责"怎么念":把文本(或音素序列)映射成梅尔频谱。它要解决三个子问题——发什么音、每个音持续多久、语调高低如何。

第一步通常是 G2P(字素到音素):把文字转成音素序列,避免模型去硬背发音规则(尤其多音字、英文不规则拼写)。然后核心挑战是对齐:文本短、频谱长,一个音素对应多少帧不固定。

主流的非自回归方案(FastSpeech 式)显式引入一个时长预测器:先预测每个音素持续几帧,再把音素表示按时长"复制扩展"到目标长度,最后一次性并行生成整张频谱。

1
2
3
4
5
6
7
def acoustic_model(phonemes):
h = encoder(phonemes) # [n_phone, d]
dur = duration_predictor(h) # 每个音素几帧,如 [3, 5, 2, ...]
h = length_regulator(h, dur) # 按时长复制扩展到 [n_frame, d]
h = h + pitch_embed + energy_embed # 注入音高/能量等韵律
mel = decoder(h) # [n_frame, n_mels] 整张频谱
return mel

这种显式时长建模带来一个巨大工程优势:可控。想让语速变慢,把 dur 整体乘 1.2 即可;想调音高,改 pitch 嵌入即可。相比之下,早期自回归声学模型(一帧一帧生成)虽然韵律自然,但慢、且容易出现"重复念某字"或"漏字"的注意力崩溃(attention 跑飞),这是自回归 TTS 的经典踩坑。

训练时时长标签从哪来?常用一个对齐工具(强制对齐或注意力蒸馏)从真实音频里抽出每个音素的帧数作为监督信号。

机制二:声码器——从频谱到波形

梅尔频谱在生成时丢掉了相位信息(只留了幅度能量),而波形需要相位才能重建。声码器(vocoder)的任务就是从这张"残缺"的频谱里恢复出听感自然的波形——这是个欠定问题,必须靠模型学先验。

早期的 WaveNet 是自回归的:逐采样点预测,音质惊人但慢到无法实用(生成 1 秒要算 16000 步)。现在主流是 GAN 类声码器(HiFi-GAN 式):一个生成器把梅尔频谱并行上采样成波形,配一个/多个判别器分辨真假。

GAN 训练的损失是博弈式的,生成器要骗过判别器:

\mathcal{L}_G = \underbrace{\mathbb{E}\big[(D(G(s)) - 1)^2\big]}_{\text{骗过判别器}} + \lambda \cdot \mathcal{L}_{\text{mel}}(G(s), \text{waveform})

后一项是重建项:把生成波形重新算成梅尔频谱,和目标频谱比,约束生成器别乱来。判别器这边的关键设计是多尺度/多周期——既看长时结构,也看短周期细节,因为语音的浊音有强周期性,普通判别器抓不住会导致金属音、电流音。

GAN 声码器的工程价值在于:并行生成,速度可远超实时,且模型相对小,能在边缘设备跑。代价是 GAN 训练不稳定,需要小心调判别器结构和损失权重。

机制三:声音克隆——音色的解耦与迁移

声音克隆要做的是:给一小段目标说话人的音频,让 TTS 用"他的嗓子"念任意文本。核心在于把**“说什么”(内容)和"谁在说"(音色)解耦**。

实现上引入一个说话人编码器(speaker encoder):把参考音频压成一个固定维度的说话人嵌入向量(speaker embedding),它编码音色、口音等身份特征,而不含具体文字内容。这个向量作为额外条件注入声学模型:

1
2
spk_emb = speaker_encoder(reference_audio)   # 例如 256 维音色指纹
mel = acoustic_model(phonemes, cond=spk_emb) # 用目标音色生成频谱

按需要的参考时长分两类:

  • Zero-shot:只给几秒参考音频,靠一个预训练好的、见过海量说话人的编码器直接外推。门槛低,但对没见过的音色(生僻口音、特殊嗓音)相似度会下降。
  • 微调式克隆:用几分钟到几十分钟目标音频微调模型,相似度更高,但成本高、且有过拟合风险(连背景噪声、录音设备特征都学进去)。

关键的解耦难点:说话人嵌入容易"泄漏内容"——如果参考音频和目标文本碰巧有重叠,模型可能把参考里的语气也照搬,导致韵律不自然。训练时要用对比/信息瓶颈等手段,逼编码器只保留音色、丢掉内容。

工程权衡与边界

  • 两段式 vs 端到端:解耦成"声学模型 + 声码器"便于各自迭代、复用声码器,但两段误差会累积(频谱预测的小瑕疵被声码器放大成可闻噪声)。端到端(文本直出波形)可避免累积误差,但训练更难、可控性更差。
  • 延迟:实时语音助手对首包延迟敏感。非自回归声学模型 + 并行 GAN 声码器是低延迟的主流组合;自回归方案音质好但难满足实时。
  • 采样率与算力:24kHz、48kHz 高保真音质更好,但声码器要生成的采样点翻倍,算力线性上涨。

常见误区:以为"克隆需要很长音频"。zero-shot 几秒就能出可用结果,真正决定相似度的是说话人编码器见过的音色分布广度。另一个误区是忽视前端文本规范化——数字、日期、缩写、多音字的处理("2026 年"怎么念、“重庆"的"重”)往往比模型本身更影响最终体验。

小结

现代语音合成的骨架是"声学模型 + 声码器"两段式,以梅尔频谱为枢纽:声学模型用显式时长预测解决文本到频谱的对齐与韵律并实现可控,声码器(多用并行 GAN)从丢失相位的频谱里高速重建波形。声音克隆的本质是用说话人编码器把音色解耦成一个嵌入向量再注入生成,zero-shot 省料而微调更像。落地时绕不开的权衡是音质、速度、可控性三者之间的取舍,以及别被低估的文本前端处理。