04|推理采样:参考长度、Sway 时间网格与 CFG
F5-TTS 推理需要同时确定“要生成多少声学位置”和“在这些位置上如何积分”。前者是时长问题,后者是数值生成问题;增加 ODE 步数无法自动修正一个明显过短的目标时长。
本篇保留原论文的参考文字长度估算思想,并把它与工程中的加权字符、语速参数等扩展区分。原论文 §3.1–3.2 · 推理模型
参考音频提供声音条件,参考转写提供内容对应;二者不一致会干扰续接和对齐。

图 1|参考区、生成区与最终裁切的时间边界
1. 参考时长、生成时长与总序列长度
一种简化估算是按参考音频每个字符平均持续时间预测目标长度:
符号、形状与约定
| 符号 | 解释与例值 |
|---|---|
| 参考 mel 帧数。 | |
| 待生成区域的帧数,取整方式由实现决定。 | |
| 参考与目标文字的计数;必须采用同一字符/加权字符口径。 | |
| 参考与目标拼接后参与生成的总位置数。 | |
| 启发式估计而非精确音素对齐。 |
参考 3 秒、20 个计数字符,目标 30 个字符,粗略估计生成 4.5 秒,总长 7.5 秒。参考中若带 1 秒无意义静音,字符比率会把这段静音也当作语速的一部分;长数字、标点和跨语言文本也会破坏简单比例。
最终输出应裁掉参考区域,仅播放新生成区。裁切用 mel 帧还是波形点,必须换算到正确单位;把帧数直接当采样点会导致参考泄漏或截掉目标。
2. Sway 的非均匀时间网格
Sway 改变推理时的时间节点分布,让有限步数更多用于早期状态。它不增加新的神经网络,也不等于改用不同训练损失。
符号、形状与约定
| 符号 | 解释与例值 |
|---|---|
| 基础均匀网格,范围 [0,1]。 | |
| 实际送入 ODE 的流时间节点。 | |
| Sway 系数;本例 −1,s=0 回到均匀网格。 | |
| 圆周率与余弦;弧度制。 |
| 基础 u | 均匀时间 | s=−1 的时间 | 到下一点的步长 |
|---|---|---|---|
| 0 | 0 | 0 | 0.0761 |
| 0.25 | 0.25 | 0.0761 | 0.2168 |
| 0.5 | 0.5 | 0.2929 | 0.3244 |
| 0.75 | 0.75 | 0.6173 | 0.3827 |
| 1 | 1 | 1 | 结束 |
前半段流时间里安排了更多节点。任意改 s 可能破坏单调性,因此代码至少检查节点严格递增。

图 2|相同步数下均匀网格与 Sway 网格的差异
3. 非均匀网格的 Euler 更新
Euler 更新应乘相邻实际时间之差,而不是固定乘 1/steps:
符号、形状与约定
| 符号 | 解释与例值 |
|---|---|
| 数值积分步索引。 | |
| 当前 mel 状态。 | |
| 相邻实际流时间节点。 | |
| 网络速度预测与固定文本/参考条件。 |
调用关系为 sway_grid → 相邻时间对 → velocity → 状态更新。这里可复用前文的网络接口,速度网络之外不额外生成文字。
def sway_grid(steps, coefficient=-1.):
u=torch.linspace(0.,1.,steps+1)
t=u+coefficient*(torch.cos(math.pi*u/2)-1+u)
if not torch.all(t[1:]>t[:-1]): raise ValueError('non-monotone grid')
return t
def integrate(initial, velocity, times):
state=initial.clone()
for start,end in zip(times[:-1],times[1:]):
state=state+(end-start)*velocity(state,start)
return state
CPU 实验使用初始 (0,2)、恒定速度 (4,−2),在该非均匀网格上最终达到 (4,0)。这是积分步长正确的检查,不是对真实神经速度场误差为零的承诺。
4. CFG 的两种参数记法
F5 论文的表示为有条件速度加上一段与无条件速度的差:
符号、形状与约定
| 符号 | 解释与例值 |
|---|---|
| 同一状态、时间下,有条件与无条件速度。 | |
| 额外引导强度;α=0 就是普通有条件预测。 | |
| 送入积分器的组合速度。 |
若 Vc=2、Vu=0.5、α=1,组合为 3.5。另一种常见写法 Vu+w(Vc−Vu) 与之对应 w=1+α,不能把两个接口的数值直接照抄。每步两条分支通常增加计算,合批计算也不意味着成本完全消失。
比较采样策略时固定参考、文本、种子和目标长度,记录步数及实际网络计算量。
更强 CFG 和更多步数都不保证单调改善;过强引导可能牺牲自然度或稳定性。
完整教学源码与运行记录见 实验附录。
正在连接 GitHub 评论…