
music-to-dance生成是将听觉输入转换为动态的动作, 在虚拟世界, 编舞和电子娱乐方面有重要应用, 并在内容生成创造领域有潜在应用.
当前研究有两个范式: 1) 直接从音乐映射动作; 2) 先构建编舞单元, 然后学习它们在音乐条件下的概率分布. 它们忽略了舞蹈体裁的重要性, 只是作为一个辅助条件, 接着举了个例子.
它的relate work也是在分两节, 1) 一阶段音乐-舞蹈生成: 提取音乐特征 -> 预测动作, 相关的方法有编解码结构, 图卷积网络, GANs, Diffusion -> 动作缺乏明确的约束, 往往导致非标准姿态超出舞蹈子空间; 2) 两阶段音乐舞蹈生成: 先建模编舞单元分布, 再根据条件预测. 问题: 1)VQ-VAE codebook利用率低, 2) 舞蹈类型信息利用不足.

给定一个音乐序列 M={m0,m1,…,mT} 以及一个舞蹈风格标签 g,我们的目标是合成对应的舞蹈序列
S={s0,s1,…,sT},其中 mt 和 st 分别表示在时间步 t 处的音乐特征和舞蹈特征。
我们将每一个音乐特征 mt 定义为一个 35 维向量,
该向量由 Librosa 提取,包括 20 维 MFCC、12 维 Chroma、
1 维 Peak、1 维 Beat 以及 1 维 Envelope。
我们将风格标签 g 编码为 one-hot 向量。
我们将每一个舞蹈特征表示为一个 147 维向量
st=[τ;θ],其中 τ 和 θ 分别表示
SMPL 模型的根平移以及 6 维旋转表示。
此外,我们将音乐序列与舞蹈序列在时间上进行同步,时间粒度为每秒 30 帧。
传统VQ: 维护一个显式的codebook {e1,...,eK}, 通过最近邻查找进行量化
k=argjmin∥z−ej∥2,z^=ek
问题: argmin是离散操作, 导致梯度无法传播, 只有少数码本被反复使用, 造成codebook collapse.
FSQ的改进: 抛弃显式codebook,直接对特征的每个channel做标量量化, 用可微的标量舍入替代不可微的向量查找, 从根本上避免了codebook collapse.
z^=f(z)+sg[Round[f(z)]−f(z)]
Codebook Collapse(码本坍塌)
传统VQ-VAE使用离散的"argmin"操作进行码本选择,这会导致:
- 只有少数码本条目被频繁使用,大部分条目被"闲置"
- 梯度无法有效传播(argmin不可微)
- 码本利用率低,表征能力受限
注
另一篇论文<Towards Robust Blind Face Restoration with Codebook Lookup Transformer>为codebook提供了另一个视角.
直接在SMPL参数空间做重建, 对所有关节一视同仁是有问题的, 根节点的误差会传播到全身所有关节, 但是手和脚的误差只会影响自身, 本文的做法是通过Forward Kinematics将SMPL参数转换为3D关节位置 J, 在关节空间额外施加约束(静态位置与运动学特性(速度, 加速度)), 具体loss设计为
Lsmpl(S^,S)=∥S^−S∥1+α1∥S^′−S′∥1+α2∥S^′′−S′′∥1
Ljoint(J^,J)=∥J^−J∥1+α1∥J^′−J′∥1+α2∥J^′′−J′′∥1
S,S^ 表示 GT / 预测的SMPL参数, J,J^ 表示 GT / 预测的3D关节位置, 一阶导二阶导分别表示速度加速度.
舞蹈序列离散化后, 音乐到舞蹈的生成任务变成了回归任务.
损失是supervised交叉熵损失, 长度小于5.5秒直接自回归, 大于5.5秒通过滑动窗口.
包含多个定制专家和一个通用专家, 每个专家通过Mamba捕获模态内的局部依赖, 通过Transformer捕获跨模态间的全局上下文.
主要讲这样做的好处, 很好理解就不赘述了.
Cross-Modal Global-Context Modeling. 标准的attention公式就不细提了, 说一下它的掩码设计, 如果我们使用因果注意力的掩码设计会导致一个问题, 在训练时能看到当前帧的所有前序帧, 但是在推理阶段, 需要生成的舞蹈序列可能非常长, 他要用滑动窗口截断, 比如0-149帧, 它要截取50-149帧输入模型, 为了消除这种训推不一致, 在训练阶段的mask模拟这种滑动窗口的设计.
让GPT整理了一下答案:
Sliding Window Attention设计
以训练长度 T=100 帧,推理生成 300 帧为例。三种模态:Music (M)、Upper-body (U)、Lower-body (L)。
三种模态沿时间轴拼接,总长度 3T:
[M_0, M_1, ..., M_99 | U_0, U_1, ..., U_99 | L_0, L_1, ..., L_99]
|______ 音乐 ________|_____ 上半身 _______|_____ 下半身 ______|
100帧 100帧 100帧
Attention mask 是 3T×3T=300×300:
生成 U_50 时 → attend to: [M_0~M_99, U_0~U_50]
→ 能看到【全部音乐】+【上半身历史】
生成 L_50 时 → attend to: [M_0~M_99, U_0~U_99, L_0~L_50]
→ 能看到【全部音乐】+【全部上半身】+【下半身历史】
模型学到:"我可以看到完整的音乐和所有历史动作"
生成第150帧时,理论输入:
[M_0~M_149 | U_0~U_149 | L_0~L_149] ← 共450帧,超出容量
实际只能输入(窗口=100):
[M_50~M_149 | U_50~U_149 | L_50~L_149] ← 物理截断为300帧
问题:训练时能看到完整历史,推理时只能看到窗口内容——mismatch。
训练时用 3×3 块矩阵的sliding window mask:
M=MmmMumMlmMmuMuuMluMmlMulMll
每个块是 T×T 的sliding window mask(假设窗口=50):
生成 U_70 时 → attend to: [M_21~M_70, U_21~U_70]
→ 只能看【窗口内音乐】+【窗口内上半身历史】
生成 L_70 时 → attend to: [M_21~M_70, U_21~U_70, L_21~L_70]
→ 只能看【窗口内】的所有模态
模型学到:"我只能看到窗口内的音乐和动作"
生成第150帧(窗口=100):
物理输入模型: [M_50~M_149 | U_50~U_149 | L_50~L_149]
|__ 音乐 __|__ 上半身 __|__ 下半身 __|
生成 U_150 → attend to: [M_50~M_149, U_50~U_149] ✓ 与训练一致
生成 L_150 → attend to: [M_50~M_149, U_50~U_149, L_50~L_149] ✓ 与训练一致
关键:跨模态场景下,sliding window同时作用于音乐和动作,训练时的mask限制 = 推理时的物理截断。
Intra-Modal Local-Dependency Modeling. 关于Mamba在这篇论文里解释过了.
数据集是FineDance和AIST++, 其它定量实验很常见.
感受
两点改进, codebook和MoE分舞蹈类型专家, 能想到MoE有点东西.
- 对music to dance的先前工作分类角度很好, 一阶段生成和两阶段生成(传统我们会说自回归和diffusion的方法).
- codebook是一个可以改进的点, 有点像文本任务中的分词器, 容易提效果.