跳转至

M19 变速引擎更换 · DTW + RubberBand R3 试听

状态 🎧 待用户听感确认(2026-08-30)——通过后重建缓存并从 90k 续训
一句话 把中立目标的变速引擎从 WSOLA 换成 RubberBand R3 实时模式 + 逐块时变速率:单流走完整句、无段界拼接,对齐精度不变而音质回收
上游 ← 探针页:WSOLA 目标比均匀 R3 低 0.52 MOS,伪影占残差能量 24% —— 电音主犯

TL;DR

对齐不变、音质回收一半、速度快 27 倍。

  • ✅ 声码后 UTMOS 2.78 → 3.05(均匀 R3 的 3.33 为无错位上限,回收约 52%)
  • ✅ 对齐精度与 WSOLA 完全一致:中位 20ms、p90 40ms(≤2 帧);均匀 R3 是 70/160ms
  • ⚖️ mel 残差能量:test 划分上 0.0749 → 0.0717(略降),但全库 300 条配对上方向相反(WSOLA 0.0567 vs R3 0.0621)—— WSOLA 逐段照抄原波形故能量上更近、仅拼接点有相位断裂;R3 整体过相位声码器,能量稍远而听感干净。 能量与听感在此处不同向,L2 训练能否传导该增益由 M20 实测
  • ⚡ 变速耗时 0.11s/条(WSOLA 2.7s)——全量缓存重建从 2 小时降到约 5 分钟
  • ⚠️ 代价:R3 目标的情感分从 0.127 升到 0.178(音色保真度更高 ⇒ 中立目标里残留的情感线索更多), delta 天花板相应从 0.885 降到约 0.82——用一点 delta 上限换 0.27 MOS 上限

1 方法

WSOLA 之所以被选中,是因为 pylibrb 的 set_keyframe_map 绑定有 bug(dict 转不进 std::map)。 本次绕开该 API:RubberBand 实时模式支持中途修改 time_ratio,于是无需 keyframe map——

1. DTW 锚点同前(250ms 一锚、单调、速率夹 [0.4,2.5])
2. 由锚点段生成逐样点速率曲线 rate[n]
3. RubberBandStretcher(PROCESS_REALTIME | ENGINE_FINER)  ← R3 引擎
4. 以 256 样点为块推流,每块把 time_ratio 设为该块速率中位数
5. 丢弃 get_start_delay() 个前导样点、补/裁到锚点终点长度

单条连续流,没有分段拼接、没有交叉淡入,因此不引入段界不连续。

2 三种构造对照(n = 148 对,test 划分 40 组 × ≤4 情感)

中立目标构造 mel 残差占比 对齐 中位/p90 (ms) 声码后 UTMOS 情感分
均匀 R3(M18 口径) 0.1082 70 / 160 3.33 0.144
DTW + WSOLA(M19 现行) 0.0749 20 / 40 2.78 0.127
DTW + R3(新) 0.0717 20 / 40 3.05 0.178

参照:情感原录音 UTMOS 2.54、自然中立原录音 3.55、HiFT(情感 mel) 2.61(探针页 §2.1)。

  • 音质:新方法把 WSOLA 丢掉的 0.55 分收回 0.27——不是全部(时变变速本身有代价),但过半
  • 对齐:与 WSOLA 逐项相同(20/40ms),均匀 R3 依旧是 70/160ms 的错位——DTW 的价值保住了
  • 情感分升高是需要留意的副作用:R3 保真度高,中立目标里的情感线索(音色、共振峰细节) 保留得更多,α=0 目标"更像情感"一点点 ⇒ delta 天花板略降

3 试听

每行同一句中立音频、同样过 HiFT,唯一变量是变速引擎。重点对拍第 2 列(现行)与第 3 列(新)。

组 / 情感 WSOLA(现行) R3(新)★ 均匀 R3(无对齐,音质参照) R3 变速原始波形(未过声码器)
0001_text00010 Angry
0001_text00010 Happy
0001_text00010 Sad
0001_text00010 Surprise
0002_text00150 Angry
0009_text00160 Sad
0010_text00310 Happy
0009_text00200 Surprise

第 4 列没有做 DTW 对齐(节奏是均匀拉伸的),放在这里只作音质上限参照。

4 若确认,后续动作

步骤 内容 耗时
1 data/m19r3_cache/ 重建(仅 x1_neu 换 R3 变速版,其余字段引用 m13_cache) ~10 分钟(8 进程)
2 从 90k ckpt 续训 30k 步(配置不动:--m19 --base_init --lambda_ortho 1.0,α 档 0–2) ~2.5 小时
3 10k/20k 中评 + 终评 + 探针 + 音频页(与 90k★ 同名对拍) ~1 小时

预期:α=0 与中段 MOS 上抬(目标端多了 0.27 分的空间)、电音减轻;delta 可能小幅回落(天花板降低)。

讨论