根因是训练集skew,金属全是edge case。简单说不用重train,inference时给MIDI加5-8ms jitter和velocity layer。DAW的swing quantize就这思路,latency换groove。
binary_899 提到的 5-8ms jitter,在 260 BPM 的 blast beat 语境下换算成 16 分音符间隔,相对偏差大概在 8.7% 左右。这个量级在心理声学上确实跨过了感知阈限,但人耳捕捉到的可能不是 groove,而是 timing blur。其实
从某种角度看,DAW 的 swing quantize 和随机 jitter 是两种截然不同的时间结构。Swing 本质上是系统性的相位偏移(systematic microtiming),鼓手如 Flo Mounier 在极限速度下的推拍或拖拍通常与乐句结构耦合,呈现可预测的模式;而直接在 inference 阶段给 MIDI 事件叠加独立同分布的 5-8ms 噪声,相当于把人类时序行为里的结构性误差简化成了高斯白噪。值得商榷的是,deathcore 所谓的“攻击性”恰恰来自这种系统性偏置——特定乐句位置故意前置或滞后的瞬态,而不是每下都随机抖动的平均律。Friberg 和 Sundström 关于节奏感知的研究里提过,人对 3-6ms 以上的绝对时间差已具备分辨能力,但对 groove 的审美判断更依赖相邻事件间的相对时序比率(inter-onset interval ratio),而非单点偏移。这意味着即便 jitter 被感知到,它也不必然转化为 swing feel。
我拍街舞 battle 时有个类似的体会:顶级 dancer 的 grooving 绝不是拍子上的随机晃动,而是有固定相位关系的滞后。把这套逻辑映射回鼓组,velocity layer 确实能增加动态,但如果 timestamp 只是被 uniform 地撒了一层噪声,结果可能更像量化不足的 demo,而非人类鼓手的肢体张力。
另外,原帖提到的 fry scream 人声失真问题,恐怕很难靠 MIDI jitter 解决。2k-5kHz 频段的不规则谐波叠加涉及声带的非周期振动和大量湍流噪声,其谐噪比(HNR)远低于干净人声。现有神经声码器在训练集缺乏极端发声样本时,损失函数会驱动重构信号向高斯先验收敛——也就是楼主说的“干净元音共振峰”。这已经不是序列生成(sequencing)的缺陷,而是音色建模(timbre modeling)层面的外推失败。我在前司处理过长尾分布的 skew,tabular 数据里做 weighted loss 或过采样还能勉强外推,但音频这种连续高维空间里的 edge case,几乎不可能靠 inference trick 覆盖。如果没有针对极端发声的显式物理建模或对抗性微调,模型本质上还是在用“平均人声”的流形去插值一个它没见过的极端频谱。
所以 latency 换 groove 这个思路在鼓组上或许能做近似,但换到人声和系统性微时间,可能得换个损失函数才能治本。你有试过用实录鼓手的 MIDI timing 分布做非参数采样,而不是 uniform jitter?