详解经典2D数字人算法SadTalker和Wav2Lip技术原理。

最近两年,数字人受到越来越多人的关注。数字人可分为3D和2D。3D的话比较出名的是虚幻引擎的meta human,背后的技术涉及到blendshape等等。而本文将介绍两个比较知名的2D数字人算法,分别是SadTalker和Wav2Lip。另外,最近泰勒斯威夫特说中文的视频很火,据说背后用到的算法之一是GeneFace++,不过限于篇幅和它的前提知识比较多,本文暂时不讲。

2D数字人根据输入类型的不同,还可以进一步分为视频+音频,wav2lip和geneface属于这一类,这一类算法只生成新的口型,另一类的输入是图片+音频,sadtalker属于这一类,这一类不仅生成新的口型,还生成头部运动,复杂度较高。

Wav2Lip技术原理

论文:《A Lip Sync Expert Is All You Need for Speech to Lip Generation In the Wild》

 http://cdn.iiit.ac.in/cdn/cvit.iiit.ac.in/images/Projects/Speech-to-Lip/paper.pdf

官方代码:https://github.com/Rudrabha/Wav2Lip

wav2lip采用的是GAN的训练范式,但它一共有1个生成器(下图左边大框,Generator)和2个判别器(下图右边两个小框,分别是pre-trained lip-sync expert和visual quality discriminator)。

数字人算法~SadTalker&&Wav2Lip_github

讲完唇音同步判别器,剩下的一个生成器和一个判别器就跟常规的GAN差不多了。

数字人算法~SadTalker&&Wav2Lip_3D_02

SadTalker技术原理

论文:《SadTalker: Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation》

 https://arxiv.org/pdf/2211.12194.pdf

官方代码:https://github.com/OpenTalker/SadTalker

我用modelscope封装的sadtalker:https://github.com/wwdok/sadtalker_modelscope

数字人算法~SadTalker&&Wav2Lip_3D_03

后续每一帧的表情系数和头部姿态系数分别是由ExpNet、PoseVAE这两个模型输出。为什么不把表情系数和头部姿态系数用一个模型输出就好?因为作者发现,表情运动是局部的,头部运动是全局的,且表情跟声音的关系比较强,头部姿态跟声音的关系比较弱,将这两个系数解耦开可以减少人脸扭曲。   

ExpNet的测试时和训练时的工作流程如下图所示:

数字人算法~SadTalker&&Wav2Lip_3D_04

这里讲一下上面提到的3DMM技术和3D人脸重建。3DMM是3D人脸重建中的一种技术或思想。3DMM(3D Morphable Models)的思想是用以下等式建模一个3D人脸:

数字人算法~SadTalker&&Wav2Lip_3D_05

数字人算法~SadTalker&&Wav2Lip_人工智能_06

有了源图片、源3D关键点、驱动3D关键点,将它们送给Image Generator,就能合成每一帧画面了。Face vid2vid和3D-aware Face Render的工作流程如下图所示:

数字人算法~SadTalker&&Wav2Lip_Image_07

至于mappingNet的训练,包含两个步骤:首先,按照原论文中的方法训练 face-vid2vid。第二步,冻结appearance encoder, canonical keypoints estimator 和 image generator的所有参数,重构pipeline后在真实视频的 3DMM 系数上训练mappingNet。最终生成视频按照face-vid2vid的原始实现方式进行。

这一部分论文中讲得比较少,因为大部分内容都是借鉴自face-vid2vid的论文《One-shot free-view neural talking-head synthesis for video conferencing》,项目主页:https://nvlabs.github.io/face-vid2vid/ 。

Image Generator代码中对应的是class OcclusionAwareSPADEGenerator。要想看懂里面的代码,需要对3D版的卷积算子和3D版的grid_sample算子比较熟悉,已经写了很多字了,这里我就偷懒跳过不展开讲了。

如果你想体验SadTalker,除了跑官方代码仓库外,也可以试试我用modelscope封装的sadtalker库( https://github.com/wwdok/sadtalker_modelscope ),它的优点是把模型权重也打包进去了,国内下载速度很快,几行代码就可以调用sadtalker的能力。