wikiAudio08|F5-TTS:流匹配与文本引导的语音补全04|推理采样:参考长度、Sway 时间网格与 CFG
7 分钟
0 次观看

04|推理采样:参考长度、Sway 时间网格与 CFG

F5-TTS 推理需要同时确定“要生成多少声学位置”和“在这些位置上如何积分”。前者是时长问题,后者是数值生成问题;增加 ODE 步数无法自动修正一个明显过短的目标时长。

本篇保留原论文的参考文字长度估算思想,并把它与工程中的加权字符、语速参数等扩展区分。原论文 §3.1–3.2 · 推理模型

参考音频提供声音条件,参考转写提供内容对应;二者不一致会干扰续接和对齐。

图 1|参考区、生成区与最终裁切的时间边界

图 1|参考区、生成区与最终裁切的时间边界

1. 参考时长、生成时长与总序列长度

一种简化估算是按参考音频每个字符平均持续时间预测目标长度:

Tgen≈TrefNgenNref,Ttotal=Tref+Tgen.T_{\rm gen}\approx T_{\rm ref}\frac{N_{\rm gen}}{N_{\rm ref}},\qquad T_{\rm total}=T_{\rm ref}+T_{\rm gen}.
符号、形状与约定
符号解释与例值
TrefT_{\rm ref}参考 mel 帧数。
TgenT_{\rm gen}待生成区域的帧数,取整方式由实现决定。
Nref,NgenN_{\rm ref},N_{\rm gen}参考与目标文字的计数;必须采用同一字符/加权字符口径。
TtotalT_{\rm total}参考与目标拼接后参与生成的总位置数。
≈\approx启发式估计而非精确音素对齐。

参考 3 秒、20 个计数字符,目标 30 个字符,粗略估计生成 4.5 秒,总长 7.5 秒。参考中若带 1 秒无意义静音,字符比率会把这段静音也当作语速的一部分;长数字、标点和跨语言文本也会破坏简单比例。

最终输出应裁掉参考区域,仅播放新生成区。裁切用 mel 帧还是波形点,必须换算到正确单位;把帧数直接当采样点会导致参考泄漏或截掉目标。

2. Sway 的非均匀时间网格

Sway 改变推理时的时间节点分布,让有限步数更多用于早期状态。它不增加新的神经网络,也不等于改用不同训练损失。

t(u)=u+s[cos⁡(πu/2)−1+u].t(u)=u+s[\cos(\pi u/2)-1+u].
符号、形状与约定
符号解释与例值
uu基础均匀网格,范围 [0,1]。
t(u)t(u)实际送入 ODE 的流时间节点。
ssSway 系数;本例 −1,s=0 回到均匀网格。
π,cos⁡\pi,\cos圆周率与余弦;弧度制。
基础 u均匀时间s=−1 的时间到下一点的步长
0000.0761
0.250.250.07610.2168
0.50.50.29290.3244
0.750.750.61730.3827
111结束

前半段流时间里安排了更多节点。任意改 s 可能破坏单调性,因此代码至少检查节点严格递增。

图 2|相同步数下均匀网格与 Sway 网格的差异

图 2|相同步数下均匀网格与 Sway 网格的差异

3. 非均匀网格的 Euler 更新

Euler 更新应乘相邻实际时间之差,而不是固定乘 1/steps:

Xi+1=Xi+(ti+1−ti)Vθ(Xi,ti,C).X_{i+1}=X_i+(t_{i+1}-t_i)V_\theta(X_i,t_i,C).
符号、形状与约定
符号解释与例值
ii数值积分步索引。
XiX_i当前 mel 状态。
ti,ti+1t_i,t_{i+1}相邻实际流时间节点。
Vθ,CV_\theta,C网络速度预测与固定文本/参考条件。

调用关系为 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 论文的表示为有条件速度加上一段与无条件速度的差:

Vguided=Vc+α(Vc−Vu).V_{\rm guided}=V_c+\alpha(V_c-V_u).
符号、形状与约定
符号解释与例值
Vc,VuV_c,V_u同一状态、时间下,有条件与无条件速度。
α\alpha额外引导强度;α=0 就是普通有条件预测。
VguidedV_{\rm guided}送入积分器的组合速度。

若 Vc=2、Vu=0.5、α=1,组合为 3.5。另一种常见写法 Vu+w(Vc−Vu) 与之对应 w=1+α,不能把两个接口的数值直接照抄。每步两条分支通常增加计算,合批计算也不意味着成本完全消失。

比较采样策略时固定参考、文本、种子和目标长度,记录步数及实际网络计算量。

更强 CFG 和更多步数都不保证单调改善;过强引导可能牺牲自然度或稳定性。

完整教学源码与运行记录见 实验附录。

专题导航:TTS 总目录 · 上级章节 · 实验代码与实测记录

正在连接 GitHub 评论…