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 可能小幅回落(天花板降低)。