AnyTalk: Speech Animation for Arbitrary Characters Leveraging a Video Generation Model
Kwan Yun, Serin Yoon, Sunjin Jung, Jung Eun Yoo, Inyup Lee, Junyong Noh
cs.GR, cs.CV, cs.MM, cs.SD
2026-08-17
音频嵌入置零微调视频扩散模型,任意 3D 角色零动画数据出口型动画;LSE-D 11.3 优于 ScanTalk,21 人盲测偏好 78.6%。
给 3D 角色配语音口型,通行做法是给每个角色训一个专属模型:音频配 3D 面部动画的成对数据本来就稀缺,换一个 mesh 结构、换一套 blendshape 配置就得重训,或者让美术把角色重新绑到标准模板上。CodeTalker、DiffSpeaker 这类方法在各自模板上效果不错,但真实管线的角色资产千差万别,这个前提天天破功。ScanTalk 能吃任意 mesh,精度和自然度都让了一步。
AnyTalk 的问题设定很直接:只要角色带 blendshape 绑定,不给任何动画训练数据,生成唇同步的说话动画。
思路是把动作知识外包给视频扩散模型。Hallo 这类音频驱动的人像视频模型在海量说话人视频上预训练,天然懂「这段音频对应什么嘴部动作」,但要把它用到任意 3D 角色上,中间隔着一个域 gap:生成的人脸视频和 3D 渲染图在画风、几何上对不上。
第一步 Character-specific Fine-tuning(CsF)补这个 gap,关键是零音频嵌入这一手:把角色每个 blendshape 单独激活渲染成静止图,复制成静止视频,训练时把音频编码器的输出整个置零。音频是这个架构里动作的驱动源,置零等于告诉模型「没有声音就没有动作」,于是模型把「这个角色长什么样」和「静止状态」一起学进去,全程没见过一帧带动作的动画数据。训练时冻结时序层和注意力层,只训空间残差网络,保住预训练学到的动作先验。
推理时反过来:给真实语音,并把注意力权重改成 wpose=0、wexp=1、wlip=2,压住头部运动、放大唇部运动,得到一段头不动、嘴在说的角色视频。
第二步把这段视频抬回 3D:优化 blendshape 参数 B,让 3D 面部关键点投影后对齐视频里的 2D 关键点。损失三项:说话相关关键点对齐(单应变换 warp,只用表情不变的关键点)、非对称张嘴损失(权重大于 1,宁可嘴张大也不张小)、L1 正则保住非语音类 blendshape 不乱动。
另有蒸馏版 AnyTalkRT:用完整版生成约 1600 段动画当训练数据,蒸馏出一个轻量网络,单帧 9.09 毫秒(110 FPS),唇同步指标略降,换实时可用。
五个测试角色跨度很大:顶点数从 4,542 到 241,981,blendshape 参数从 32 到 121,风格从卡通到照片级。音频用 LibriSpeech,共 150 段动画。
| 方法 | LSE-D(低更好) | LSE-C(高更好) |
| AnyTalk | 11.304 | 3.155 |
| ScanTalk | 12.152 | 2.395 |
| DiffSpeaker+NFR | 13.857 | 0.665 |
| CodeTalker+NFR | 13.840 | 0.668 |
对同为任意 mesh 路线的 ScanTalk,AnyTalk 两项唇同步指标都赢,幅度不算悬殊;对「通用面部模型+神经绑定迁移」的两个组合基线是碾压。21 人盲测、525 组对比:对 ScanTalk 的自然度偏好 78.6%、唇同步 76.8%;对两个组合基线偏好 99.4%99.8%。AnyTalkRT 落在 LSE-D 12.19、LSE-C 2.96,速度换精度。
成本结构变了。以前上一个新角色意味着采动画数据或重绑骨骼,现在只需要角色带 blendshape 和一套渲染图。对小工作室,这是把说话头动画从资产管线里最贵的一环变成按需生成的能力。方法本身也示范了一个可复用的套路:视频扩散模型当动作先验,零条件嵌入当「静止」信号,再用优化把 2D 输出贴回 3D 参数。
作者自述:优化阶段单帧约 3.12 秒,离线可用、实时不行;绑定质量是硬前提,缺一个张嘴 blendshape 就可能失败;2D 关键点稀疏,细微表情和高频动作捕捉不到;只支持正面视角,多视角生成因为扩散的随机性没做出来;为保 3D 几何稳定,唇动幅度比逐帧 2D 方法保守。
读下来还有两点:两个 +NFR 基线是从通用模板跨域迁移过来的,99% 以上的偏好率更多反映基线在跨域设置下崩掉,不全是 AnyTalk 的绝对水平;音频只测了 LibriSpeech 英语,歌唱、情绪语音、其他语言没有覆盖。