跳转至

M19 · DTW 对齐目标 + 双 adapter + 残差塔

状态 ✅ 完成(2026-08-30,续训至 100k)——CER@α=0 治愈、CER 0.109 项目最低(90k)、α=2 外推修复、delta 爬至 0.835;MOS 于 ~1.9 见顶
一句话 在 M18-λ1.0 基础上三处改动:① 中立目标换 DTW 对齐版(mock 已验收)② adapter × 2 ③ 残差参数化——DiT_B 预测中立速度、DiT_Δ 直接预测「情感−中立」残差,情感 = 两塔之和
上游 ← M19 Mock:DTW-WSOLA 把错位中位 23–284ms 压到 0–20ms(≤1 帧),用户听感通过 · M18 遗留 α=0 乱说与 cos(A,GT) 封顶 0.89
对照 M18-λ1.0(三处全不改的基线)

TL;DR

α=0 乱说病治愈;内容跟随全面登顶;但情感强度与音质双双不及 M18-λ1.0。

  • ✅ CER@α=0:1.24 → 0.19(目标 <0.3)——DTW 对齐 + 双 adapter 两刀合并生效; CER 中段谷同时消失(α 0.25/0.5/0.75 = 0.07/0.04/0.05,M18 同位 0.94/0.20/0.07),CER 总 0.410→0.207 项目最低
  • ⚠️ delta 0.628(M18 0.911):A_share 终点仅 0.027(GT 参照 0.078,残差约长到三成半), 且 30k→40k 平台(0.648→0.628);α=5 外推恶化(CER 0.21→0.94)同根——残差未成熟时 ×5 出界
  • ⚠️ MOS 1.70(M18 1.98)、MOS@α=1 2.10 vs 2.81——α=1 的目标 x1_emo 并未过 WSOLA, 故不全是引擎税:和式 v=v_B+v_Δ 让 v_B 的 WSOLA 糙感直通情感端是主嫌疑
  • MOS 轨迹 1.34→1.47→1.60→1.70 仍在爬未收敛,可续;三处改动捆绑,单变量归因待 §5.1
  • 🔁 续训 +30k(→70k,用户决定,纯续训无配置改动):MOS 1.70→1.93(追平 M18 的 98%)、 MOS@α=1 2.10→2.55、delta 0.628→0.707——"40k 未收敛"确认;α=3 外推仍崩(MOS 1.26)—— 外推短板是结构性的,不随训练量消失

1 架构

情感音频 wav ─→ frozen whisper-large-v3 encoder(同 M17/M18)
                    ├─ adapter_B(可训 2.2M)→ μ_B ─→ DiT_B → v_B    ←u_n 监督(中立速度)
                    └─ adapter_Δ(可训 2.2M)→ μ_Δ ─→ DiT_Δ → v_Δ   ←仅经和式损失隐式塑形(残差)
xvector → spk 线性层(基座权重)→ 两塔共用
DiT_B 全量基座初始化;DiT_Δ 基座主体 + proj_out 置零;cond ≡ 0;同一画布/噪声/t
与 M18-λ1.0 的差异 M18 M19
中立目标 x1_neu 均匀 R3 DTW-WSOLA 对齐版(250ms 锚、速率夹 [0.4,2.5])
adapter 1 个共享 2 个独立(结构相同)
塔的分工 v_A←u_e、v_B←u_n,A=相减 v_B←u_n;情感=v_B+v_Δ(和式监督),v_Δ 隐式为残差

2 数据重建(仅 x1_neu 一个字段)

1. DTW 路径:情感 mel ↔ 自然中立 mel(librosa,M10 路径代码复用)
2. 锚点化:每 250ms 一锚 + 端点固定 + 单调 + 局部速率夹 [0.4, 2.5]
3. pytsmod WSOLA 锚点变速:中立【波形】变速率拉伸到情感时间轴(保音高)
4. 重提 mel → 新 x1_neu,断言 K == 2N

Mock 验收(m19-mock,12 配对):残余错位中位 0–20ms(≤1 mel 帧)、 p90 20–130ms;用户听感"与均匀版差不多"(节奏泄漏与引擎代价可接受)。 whisper 特征、xvec 均不变;输出 data/m19_cache/(仅覆盖 x1_neu 字段)。

3 训练

1. μ_B = adapter_B(feat);μ_Δ = adapter_Δ(feat);spks 同 M18
2. t ~ U[0.05,0.95]、α ~ U[0,1];x_α = (1−α)x1_neu + αx1_emo;y = (1−(1−σ)t)z + t·x_α
3. v_B = DiT_B(y, μ_B, t, spks);v_Δ = DiT_Δ(y, μ_Δ, t, spks)
4. 损失(生成段即全长;残差直接监督项经用户决定移除):
   L = ‖v_B − u_n‖²                      (中立重建)
     + ‖(v_B + v_Δ) − u_e‖²             (和式:情感由两塔合成 —— v_Δ 隐式学「补足 B 到情感」)
     + 1.0 · L_ortho(v_Δ, v_B)          (λ=1.0,沿用 M18 消融结论)
   诊断量 ‖v_Δ − (u_e−u_n)‖² 仅记日志不进梯度(观察残差是否自发对准 mel 差)
5. AdamW 联合更新两塔 + 两 adapter,grad_clip=1.0
参数 值
初始化 DiT_B:基座 flow.pt 全量;DiT_Δ:基座主体 + proj_out 置零(init 时 v_Δ≡0、v(α)≡v_B——保留语音分析先验、消除"全量→残差"语义错位);spk 层基座权重;两 adapter 随机
步数 / 并行 40,000 / DDP 8×1(全局 batch 8)
lr / seed / clip 1e-5 / 1234 / 1.0
ckpt / 中途评测 每 10k;10k/20k/30k(同协议)
日志 L_B、L_sum、L_ortho、L_Δ(仅诊断)、grad_norm、A_share(=‖v_Δ‖²/‖v_B+v_Δ‖²)、cos(v_Δ,v_B)
输出 outputs/m19/

4 推理与评测

v(α) = v_B + α · v_Δ        ← α 直接缩放残差塔输出,无相减
α ∈ {0, 0.25, 0.5, 0.75, 1, 1.5, 5};其余同 M18(P6 12 组、eval_suite 口径)
主判据 目标
CER@α=0(乱说) 1.24 → <0.3(DTW + 双 adapter 两刀的合并效果)
cos(v_Δ, GT 残差) 0.89 →(残差成为一等输出后是否上升)
delta / MOS / 中段谷 不劣于 M18-λ1.0(0.911 / 1.98 / α=0.5 谷 1.37)

探针:teacher-forced cos(v_Δ, x1_emo−x1_neu)(不再需要相减)。

5 已知不确定点

  1. 三处改动捆绑——若大幅改善/恶化,归因需后续单变量消融(DTW-only、双adapter-only 各 4h)
  2. WSOLA 目标的引擎质感略糙于 R3(冒烟 CER 0.026 vs 0.005)——若 α=0 的 MOS 受限,换分段 R3 实现
  3. v_Δ 只受和式梯度:早期 v_B 未收敛时它追的是移动目标 u_e−v_B,收敛后才落到真残差——L_Δ 诊断曲线负责观察这一过程
  4. 节奏泄漏已知并接受:DTW 使中立目标带上情感的句内节奏(用户听感判定可接受),α=0 的"中立"限谱形层——scope 声明进文档
  5. ~~残差塔基座初始化的语义错位~~ → 已由「基座主体 + 零头」解决(init 时 v_Δ≡0)

6 资源

缓存重建(仅 x1_neu,8 进程)约 40 分钟;训练 DDP 8×1 约 4 小时;评测 + 探针约 1 小时。

7 结果

🎧 M19 音频对照(与 M18-λ1.0 同名对拍 12 组 × 7 α + 输入原音频)

7.1 终点主表(P6 12 组 × 7 α,40k)

臂 delta CER 总 CER@α=0 MOS MOS@α=0 MOS@α=1 CER@α=5
M18 λ=1.0 0.911 0.410 1.24 1.98 2.77 2.81 0.21
M19 0.628 0.207 0.19 1.70 1.79 2.10 0.94

按 α 分层(M19):MOS 0:1.79 0.25:1.52 0.5:1.51 0.75:1.77 1:2.10 1.5:1.95 5:1.27; CER 0:0.19 0.25:0.07 0.5:0.04 0.75:0.05 1:0.06 1.5:0.10 5:0.94。

7.2 轨迹(10k/20k/30k/40k,vs M18-λ1.0 同协议)

step delta CER 总 CER@α=0 MOS MOS@α=1
10k 0.366 0.422 0.41 1.34 1.35
20k 0.619 0.278 0.23 1.47 1.67
30k 0.648 0.262 0.29 1.60 1.95
40k 0.628 0.207 0.19 1.70 2.10

M19 轨迹 M19 训练曲线

训练侧读数:L_sum 首尾 1.35→0.85;L_Δ 诊断 2.20→1.30——残差无直接监督下自发向 真 mel 差靠拢(和式梯度生效);A_share 0.002→0.027(GT 参照 0.078,见 §7.5)——残差 40k 长到约三成半, 与 delta 平台(30k 0.648→40k 0.628)互为表里。

7.3 探针 cos(v_Δ, x1_emo−x1_neu)(held-out 300,t=0.1/0.5/0.9 中位)

M18 λ=1.0(A=v_A−v_B) M19 40k(v_Δ 直接输出) M19c 70k M19d 100k
cos 0.74 / 0.88 / 0.89 0.63 / 0.74 / 0.75 0.68 / 0.79 / 0.80 0.69 / 0.81 / 0.83
‖·‖/‖GT‖ 0.73 / 0.89 / 0.92 0.59 / 0.64 / 0.67 0.66 / 0.73 / 0.73 0.66 / 0.75 / 0.76

读法:残差成为一等输出后 cos 不升反降(0.89→0.75)、幅度只到 GT 的 ~0.6—— 与 A_share 欠长互证:和式隐式塑形在 40k 内既没让残差长满、方向对齐也弱于相减式。 提示残差塔要么需要更长训练/更大 lr,要么需要恢复被移除的直接监督项(低权重)。

7.4 续训至 70k(M19c,用户决定:纯续训 +30k、α 最高档 5→3)

40k ckpt 起续(优化器重启、数据序 seed 2345,其余配置不变),10k/20k 中评 + 30k 终评:

全局步 delta CER 总 CER@α=0 MOS MOS@α=1 外推 CER
40k(M19 终点) 0.628 0.207 0.19 1.70 2.10 α5: 0.94
50k 0.681 0.199 0.30 1.71 2.03 α3: 0.68
60k 0.568 0.196 0.26 1.79 2.38 α3: 0.61
70k 0.707 0.202 0.34 1.93 2.55 α3: 0.63
80k(M19d,α 档 3→2) 0.799 0.157 0.38 1.90 2.46 α2: 0.21
90k 0.835 0.109 0.31 1.92 2.46 α2: 0.08
100k 0.783 0.125 0.33 1.82 2.23 α2: 0.11

🎧 90k★(推荐 ckpt)与 100k 均已上音频页四臂对拍。

🔬 天花板与电音归因见 M19 探针页:MOS@α=1 天花板 2.61(本模型 2.55 = 98%)、 delta 天花板 0.885(本模型 0.835 = 94%)、α=0 天花板被 WSOLA 砍到 2.81——残余电音的主犯是变速引擎而非模型。

M19 全程训练曲线

(上图为 0–100k 拼接,40k/70k 竖虚线 = 优化器重启点;A_share 面板含订正后的 GT 参照,见 §7.5)

7.5 GT 残差能量参照的订正

此前沿用的 A_share 参照 0.095 是 M18 时代(均匀 R3 数据)的估计值,两处不准:

数据 用于 GT A_share 中位(含 z,与训练同定义) ‖x_e−x_n‖ 中位
m13_cache(均匀 R3) M18 0.115 264.6
m19_cache(DTW 对齐) M19 线 0.078 222.9

n=400 条,u_e−u_n = x1_emo−x1_neu、u_e = x1_emo−(1−σ)z(σ=1e-6)。

  • 均匀 R3 的真值是 0.115 而非 0.095——旧估计偏低
  • DTW 对齐使 GT 残差缩小 32%(0.115→0.078):时间轴对齐后,两条 mel 的差不再包含节奏错位那一部分, 这是对齐操作的直接后果,也意味着 M19 的残差塔本来就该学一个更小的量
  • 据此重读:A_share 末段 0.037 ÷ 0.078 = 约 48%(而非旧口径的"三成"); 探针幅度比 ‖v_Δ‖/‖GT‖ = 0.76(t=0.9)与之一致(0.76² ≈ 0.58,α/t 分布差异内)
  • 结论方向不变(残差仍欠长),但欠长程度比此前叙述轻:已过半程,缺的是最后一半而非七成

按 α 分层(70k):MOS 0:1.92 0.25:1.65 0.5:1.64 0.75:2.12 1:2.55 1.5:2.39 3:1.26; CER 0:0.34 0.25:0.14 0.5:0.08 0.75:0.07 1:0.07 1.5:0.09 3:0.63。

  • MOS 于 ~1.9 见顶(70k–100k 四点 1.93/1.90/1.92/1.82):音质端续训油水到 70k 基本吃完; 50k 停滞系优化器重启适应期;100k 终点 MOS@α=1 回落至 2.23(80–90k 为 2.46)—— 情感端在 delta 上爬的同时自然度略有交换
  • delta 后程发力:70k 后 0.707→0.799→0.835(90k,达 M18 0.911 的 92%)—— 残差塔并非死平台,只是生长极慢;100k 0.783 回落在波动带内
  • α=2 外推修复(用户降档正确):CER 0.63(α3)→ 0.08(α2@90k)—— 可用外推范围就是 [0, 2],再往上是残差幅度欠长下的线性放大出界
  • CER 总 0.109(90k,项目历史最低);CER@α=0 波动带 0.19–0.38,主判据不回吐
  • 90k 为综合最优 ckpt(delta 0.835 / CER 0.109 / MOS 1.92):outputs/m19d/ckpts/step20000.pt

8 结论

项 结论
α=0 乱说(主判据) ✅ 治愈:CER@α=0 1.24→0.19,且 10k 起即 0.41——"均匀目标逐帧错位"假设被 DTW 对齐+双 adapter 证实(捆绑归因,单变量消融待做)
内容跟随 ✅ 项目最佳:CER 总 0.207,α∈[0.25,1.5] 全部 ≤0.10,CER 中段谷消失
情感强度 🔼 delta 90k 达 0.835(M18 的 92%)——纯续训在 70k 后兑现了情感强度;按订正后的 GT 参照(0.078,§7.5),A_share 已达 48%、探针幅度比 0.76——残差欠长但已过半程,比旧叙述乐观。要快就加回低权重直接监督,要稳就接受慢生长
音质 ✅ MOS 见顶 ~1.9(M18 1.98 的 97%,70k–100k 四点平)——训练量的油水已榨干;中段谷(α 0.25–0.5 ≈1.55)与 M18 α=0.5 位持平或反超,但整体天花板略低于 M18,残差 = WSOLA 目标引擎税的最终嫌疑(换分段 R3 目标可归因)
α 外推 ✅(降档后)α=2 内可用:CER 0.08(90k)——外推边界即残差幅度边界;α≥3 仍出界,除非残差长满否则不推
收敛 100k 定论:MOS ~1.9 见顶、delta 0.84 波动带、堆步数边际归零——M19 线的训练量故事结束。推荐 ckpt = 90k(step20000.pt of m19d)。下一刀二选一:① 低权重残差直接监督(治 delta 最后 8% + 或有惊喜)② 分段 R3 目标重建(归因 MOS 天花板 1.9 vs 1.98 的最后差距)

讨论