CFM + CFG
训练时对目标 mel 与 Gaussian noise 做直线插值,回归对应向量场。推理时 conditional / unconditional 两个分支构成 CFG,因此每个 ODE step 需要两次模型前向。
- 模型
- 123M Zipformer
- 采样
- 多步 ODE + CFG
- 代价
- 每步 2 NFE
READING NOTES · EFFICIENT FLOW TTS
它的重点不是发明新的声学表示,而是把文本编码、条件注入、向量场骨干与 CFG 蒸馏组织成一条轻量链路:123M 参数,蒸馏后 4 次函数评估,仍保留零样本音色相似度和可懂度。
phone encoder 先产生逐音素的 192 维状态;系统不预测逐音素 duration,而是按目标梅尔长度做平均复制,得到帧级文本条件。这个条件只有“文本大致铺到时间轴上”的意义,并不等于真实对齐。随后声学 Zipformer 同时看 noisy mel、prompt mel、文本条件与时间步,学习把噪声沿流场搬到目标 mel。
平均上采样解决条件 shape;它没有解决每个音素到底持续多久。细粒度时长和声学实现留给生成骨干隐式完成。
训练时对目标 mel 与 Gaussian noise 做直线插值,回归对应向量场。推理时 conditional / unconditional 两个分支构成 CFG,因此每个 ODE step 需要两次模型前向。
教师先做两次带 CFG 的 Euler 更新,构造跨区间的平均 teacher vector;学生直接拟合该向量,在推理时只走一个分支,把引导效果内化进 4 NFE 轨迹。
ZipVoice-Distill,4 NFE;UTMOS 4.22。它是论文中少步质量的核心工作点。
H20、3 秒 prompt、生成 10 秒语音;F5-TTS 为 0.2958。测试基于同设备和 PyTorch 实现。
明显快于 F5-TTS 的 37.284,但仍大于 1,因此更准确的说法是“接近实时”,不是严格实时。
对比表中的 E2 TTS 为 335M、F5-TTS 为 336M;论文把小模型作为效率主因之一。
去掉平均上采样后,WER 从 1.68 跳到 20.19;说明即使生成器能访问 phone condition,也需要先把条件放到近似帧级坐标。去掉 Zipformer 的 bypass 后,WER 达 98.89;这表明多尺度编码器之间的跨层信息流是训练稳定性与内容恢复的关键,而不只是节省参数的捷径。
这里不能推出“平均分配就是正确 duration”。消融只证明粗对齐比无帧级脚手架好;精确 timing 仍由声学模型学习,也因此没有显式音素级 duration control。
若要把 ZipVoice 的文本编码器接到别的 TTS,最干净的组件边界是 PyTorch 里的 Embedding → 4-layer TTSZipformer → phone states:隐藏维度 192,导出的逐 phone 表示为 100 维。官方 ONNX 文本编码图还包含 duration expansion,输出已是帧级序列,不能把它误认成“原始逐音素 encoder 输出”。
因此复用实验应先固定 phoneme inventory、padding mask 与输出粒度,再比较冻结、微调和随机初始化;不要直接把整张 ONNX 图当作可插拔 phone encoder。