JoyVASA 技术解析:把音频驱动人像动画拆成“运动生成 + LivePortrait 渲染”

发布时间:2026/7/1 16:00:04
JoyVASA 技术解析:把音频驱动人像动画拆成“运动生成 + LivePortrait 渲染” JoyVASA 技术解析把音频驱动人像动画拆成“运动生成 LivePortrait 渲染”JoyVASA 解决的不是“给一张照片配音”这个老问题而是一个更具体的工程矛盾扩散式 talking head 方法画质越来越好但端到端生成视频帧太重长视频连续性也不好两阶段方法更灵活却经常把音频到运动、运动到视频这两步做得不够干净。这篇文章按论文和开源仓库来拆 JoyVASA。核心结论先说在前面JoyVASA 的关键不在于又训练了一个音频扩散模型而在于它把 LivePortrait 的解耦表示拿来当“运动空间”让扩散模型只负责生成身份无关的表情、头动、尺度、位移等 motion sequence最后再交给 LivePortrait 风格的渲染器把静态外观和动态运动合成视频。官方信息论文为 arXiv:2411.09209v5 更新于 2026-04-16代码仓库在jdh-algo/JoyVASA模型权重发布在 HuggingFace 的jdh-algo/JoyVASA。论文作者来自 JD Health International Inc. 和浙江大学。JoyVASA 在 talking head 里的位置音频驱动人像动画大致有两条路线。第一条是端到端 audio-to-video。Wav2Lip、Dinet、StyleSync 这类早期方法偏重唇形同步EMO、Hallo、EchoMimic 等扩散式方法把视觉质量和表情丰富度往前推了一步。但端到端方法通常要直接预测图像帧计算量大窗口也短。JoyVASA 论文里提到一些方法一次大约预测 10 帧按 25 FPS 算就是 0.4 秒左右。窗口太短时模型很难利用更长的历史运动容易出现抖动、身份形变或帧间不连续。第二条是两阶段路线先把音频映射到中间运动表示再用 motion-to-video 模块渲染图像。SadTalker、DreamTalk、VASA-1 都属于这个方向的不同变体。两阶段路线的好处是把问题拆小了音频模型不用直接生成像素渲染器也不用理解语音节奏。但中间表示选得不好后面会很难补。JoyVASA 的选择很明确不重新设计一个 3DMM 或 landmark 表示而是借用 LivePortrait 的解耦人脸表示。它把一张参考图拆成静态外观特征把视频中的动态变化拆成 motion features。音频扩散模型只在 motion features 里采样。这个设计让 JoyVASA 有两个实际收益一是生成更长的视频时不用直接处理完整像素序列二是同一套音频运动可以迁移到不同身份甚至动物图像。两阶段框架先学表示再学音频到运动JoyVASA 的训练分成两个阶段。第一阶段是解耦 facial representation。论文沿用 LivePortrait 的框架把人脸表示分成 3D appearance features 和 motion features。静态部分描述身份、纹理、脸型这类外观信息动态部分描述表情、头部旋转、平移、尺度和关键点位移。论文记号里motion features 包括关键点位移δ\deltaδ旋转矩阵RRR平移向量ttt缩放因子sssLivePortrait 中的关键点变换可以写成xsT(xc,ss,Rs,ts,δs)ss⋅(xcRsδs)ts x_s T(x_c, s_s, R_s, t_s, \delta_s) s_s \cdot (x_c R_s \delta_s) t_sxs​T(xc​,ss​,Rs​,ts​,δs​)ss​⋅(xc​Rs​δs​)ts​xdT(xc,sd,Rd,td,δd)sd⋅(xcRdδd)td x_d T(x_c, s_d, R_d, t_d, \delta_d) s_d \cdot (x_c R_d \delta_d) t_dxd​T(xc​,sd​,Rd​,td​,δd​)sd​⋅(xc​Rd​δd​)td​这里xcx_cxc​是 canonical 3D keypointsxsx_sxs​是源图像对应的 3D keypointsxdx_dxd​是驱动帧对应的目标 keypoints。把这组参数看成运动空间后JoyVASA 不需要让音频模型直接预测图像也不需要额外的视频动作参考。第二阶段才是 JoyVASA 自己的重点训练一个 audio-conditioned diffusion transformer从音频特征生成 motion sequence。论文使用冻结的 wav2vec2 提取音频特征用冻结的 LivePortrait motion encoder 从真实视频中提取运动序列。训练目标是让扩散模型从噪声中恢复干净的运动序列。简化成流程图就是参考图像 ├─ appearance encoder → 静态 3D 外观特征 └─ motion encoder → 源图关键点 / 源姿态 输入音频 └─ wav2vec2 / HuBERT → 音频特征 ↓ diffusion transformer ↓ 目标 motion sequence: [R, t, δ, s] ↓ LivePortrait warping generator ↓ 输出 talking video这个图里最值得关注的是中间的[R, t, δ, s]。它既包含头部运动也包含唇形和表情不只是传统意义上的 head pose。JoyVASA 论文明确说这里的 motion information 覆盖第一阶段人脸表示中的所有相关 facial dynamics。为什么“身份无关运动”能驱动物体和动物JoyVASA 在论文和项目页里都展示了一个比较有传播性的能力同一段音频不只可以驱动真人头像也可以驱动动漫、艺术画像和动物图像。这不是因为音频模型“懂动物”。更准确地说JoyVASA 把音频到运动这一步做成身份无关的生成扩散模型只看音频特征和历史运动窗口不直接看参考图的图像内容。参考图的身份、纹理和形状留在渲染阶段处理。只要第一阶段表示和渲染器能把目标图像放进可动空间音频生成出来的 motion sequence 就可以被套到不同外观上。这个设计有代价。论文也指出因为预测的 motion sequence 只和音频有关不同角色可能会得到相似的表情和动作。仓库 README 里给出的一个实用旋钮是cfg_scale调节 classifier-free guidance 的强度可以得到不同表情和姿态幅度。换句话说JoyVASA 的泛化来自“去身份化”但个体化表演还需要额外控制。扩散模型到底在预测什么JoyVASA 的 diffusion transformer 不是预测噪声而是直接预测 clean motion sequence。论文把训练窗口拆成当前窗口WcurW_{cur}Wcur​和过去窗口WpreW_{pre}Wpre​模型输入包括过去与当前音频特征、过去 clean motion以及当前 noisy motion。这样做是为了在滑窗生成时保持时间一致性。论文中条件可以概括为C[X−Wpre:0,A−Wpre:Wcur] C [X_{-W_{pre}:0}, A_{-W_{pre}:W_{cur}}]C[X−Wpre​:0​,A−Wpre​:Wcur​​]其中XXX是历史运动AAA是音频特征。相对 VASA-1JoyVASA 的条件更紧凑VASA-1 中单独编码的 gaze direction 和 head-to-camera distance在 JoyVASA 里由δ\deltaδ和sss这类 motion parameters 表达。训练损失由四部分组成LtotalLsimpleλvelLvelλsmoothLsmoothλexpLexp L_{total}L_{simple}\lambda_{vel}L_{vel}\lambda_{smooth}L_{smooth}\lambda_{exp}L_{exp}Ltotal​Lsimple​λvel​Lvel​λsmooth​Lsmooth​λexp​Lexp​含义很直接LsimpleL_{simple}Lsimple​生成运动序列和真实运动序列之间的 L2 距离。LvelL_{vel}Lvel​约束速度减少运动节奏上的突变。LsmoothL_{smooth}Lsmooth​惩罚大加速度让时序更平滑。LexpL_{exp}Lexp​额外强调关键点位移δ\deltaδ也就是唇形和表情相关部分。论文实现细节里denoising network 是 6 层 transformer decoder8 个 attention heads隐藏维度 512。Wcur100W_{cur}100Wcur​100Wpre25W_{pre}25Wpre​25。训练使用 Adam20,000 stepsbatch size 16学习率1×10−41 \times 10^{-4}1×10−4。三个损失权重分别是λvel5.0\lambda_{vel}5.0λvel​5.0λsmooth0.5\lambda_{smooth}0.5λsmooth​0.5λexp0.1\lambda_{exp}0.1λexp​0.1。这些数字能看出作者的偏好时间速度约束权重很高说明他们更在意运动连续性表情损失权重较小但单独保留避免唇形和表情被整体 motion loss 淹掉。实验结果要怎么看JoyVASA 训练 motion generator 时用了三个数据源HDTF、CelebV-HQ以及团队自建的高分辨率说话数据。论文说最终得到 5,578 个训练视频片段单个片段从 8 秒到数分钟不等并通过视频质量评估模型、唇音同步模型和大幅头动过滤做清洗。评测有两个集合CelebV-HQ test50 个随机人物每人两个 5 到 15 秒的视频片段且不出现在训练集。Openset来自互联网的 50 张图像覆盖真人、动画角色、手工材料等配 50 段音频包括演讲、情绪对话和唱歌。论文主要指标包括 IQA、VQA、Sync-C、Sync-D、Smooth、FID 和 FVD。这里不用把表格当排行榜看因为每个指标在 talking head 里权重不同。JoyVASA 的结果更像一个取舍它不一定在静态画质上赢但在运动连续性和跨身份可用性上更突出。CelebV-HQ test 上JoyVASA 的 IQA 为 68.97%VQA 为 72.42%低于 Aniportrait 的 74.85% 和 78.00%。但 JoyVASA 的 FVD-25 是 459.04是表中最低Smooth 为 99.60%只略低于 Aniportrait 的 99.66%。这和方法设计对得上它把像素生成压力交给渲染器把扩散模型集中在紧凑运动空间因此长一点的运动连贯性更容易做好。Openset 上JoyVASA 的 IQA 和 VQA 分别是 71.45 和 77.78也低于 Aniportrait 的 81.84 和 87.62Sync-C 为 5.72Sync-D 为 14.01Smooth 为 99.48。论文自己的表述也比较克制它承认视觉质量和同步精度仍有提升空间但强调方法在多类型角色上的可迁移性。我更愿意把 JoyVASA 看成“架构选择有效但第一阶段上限明显”的工作。它证明了用 LivePortrait motion space 做音频扩散生成是可行的同时最终画质和大姿态表现被 LivePortrait 的 appearance encoder、motion encoder 和 decoder 限住。这也是论文 limitation 里说得最清楚的一点。和 VASA-1、LivePortrait 的关系JoyVASA 这个名字很容易让人直接联想到 VASA-1。两者确实都走“音频生成 facial dynamics/head motion再渲染视频”的路线也都关心长视频、自然头动和身份无关运动。但 JoyVASA 的公开价值主要在两个地方。第一它绑定了 LivePortrait 这套可复用的解耦表示和渲染器。LivePortrait 已经把一张图的静态外观和驱动运动拆开JoyVASA 相当于把“驱动视频”替换成了“音频扩散模型生成的驱动运动”。这比从头训练一个完整 video diffusion 系统轻得多。第二JoyVASA 有公开代码和权重路线。README 里提供了安装、权重下载、命令行推理和 Web demo。系统要求中作者测试过 Ubuntu 20.04 CUDA 12.1 A100也测试过 Windows 11 CUDA 12.1 RTX 4060 Laptop 8GB VRAM。动物图像动画还需要安装 XPose / UniPose 里的 MultiScaleDeformableAttention。基础推理命令如下# Animalpython inference.py-rassets/examples/imgs/joyvasa_001.png\-aassets/examples/audios/joyvasa_001.wav\--animation_modeanimal--cfg_scale2.0# Humanpython inference.py-rassets/examples/imgs/joyvasa_003.png\-aassets/examples/audios/joyvasa_003.wav\--animation_modehuman--cfg_scale2.0README 还提醒了一个容易踩的坑animation_mode和参考图类型不匹配会产生错误结果。人像和动物不是一个完全统一的推理分支至少在工程路径上需要分开处理。复现时最容易卡在哪里如果只是读论文JoyVASA 看起来很干净真要跑起来问题主要集中在权重和依赖。权重目录需要同时包含 JoyVASA motion generator、motion template、LivePortrait、LivePortrait animals、InsightFace以及音频 encoder。README 里列出的音频 encoder 包括facebook/wav2vec2-base-960h和TencentGameMate/chinese-hubert-base但同时注明 wav2vec2 encoder 对应的 motion generation model 会在之后支持。也就是说当前复现时要按 README 的最新状态确认具体 checkpoint 是否齐全不能只看论文里写了 wav2vec2 就默认所有路径都可用。Windows 上还有一个小细节README 提到TencentGameMate:chinese-hubert-base这个目录在 Windows 下应改名为chinese-hubert-base。这是典型的跨平台路径问题不是模型问题。训练自己的 motion generator 时仓库给了数据准备脚本cdsrc/prepare_data python 01_extract_motions.py python 05_extract_audio.py python 02_gen_labels.py pyhton 03_merge_motions.py python 04_gen_template.pymvmotion_templete.pkl motions.pkl train.json test.json../../datacd../..python train.py这里 README 原文里pyhton 03_merge_motions.py和motion_templete.pkl似乎是拼写错误。实际操作时要检查脚本名和生成文件名。技术博客里值得把这种细节写出来因为它比“效果很好”更能帮人少浪费半小时。这篇工作的限制JoyVASA 的限制不难理解。第一画质上限受第一阶段表示和渲染器影响。论文明确指出LivePortrait 在大姿态变化时表现不够理想同时LivePortrait 的 retargeting module 是为跨身份参考图设计的在纯音频驱动场景里并不完全匹配。这会影响最终输出质量。第二身份无关运动带来的跨角色泛化也会削弱个体差异。同一段音频驱动不同角色时表情可能趋同。CFG scale 可以调但它更像采样强度旋钮不是精细表演控制器。第三实时性还不是这篇工作的重点。论文未来工作里提到要提升实时处理能力和表达控制。对于产品场景来说这一点很关键如果只能离线生成它更适合内容制作如果能低延迟生成才可能进入实时数字人或虚拟助手链路。一句话评价JoyVASA 的价值在于把 audio-driven portrait animation 里的“生成什么”换了一个层次不直接生成视频帧而是生成 LivePortrait motion space 里的身份无关动态序列。这个选择让模型更轻、更容易做长视频也自然支持人像、动漫和动物图像代价是最终画质和大姿态表现仍然被第一阶段渲染体系限制。如果你已经熟悉 LivePortraitJoyVASA 最好理解它不是替代 LivePortrait而是给 LivePortrait 补了一个音频驱动的 motion generator。如果你在做 talking head 或数字人这个思路比单纯追更大的 video diffusion 模型更值得认真看。参考资料JoyVASA paper: https://arxiv.org/abs/2411.09209JoyVASA arXiv HTML: https://arxiv.org/html/2411.09209JoyVASA GitHub: https://github.com/jdh-algo/JoyVASAJoyVASA project page: https://jdh-algo.github.io/JoyVASA/JoyVASA HuggingFace model: https://huggingface.co/jdh-algo/JoyVASALivePortrait GitHub: https://github.com/KwaiVGI/LivePortrait