公司动态
Ditto核心原理(三):motion_stitch缝合网络如何让数字人自然眨眼与表情过渡
Ditto核心原理三motion_stitch缝合网络如何让数字人自然眨眼与表情过渡【免费下载链接】ditto-talkinghead[ACM MM 2025] Ditto: Motion-Space Diffusion for Controllable Realtime Talking Head Synthesis项目地址: https://gitcode.com/gh_mirrors/di/ditto-talkingheadDitto 是 ACM MM 2025 的实时说话头合成项目输入一张照片和一段音频就能生成口型、表情、眼神都极其自然的说话数字人视频。而数字人之所以像活人除了嘴会动更关键的是它会不定时眨眼、表情平滑过渡。这正是缝合网络motion_stitch 模块的功劳。本文带你读懂 Ditto 中这套运动缝合机制的原理。数字人为什么容易假眨眼与缝合两大难题在生成式数字人里两个细节最容易穿帮不眨眼如果直接用音频驱动的口型运动眼睛会全程睁着几秒后观众就会产生恐怖谷般的违和感肩颈错位驱动人脸动起来时肩、颈部位的像素会和背景撕开出现明显的接缝。Ditto 把这两类问题都交给了运动空间中的缝合模块处理对应文件 core/atomic_components/motion_stitch.py模型结构在 core/models/modules/stitching_network.py。缝合流水线audio2motion 之后的整形师在 Ditto 的在线推理管线stream_pipeline_online.py中各模块通过队列多线程串联音频特征提取 → audio2motion扩散模型生成运动 → motion_stitch缝合 → warp_f3d3D变形 → decoder解码出图 → putback贴回原图motion_stitch 拿到的是两份运动信息x_s_infosource 运动从参考图片/视频中提取的原始姿态代表这个人本来长什么样、怎么摆头x_d_infodriving 运动扩散模型由音频驱动生成的新运动代表说话时嘴该怎么动。缝合任务就是一句话保留 source 的脸部结构把 driving 的口型缝上去再补上自然的眨眼。表情融合谁说了算核心函数_mix_s_d_info按类别决定每路数据的权重图片模式下driving 提供exp表情形变、pitch/yaw/roll头姿、t平移采用相对增量方式relative_dTrue以第一帧 driving 运动为基准 d0只叠加变化量避免人脸被整体拽偏不同分辨率来源之间还会按scale比例缩放运动幅度保证幅度匹配。简单说头怎么摆、脸长什么样听 source 的嘴巴怎么动听 driving 的。自然眨眼15帧闭眼 60~100帧随机间隔这是数字人活过来的关键。_set_eye_blink_idx函数会生成一整条视频的眨眼时间轴每次眨眼持续blink_n15帧约 0.5 秒正好是一开一闭的节奏两次眨眼之间随机间隔60~100帧模拟人类自然的眨眼频率支持固定间隔或循环指定间隔列表让眨眼节奏可控制。而闭眼动作从哪来Ditto 提供三种眼睛运动来源在setup时通过参数组合driving 眼睛drive_eyeTrue图片模式默认驱动序列自带的眼部运动眨眼最真实source 眼睛drive_eyeFalse视频模式默认用参考视频本身的眼部动作保留本人眨眼习惯固定眨眼数组delta_eye_arr预先录好的一组闭眼形变按上面的时间轴周期性套用适合单图驱动却想要自然眨眼的场景。融合时_fix_exp_for_x_d_info_v2按 21 个关键点对眼睛、嘴部分别加权6/12/14/17/19/20是嘴部关键点听 driving11/13/15/16/18是眼部关键点听眼睛来源其余面部关键点眉毛、脸颊等保持 source 原样——嘴动、眼眨、脸不变三者互不干扰。缝合网络一个肩带修正小MLP光融合数据还不够。人脸动起来后肩颈处像素会错位。Ditto 训练了一个轻量 MLP 来预测修正量输入 source 和 driving 两组关键点21×3×2126 维输出 65 维前 63 维21 个关键点各自的 3D 位移修正delta_exp后 2 维整体平移修正delta_tx_ty。网络把修正量直接加到 driving 关键点上就能让动画后的脸贴回原始图像空间而不出缝。这个结构继承自 LivePortrait 的 retargeting 思想参数极少实时推理毫无压力。细节魔法视线跟随与无声闭嘴视线修正_fix_gaze当 source 是静态图片时人眼不会随说话而转头。Ditto 用头姿差yaw/pitch 变化按固定比例微调眼球关键点让人物说话时眼神跟着内容走而不是呆滞盯着镜头VAD 闭嘴ctrl_vad静音片段无语音时用vad_alpha把嘴部关键点淡回到闭嘴状态避免人物没说话却一直在嚼淡入淡出fade视频开头结尾可用fade_alpha把运动渐变回 source 初始姿态配合离线模式下强制首尾帧睁眼set_Nd解决视频以闭眼状态开始/结束的尴尬。总结一套数据缝合 小网络的优雅组合Ditto 的 motion_stitch 设计思路非常清晰问题解决方案关键代码口型与脸型冲突按关键点分类加权融合_mix_s_d_info全程睁眼像机器人随机眨眼时间轴 多源眼部运动_set_eye_blink_idx肩颈接缝错位轻量 MLP 预测关键点修正StitchingNetwork眼神呆板头姿差驱动眼球微调_fix_gaze静音时乱动嘴VAD 淡入闭嘴ctrl_vad大部分工作用规则化的数据融合完成快且可控只在真正需要学习的接缝修正上放了一个几百 KB 的 MLP——这正是 Ditto 能做到实时、可控、且自然的关键之一。下一篇我们看 warp_f3d 如何把缝合好的关键点变成 3D 变形场。【免费下载链接】ditto-talkinghead[ACM MM 2025] Ditto: Motion-Space Diffusion for Controllable Realtime Talking Head Synthesis项目地址: https://gitcode.com/gh_mirrors/di/ditto-talkinghead创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考