FastSpeech 系列论文解读:不一个字一个字念了,一口气吐出整段频谱(快 270 倍)
论文:FastSpeech: Fast, Robust and Controllable Text to Speech(arXiv<1905>1905>.09263,2019.05) FastSpeech 2: Fast and High-Quality End-to-End Text to Speech(arXiv<2006>2006>.04558,2020.06) 作者/机构:微软亚洲研究院(Yi Ren、Xu Tan、Tao Qin、Tie-Yan Liu 等)
Tacotron 2 把 TTS 音质推到了接近真人,但它的解码器是自回归的——一个词一个字地蹦,遇到长句容易丢字、重复,而且推理慢。2019 年微软的 FastSpeech 干了件在当时有点”反直觉”的事:解码不再一个帧一个帧地看前面,而是整段频谱一次前向全部生成。它把 mel 谱生成提速 ~270×(端到端含声码器约 38×),顺带把”跳词、重复”这类自回归通病基本消灭。代价是先得训练一个 teacher 模型来提供时长对齐。一年后 FastSpeech 2 把老师踢开,直接训练、训练快 3×、音质反超。这一系列把”非自回归并行合成”定成了 TTS 的新范式,从此”快”和”稳”成为默认要求。
一、动机:自回归 TTS 的三大病
FastSpeech 的摘要写得很直白,自回归端到端 TTS 有三大毛病:
- 慢:逐帧生成,mel 谱必须一帧依赖一帧;
- 不稳:长句里会跳词、重复词(Tacotron 2 也逃不掉);
- 不可控:想调语速、韵律?模型没给你这个把手。
解法方向也很清晰:非自回归(non-autoregressive)——所有输出帧并行预测。但并行化有一个绕不开的坎:文本的长度和频谱的长度不一样(“今天天气不错”7 个字,频谱可能有 700 帧),你必须知道”每个字该说多久”,才能把文本”摊开”到频谱的长度上。这就是整个 FastSpeech 系列的核心工程。
二、FastSpeech(2019.05):并行合成,但需要一个”老师”
1. 三个模块
FastSpeech 基于 Transformer,去掉自回归解码,改成三段式:
- Feed-Forward Transformer(FFT,前馈 Transformer):编码器和解码器都用 FFT 块,去掉了 decoder 的逐帧自回归;
- Length Regulator(时长调节器):核心部件。它拿着每个音素的时长,把音素序列”复制扩充”成和目标频谱等长的序列——这就是并行化的关键:只要有每个音素的时长,文本就能一次展开成全谱;
- Duration Predictor(时长预测器):推理时预测每个音素的时长,喂给 Length Regulator。
2. “270× 加速”到底指什么
论文的 ~270× 特指 mel 谱生成部分相对自回归 Transformer TTS 的加速;把 WaveNet 声码器一起算进去,端到端约 38×。这两个数字经常被混用,读论文要分清口径。代价也如实标出:时长对齐需要从**教师模型(teacher model)**的注意力中提取——也就是先训练一个自回归模型(比如 Transformer TTS),把它的对齐信息蒸馏出来。这是 FastSpeech 1 最大的工程负担。
3. 副产品:鲁棒性和可控性
- 并行、无累积误差,跳词/重复基本消失;
- 因为显式建模了时长,语速可以平滑调节——调时长预测器输出即可,这是自回归模型做不到的。
LJSpeech 上音质与自回归模型相当(MOS 相当,论文表述为 matches autoregressive models),但速度天差地别。第一代非自回归 TTS 就这么立住了。
三、FastSpeech 2(2020.06):把老师踢开,还顺手加了”表情”
FastSpeech 1 有个隐患:teacher-student 蒸馏管线又复杂又耗时,而且老师蒸馏出来的”简化版频谱”丢了信息,音质上不去。FastSpeech 2 对症下药:
1. 免蒸馏:直接用真实目标训练
不再用老师蒸馏的输出,而是直接用 ground-truth(真实标注)频谱做训练目标——蒸馏只是权宜之计,真正的问题是 TTS 里著名的一对多映射(one-to-many mapping):同一句话可以说成无数种样子,模型不知道该学哪种。FastSpeech 1 用蒸馏”作弊”简化了分布,FastSpeech 2 换了个更诚实的做法——
2. 显式建模三种变化信息
把说话时的”变化源”直接变成条件输入:
- duration(时长):每个音素实际说多长;
- pitch(音高):语调起伏,比如 F0(基频)轨迹;
- energy(能量):响度变化。
训练时从波形里提取这些真值喂进去,推理时用对应的预测器输出。模型不再需要猜”这句话该怎么说”,只需要把”给定的时长/音高/能量”渲染成语音——一对多映射被摊平了。
3. 成绩与遗留
- 训练比 FastSpeech 快 3×(免去蒸馏步骤);
- 音质超过 FastSpeech 1,论文称 甚至能超过自回归模型;
- 附带提出 FastSpeech 2s:第一个文本直接到波形的并行模型(音质略逊,但验证了”完全端到端并行”可行)。
FastSpeech 2 也确立了非自回归的”标准配置”——并行骨架 + 显式时长 + 音高/能量条件,后来大量系统(包括 VITS 的时长预测器、ESPnet 等开源实现)都沿用了这套设计。
收尾:我的一点看法
FastSpeech 系列给我的最大启示是:“快”和”稳”不是免费的,它们靠”显式化”买单。自回归模型把时序的复杂性藏进循环里,非自回归则必须显式问自己:“每个字该说多久?“——于是时长建模成了新问题,而这个问题恰好带来了副产品:语速可控。很多时候,把一个隐式问题变成显式问题,就会顺手得到可解释、可控制的能力。
对 FastSpeech 1,我的评价是”工程决策很聪明但架构有隐患”:用蒸馏绕开一对多映射,短期有效,长期是死路——信息在蒸馏里丢了,音质上不去。FastSpeech 2 抓住这个病根,用”条件输入”正面解决,这一步非常关键,直接让非自回归从”能并行的玩具”变成”能上线的系统”。
批评点也有。一是 FastSpeech 2 的时长/音高/能量预测器是额外负担,预测不准会影响韵律自然度(后来的工作要么用更好的时长模型,要么干脆换 diffusion 路线);二是它依然依赖 mel 谱 + 声码器的两段式,不是真正端到端;三是论文音质评测用的是”与自回归相当/超过”,但没有达到 Tacotron 2 那种逼平真人的水平——非自回归在自然度上的短板,要到 VITS、NaturalSpeech 时代才真正补齐。可以说,FastSpeech 解决了”速度与稳定性”,把”自然度天花板”的问题留给了后人。
附:核心数据速查
基本盘
| 项目 | 数值 |
|---|---|
| FastSpeech | 首个非自回归并行 TTS,Feed-Forward Transformer + Length Regulator |
| FastSpeech 加速 | mel 谱生成 ~270×;端到端约 38×(含声码器) |
| FastSpeech 2 | 免蒸馏直接训练,显式建模 duration/pitch/energy |
| FastSpeech 2 训练加速 | 训练快 3×(相对 FastSpeech 1) |
| 机构 | 微软亚洲研究院 |
核心创新
| 创新 | 要点 |
|---|---|
| Length Regulator | 按时长把音素序列扩到频谱长度,实现并行生成 |
| Duration Predictor | 推理时预测每个音素时长(语速可控) |
| 教师蒸馏对齐 | FastSpeech 1 从自回归教师提取时长对齐 |
| 显式变化建模 | FastSpeech 2 用 ground-truth 的时长/音高/能量做条件,摊平一对多映射 |
| FastSpeech 2s | 第一个文本直接到波形的并行模型 |
关键成绩
- mel 谱生成 ~270× 加速、端到端 ~38×(口径不同,勿混用)
- 跳词/重复基本消除,语速可平滑调节
- FastSpeech 2:训练快 3×、音质超过 FastSpeech 1、可超过自回归模型
关键概念清单
- non-autoregressive = 非自回归(输出并行生成)
- mel-spectrogram = 梅尔频谱
- Length Regulator = 时长调节器(对齐文本与频谱长度)
- teacher-student distillation = 师生蒸馏
- one-to-many mapping = 一对多映射(同一文本多种合理读音)
- ground-truth = 真实标注/真值
- duration / pitch / energy = 时长 / 音高(F0 基频)/ 能量(响度)
- F0 = fundamental frequency,基频
- FFT = Feed-Forward Transformer,前馈 Transformer(此处非傅里叶变换)
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时





