转载本文请注明出处:https://yudonglee.me/f5tts-explained/  |  作者:yudonglee

2024 年 6 月,微软在 arXiv 公开 E2-TTS: Embarrassingly Easy Fully Non-Autoregressive Zero-Shot TTS。论文的题目直白到让人发笑——「令人尴尬的简单」。它真的简单:一个 vanilla Transformer + 一个「音频填空」训练任务,没有 phoneme alignment、没有 duration predictor、没有 grapheme-to-phoneme 字典、没有 codec quantizer。直接吃字符级文本,输出 mel 频谱,端到端、一次推理完成。4 个月后,上海交大 SWivid 团队在此基础上推出 F5-TTS——给 E2 加了 ConvNeXt 文本编码器与 Sway Sampling 推理技巧,训练快 4 倍、推理快 50%、效果反超 VALL-E。F5-TTS 开源后 3 个月 GitHub 拿到 9k star,是 2024–2025 年最热门的英文开源 TTS。

本文是「语音技术深度系列」TTS 主线第 4 篇,紧接 CosyVoice 2 详解。前两篇我讲了「LM AR + Flow Matching 混合」(CosyVoice 2)和「纯 codec LM」(VALL-E)两条路;本文聚焦第三条路:纯 Flow Matching。读完你将能回答:

  1. Flow Matching 在数学上跟 Diffusion 是什么关系?为什么 F5-TTS 能用 16 步就达到 Diffusion 1000 步的效果?
  2. E2-TTS「不需要 phoneme/duration」是怎么做到的?模型怎么知道哪个字应该读多久?
  3. F5-TTS 在 E2 基础上加的 ConvNeXt + Sway Sampling 各自解决了什么问题?
  4. 三种 TTS 路线(VALL-E / CosyVoice 2 / F5-TTS)我该选哪个?

1. 背景:为什么需要”第三条路”

到 2024 年中,TTS 主流路线已经基本定型:

  • VALL-E 路线(纯 codec LM):Encodec + AR/NAR Transformer。优点:zero-shot 克隆能力强;缺点:codec 信息损失大,需要 phoneme 对齐,推理慢。
  • CosyVoice 路线(LM AR + Flow Matching 混合):监督式语义 token + Qwen LM + Flow Matching decoder。优点:内容/音色解耦清晰,支持流式;缺点:架构复杂,三阶段管道工程量大。

这两条路有一个共同的”隐性税”:都需要某种形式的”中间符号”——VALL-E 用 phoneme + codec token,CosyVoice 用 phoneme + 监督式语义 token。这些中间符号意味着额外的工程负担:要维护 G2P (Grapheme-to-Phoneme) 字典处理新词、要训练 codec 模型、要保证 token 与文本对齐质量。对开源社区的小团队来说,这些都是不小的门槛。

E2-TTS 的设计哲学是“全部消去”——既然 Transformer 足够强、训练数据足够多,那能否让模型自己学到所有这些映射?文本直接喂字符、不告诉模型每个字符多长、不告诉它该用什么 phoneme,让 Transformer 在大数据驱动下自己悟。这听起来很激进,但 NLP 已经验证过同样思路(BPE 词表 + LLM 端到端预测,根本不需要词性标注/句法树/外部 KG),那为什么 TTS 不可以?

2024 年 E2-TTS 把这个激进想法落地,结果真的 work——MOS 4.4,与 NaturalSpeech 3、VALL-E 等显式架构持平。F5-TTS 把它做到 SOTA,证明“暴力简洁”反而是 TTS 终极解。这是一次教科书级的”Bitter Lesson” 印证(Rich Sutton, 2019)——人工设计的归纳偏置在足够大的算力和数据面前迟早会被取代。

2. Conditional Flow Matching:Diffusion 的”简化版”

Side-by-side comparison: Diffusion (score matching, noise schedule, 50-1000 inference steps) vs Flow Matching (velocity field, straight-line path, 16-32 inference steps)
图 1:Diffusion 与 Flow Matching 的对比。两者目标相同(从噪声生成数据),但 Flow Matching 学的是直线路径上的速度场而非噪声水平,对应 ODE 求解可以用更少步数(16-32)达到 Diffusion 1000 步的效果——这是 F5-TTS / SD3 / Sora 等2024 年生成式模型共同选择 FM 的根本原因。

Flow Matching (FM) 是 2023 年 Yaron Lipman 等人在 ICLR 提出的生成式建模新框架。它的数学非常优雅:不学”如何 denoise”,而是直接学”从噪声到数据的速度场”

具体来说,FM 把数据分布 pdata 与先验噪声分布 p0(x) = N(0, I) 之间用一条简单的直线路径连接:

x_t = (1 - t) · x_0 + t · x_1,    t ∈ [0, 1]
  其中 x_0 ~ N(0, I)(噪声), x_1 ~ p_data(真实样本)

对应的速度场(这条直线的瞬时方向)是:

v(x_t, t) = x_1 - x_0    (直接是终点减起点,常数!)

训练时,模型学一个神经网络 vθ(x_t, t) 来拟合这个速度场,loss 就是 MSE:

L_FM = E_{t, x_0, x_1} ‖v_θ(x_t, t) - (x_1 - x_0)‖²

推理时,从随机噪声 x0 ~ N(0, I) 出发,用 ODE 求解器(最简单是 Euler 方法)沿速度场积分x1

x_{t+Δt} = x_t + Δt · v_θ(x_t, t)

这套数学相比 Diffusion 的优势是路径完全确定、不引入随机性——Diffusion 的 reverse SDE 需要小步长来稳定数值积分,FM 的直线路径允许大步长。实测 FM 在图像、视频、音频生成上都能用 16–32 步达到 Diffusion 1000 步的质量,这是 Stable Diffusion 3、Sora、F5-TTS 共同选择 Flow Matching 的根本原因。

FM 的「Conditional」版本是给速度场加条件输入——TTS 里条件就是文本与参考音频。CFM 的训练目标变成:

L_CFM = E ‖v_θ(x_t, t, text, ref) - (x_1 - x_0)‖²

整套范式直接落到 TTS 上,就是 E2-TTS 与 F5-TTS。

3. E2-TTS:把 TTS 当”音频填空”做

E2-TTS 的训练任务被设计成音频填空 (audio infilling)。具体做法是:

  1. 训练数据:每个样本是一段 (text, audio) 对,audio 已经预转成 mel 频谱 m
  2. 把 text 用字符级 padding 撑到 mel 同长度——比如文本”hello”有 5 个字符,对应的 mel 有 100 帧,就把每个字符复制成填充符号 padding 到 100 长度,例如 h h h h ... e e e ... ... <pad> <pad>这是 E2-TTS 最关键的”哲学跳跃”:不再用 phoneme/duration,让模型自己学到字符到 mel 帧的对齐;
  3. 随机 mask mel 的某段连续区间(典型 70%),把”被 mask 区间的 mel”作为模型的预测目标;
  4. 训练目标vθ 输入是 (noisy mel, mask, padded text, t),输出是速度场。loss 仅在 masked 区间计算。

这种设计的妙处在于:训练样本是高度灵活的——同一段音频可以 mask 任意位置、任意长度,相当于对每个真实音频生成无数虚拟训练样本。这是大数据时代典型的 self-supervised 训练范式。推理时只需把”参考音频部分”当成”未被 mask”,把”目标合成段”当成”完全 masked”,模型自动 inpaint 出对应内容。

架构上 E2-TTS 是非常 vanilla 的 Transformer + U-Net 风格跳跃连接——24 层、1024 hidden、16 heads。U-Net 跳跃连接让低层局部特征能直接传到高层、缓解长序列预测的细节损失。没有 cross-attention、没有 RNN、没有 codec、没有 alignment,简单到极致。

但 E2-TTS 也有明显问题:训练收敛极慢,作者论文里报告需要 800k 步才能勉强可用,并且对长文本/复杂韵律的处理稳定性差——经常出现合成音频中间漏字、字符对应错位的问题。原因在于「让 Transformer 自己学字符与 mel 帧对齐」这件事其实非常难,字符 padding 后的序列局部结构(同字符连续多帧)需要大量数据才能从随机初始化中学到。这正是 F5-TTS 改进的切入点:用 ConvNeXt 提前消化文本结构,让 DiT 专注于声学生成。

4. F5-TTS:E2 的精致改良

F5-TTS architecture: target text char-padded to mel length + ConvNeXt blocks → Diffusion Transformer (DiT) → mel spectrogram → Vocos vocoder, trained with Conditional Flow Matching, no phoneme / duration / codec needed
图 2:F5-TTS 整体架构。字符级 padding 文本经 ConvNeXt 预处理后,与参考 mel + 噪声 concatenate 喂给 DiT,预测速度场 v_θ。ODE 求解器迭代 16-32 步从噪声还原 mel,Vocos 解码到 24 kHz 波形。没有 AR、没有 codec、没有 phoneme 对齐——这是 E2-TTS / F5-TTS 范式的全部核心。

F5-TTS 在 E2-TTS 基础上做了两个看似小、实际效果显著的改动:

4.1 ConvNeXt 文本编码器

E2-TTS 把字符级 padding 文本直接喂给 DiT,让 DiT 自己学文本表示。F5-TTS 在 DiT 之前先用一个独立的 ConvNeXt 栈处理 padded 文本——4 层 ConvNeXt blocks(受 ConvNeXt CVPR 2022 启发的 1D 卷积块,每块含 depthwise conv + layernorm + GELU + pointwise conv),把字符序列预处理成更结构化的表示,再送进 DiT。

为什么这个改动有效?原因在于字符 padding 后的序列局部结构很强——同一字符的连续重复块往往跨数十帧,相邻字符的边界有明显跳变。ConvNeXt 的局部感受野非常适合捕捉这种”块状”模式,比直接用 DiT 自己学(每个 token 都需要走全局 attention)效率高得多。F5 论文实测:加入 ConvNeXt 后训练收敛速度提升 ~4 倍,WER 降低 ~30%。

4.2 Sway Sampling

Sway Sampling distributes ODE inference steps non-uniformly along the flow time, with more samples near t=0 (noise end) and fewer near t=1 (data end)
图 3:Sway Sampling 让 ODE 步在 [0,1] 上非均匀分布——靠近噪声端 (t=0) 密集采样、靠近数据端 (t=1) 稀疏采样。原理是早期步处理高噪样本需要精细分辨率、晚期步只是 refine 已经较干净的信号。F5-TTS 实测:16 步配 Sway 比 16 步均匀采样SECS 提升 0.05、WER 降 15%。此 trick 与训练无关,可直接套到任何 FM 模型。

Sway Sampling 是 F5-TTS 在推理阶段(不是训练)的创新。它注意到一个事实:Flow Matching 的 ODE 求解步并不需要均匀分布在 [0, 1] 之间。早期步骤(t 接近 0)处理的是高度噪声化的样本,路径方向变化大,需要小步长精细控制;晚期步骤(t 接近 1)处理的是已经较干净的样本,路径方向稳定,可以大步长跳过。

具体实现是一个简单的 reparameterization:把均匀分布的 t_i 通过一个 sigmoid-like 函数 swap 成偏向 0 的非均匀分布

def sway_sampling_t(num_steps: int, coef: float = -1.0):
    """生成 Sway Sampling 时间步序列。
    coef < 0  → 偏向 t=0 (噪声端) 更多采样
    coef = 0  → 均匀采样
    coef > 0  → 偏向 t=1 更多采样(实测效果差)
    """
    import torch
    t = torch.linspace(0, 1, num_steps + 1)
    # F5-TTS 默认 coef=-1.0,相当于 t' = t + coef * (cos(pi*t/2) - 1 + t)
    t_sway = t + coef * (torch.cos(torch.pi * t / 2) - 1 + t)
    return t_sway

F5 论文实测:在 16 步推理下,Sway Sampling 比均匀采样 SECS(说话人相似度)提升 0.05、WER 降低 ~15%。更妙的是这个 trick 与训练完全无关——任何 flow-matching-based 模型(包括 NaturalSpeech 3、E2-TTS 自身)都可以直接套用,无需重训。这种”训练时常规、推理时聪明“的优化范式在 2024-2025 年生成式模型领域非常流行(cf. Stable Diffusion 的 DPMSolver++、Sora 的 rectified flow)。

5. 推理流程:5 行代码完成 zero-shot 克隆

F5-TTS 在 HuggingFace 开源完整权重与 pipeline。基本用法极简:

# pip install f5-tts
from f5_tts.api import F5TTS
import soundfile as sf

# 1) 加载模型(首次会从 HuggingFace 下载约 1.4 GB 权重)
tts = F5TTS(model_type="F5-TTS")     # 也可以用 "E2-TTS"

# 2) 准备参考音频 + 对应文本
ref_audio = "alice_5sec.wav"          # 任意人 3-10 秒清晰语音
ref_text  = "It's a beautiful day to start something new today."
gen_text  = "Hello, this is a zero-shot voice clone using F5-TTS. " \
            "Notice the natural rhythm and intonation."

# 3) 一次推理 = 一段合成音频
wav, sr, _ = tts.infer(
    ref_file=ref_audio,
    ref_text=ref_text,
    gen_text=gen_text,
    nfe_step=16,        # ODE 步数,16 是 F5 默认 (E2-TTS 默认 32)
    cfg_strength=2.0,   # classifier-free guidance, 控制音色强度 (1=弱 / 3=强)
    sway_sampling_coef=-1.0,  # Sway sampling 系数,-1 是默认
    speed=1.0,          # 语速控制
)

# 4) 保存
sf.write("alice_clone.wav", wav, sr)
print(f"generated {len(wav)/sr:.2f}s audio from {ref_audio}")

整个流程 16 步 ODE 求解,RTX 4090 上推理 10 秒音频约 1-2 秒。无需 phoneme 字典、无需对齐工具、无需 fine-tune——拿来就用。这种简洁性是 F5-TTS 能在开源社区疯传的关键。

F5-TTS API 还有一个隐藏技巧:“speed” 参数可以直接控制语速,且不依赖韵律重训。原理是在 ODE 求解前先把 reference mel 与 noise mel 的长度按 speed 缩放——比如 speed=1.5 就让生成 mel 比”naturally implied” 短 50%。这种”直接操作 latent 时间维”的能力是 Flow Matching 路线独有的另一个免费红利,VALL-E/CosyVoice 都做不到(前者 AR 解码长度由 EOS 决定、后者由语义 token 决定,都不能直接外部干预)。

6. 性能对比表

模型 训练数据 参数量 WER (LibriSpeech-PC test-clean) ↓ Speaker Sim ↑ 推理步数 RTX 4090 RTF
YourTTS (2022) ~600 h 87 M 7.7 0.34 0.05
VALL-E (2023) 60k h ~300 M 5.9 0.58 AR 8T + NAR 7 ~0.5
NaturalSpeech 3 (2024) 60k h 500 M 5.6 0.63 30 (diffusion) ~0.4
VALL-E 2 (2024) 60k h ~300 M 1.5* 0.66 AR + NAR ~0.4
E2-TTS (2024-06) 100k h ~330 M 2.95 0.69 32 (FM) ~0.15
F5-TTS (2024-10) 100k h ~330 M 2.42 0.66 16 (FM + Sway) ~0.08
CosyVoice 2 (2024-12) 170k h ~600 M 2.4 0.65 AR + 15 (FM) ~0.07 (流式)
ElevenLabs Multilingual v2 未公开 未公开 ~2.0 ~0.70 ~0.15

这张表很清楚说明 F5-TTS 在 2024 年的位置:WER 与 VALL-E 2 接近(少一个数量级训练),Speaker Sim 与 NaturalSpeech 3 持平,但推理速度远快于所有 AR 路线。它的核心优势是「SOTA 质量 + 简洁架构 + 极快推理」三件全包。劣势是非流式——一次推理才能出全部音频。这是它与 CosyVoice 2 最大的工程差距。

7. 三种 TTS 路线的终极对比

维度 VALL-E 路线 CosyVoice 2 路线 F5-TTS 路线
核心范式 Codec LM (AR+NAR) LM AR + Flow Matching 混合 纯 Flow Matching + DiT
需要 phoneme 字典 是(可选)
需要 duration predictor 否(隐含在 AR 中) 否(字符 padding)
需要 codec 模型 是 (Encodec) 是(自研监督 token) 否(直生 mel)
架构复杂度 中(两 Transformer) 高(三阶段) 低(单 DiT)
训练复杂度 低(单阶段端到端)
推理速度 慢 (AR + NAR) 快 (流式) 极快 (16 步)
流式支持 原生 150ms 否(非流式架构)
中文表现 SOTA 中(需 fine-tune)
英文表现 SOTA
开发上手难度 极低

2026 年实操建议

  • 英文 zero-shot demo / 配音 / 短文本朗读 → F5-TTS,简洁、速度、质量三平衡。
  • 中文 voice agent / 客服 / 流式对话 → CosyVoice 2,原生流式 + 中文 SOTA。
  • 多语种统一服务 → CosyVoice 2,覆盖中英日韩。
  • 学术研究 codec LM 范式 → 看 VALL-E 论文,但生产部署千万别用。
  • 企业 SaaS / 极致稳定性 → ElevenLabs API(黑盒但稳)。

8. 工程化的几个深水坑

  1. F5-TTS 不支持流式。架构限制——CFM 必须从噪声出发一次性 ODE 求解全部 mel 帧,无法增量输出。如果业务需要流式,要么改用 CosyVoice 2,要么自己改造架构(已经有研究尝试 Streaming F5-TTS,但还在实验阶段)。
  2. nfe_step 与质量的权衡。默认 16 步质量与 32 步差距很小,但降到 8 步会明显塌缩(mel 出现 artifact)。生产环境建议保持 16 步、用 Sway Sampling 默认 coef=-1。
  3. CFG strength 调优。默认 2.0 适合大多数场景。提到 3.0 音色相似度更强但说话节奏可能僵硬;降到 1.0 节奏自然但音色相似度下降。这是个针对每个参考音色都要单独调的超参
  4. 中文 fine-tune 的坑。F5-TTS 官方权重主要训于英文。中文用户常报告 vocab 不覆盖中文字符的问题。社区已有 F5-TTS-Chinese 等 fine-tune 版本,但效果还不如 CosyVoice 2 原生中文。
  5. vocos vocoder 部署。F5-TTS 默认用 Vocos(基于 ConvNeXt 的 mel→waveform vocoder),比 HiFi-GAN 更快、量化友好。生产部署直接用 ONNX 导出即可。
  6. 显存占用。F5-TTS 完整 pipeline 加载约 1.5 GB GPU 显存,比 VALL-E (3 GB) 和 CosyVoice 2 (3 GB) 都低。在 T4 / A10 这种入门 GPU 上能跑多路并发,性价比很高。

9. 总结:Bitter Lesson 在 TTS 的胜利

F5-TTS 的成功是 Rich Sutton 2019 年「The Bitter Lesson」的又一次教科书印证——当算力和数据足够多时,通用方法终将打败精心设计的归纳偏置。VALL-E 引入 codec 解决离散化问题、CosyVoice 引入监督 token 解决对齐问题、NaturalSpeech 3 引入 FACodec 解耦四种属性——这些都是”聪明的归纳偏置”。F5-TTS 反其道而行之:所有归纳偏置都不要,让模型在 10 万小时数据驱动下自己悟出文本→mel 的映射。结果不仅 work,还更快、更简洁、效果更好。

这条路线的下一站很可能是把 F5-TTS 扩到 1B+ 参数 + 1M+ 小时数据——届时它在 zero-shot 上的能力可能彻底超越所有竞品。2025 年 CosyVoice 3 已经在做类似的 scaling,F5-TTS 团队和 Microsoft NaturalSpeech 团队也在同步推进。「纯 Flow Matching + DiT」很可能成为 2026-2028 年 TTS 的统治范式,就像 Transformer 在 2017 年统治 NLP 一样。

把这篇放到我之前的 TTS 演进史VALL-ECosyVoice 2 系列里看,你应该已经能完整理解 2023-2026 年现代 TTS 的整张地图——VALL-E 开创 codec LM、CosyVoice 走混合架构、F5-TTS 走纯 Flow Matching,三条路并存且各有最佳应用场景。没有”哪一条注定胜出”,只有”哪一条更适合你的业务”。下一篇 TTS 系列文章我打算写 《Neural Audio Codec 详解:Encodec / SoundStream / DAC / Mimi》——把现代 TTS 与 ASR 共同的”分词器底座”彻底拆透,把这一段语音技术深度系列收个尾。

参考资料

  1. Chen, Y. et al. F5-TTS: A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching. arXiv:2410.06885, 2024.
  2. Eskimez, S. et al. E2 TTS: Embarrassingly Easy Fully Non-Autoregressive Zero-Shot TTS. arXiv:2406.18009, 2024.
  3. Lipman, Y. et al. Flow Matching for Generative Modeling. arXiv:2210.02747, ICLR 2023.
  4. Peebles, W. & Xie, S. Scalable Diffusion Models with Transformers (DiT). ICCV 2023.
  5. Liu, Z. et al. A ConvNet for the 2020s (ConvNeXt). CVPR 2022.
  6. Ho, J. & Salimans, T. Classifier-Free Diffusion Guidance. NeurIPS 2021 workshop.
  7. Siuzdak, H. Vocos: Closing the gap between time-domain and Fourier-based neural vocoders. ICLR 2024.
  8. Ju, Z. et al. NaturalSpeech 3: Zero-Shot Speech Synthesis with Factorized Codec and Diffusion Models. arXiv:2403.03100, 2024.
  9. F5-TTS 官方仓库:github.com/SWivid/F5-TTS
  10. F5-TTS demo 页:swivid.github.io/F5-TTS

Loading