1 sadtalker介绍
西安交通大学也开源了人工智能SadTalker模型,通过从音频中学习生成3D运动系数,使用全新的3D面部渲染器来生成头部运动,可以实现图片+音频就能生成高质量的视频。
论文地址:Learning Realistic 3D Motion Coefficients
通过人脸图像和一段语音音频生成说话的头部视频仍然包含许多挑战。即不自然的头部运动、扭曲的表情和身份修改。研究团队认为这些问题主要是因为从耦合的 2D 运动场中学习。另一方面,明确使用 3D 信息也存在表情僵硬和视频不连贯的问题。
为了学习真实的运动系数,研究人员显式地对音频和不同类型的运动系数之间的联系进行单独建模:通过蒸馏系数和3D渲染的脸部,从音频中学习准确的面部表情;通过条件VAE设计PoseVAE来合成不同风格的头部运动。
最后使用生成的三维运动系数被映射到人脸渲染的无监督三维关键点空间,并合成最终视频。音频可以是英文、中文、歌曲,视频里的人物还可以控制眨眼频率!
开源代码地址:github地址
2 模型介绍
“用语音驱动静态照片”技术在数字人创作、视频会议等多个领域都迫切需要,但目前来说这仍然是一项非常有挑战性的任务。之前的工作主要集中在生成“唇部运动”,因为嘴唇的动作与语音之间的关系最强,其他工作也在尝试生成其他相关运动(如头部姿势)的人脸视频,不过生成视频的质量仍然非常不自然,并受到偏好姿势、模糊、身份修改和面部扭曲的限制。另一种流行的方法是基于latent的人脸动画,主要关注在对话式人脸动画中特定类别的运动,同样很难合成高质量的视频,因为虽然三维面部模型中包含高度解耦的表征,可以用来单独学习面部不同位置的运动轨迹,但仍然会生成不准确的表情和不自然的运动序列。
基于上述观察结果,研究人员提出了SadTalker(Stylized Audio-Driven Talking-head),通过隐式三维系数modulation的风格化音频驱动的视频生成系统。
为了实现这一目标,研究人员将3DMM的运动系数视为中间表征,并将任务分为两个主要部分(表情和姿势),旨在从音频中生成更真实的运动系数(如头部姿势、嘴唇运动和眼睛眨动),并单独学习每个运动以减少不确定性。最后通过一个受face-vid2vid启发设计的3D感知的面部渲染来驱动源图像。
(1)3D面部
因为现实中的视频都是在三维环境中拍摄的,所以三维信息对于提高生成视频的真实性至关重要;不过之前的工作很少考虑三维空间,因为只从一张平面图像很难获得原始的三维稀疏,并且高质量的面部渲染器也很难设计。
受最近的单图像深度三维重建方法的启发,研究人员将预测的三维形变模型(3DMMs)的空间作为中间表征。在3DMM中,三维脸部形状S可以被解耦为:
其中S是三维人脸的平均形状,Uid和Uexp是LSFM morphable模型的身份和表情的正则,系数α(80维)和β(64维)分别描述人物身份和表情;为了保持姿势的差异性,系数r和t分别表示头部旋转和平移;为了实现身份无关的系数生成,只将运动的参数建模为{β, r, t}。
即,从驱动的音频中单独学习头部姿势ρ=[r, t]和表情系数β,然后使用这些运动系数被隐式地调制面部渲染用于最终的视频合成。
(2)通过音频生成运动稀疏
三维运动系数包含头部姿势和表情,其中头部姿势是全局运动,而表情是相对局部的,所以完全学习所有的系数会给网络带来巨大的不确定性,因为头部姿势与音频的关系相对较弱,而嘴唇的运动则是与音频高度关联的。所以SadTalker使用下面PoseVAE和ExpNet分别生成头部姿势和表情的运动。
(3)ExpNet
学习到一个可以「从音频中产生准确的表情系数」的通用模型是非常困难的,原因有二:
1)音频到表情(audio-to-expression)不是对不同人物的一对一的映射任务;
2)表情系数中存在一些与音频相关的动作,会影响到预测的准确性。
ExpNet的设计目标就是为了减少这些不确定性;至于人物身份问题,研究人员通过第一帧的表情系数将表情运动与特定的人物联系起来。
为了减少自然对话中其他面部成分的运动权重,通过Wav2Lip和深度三维重建的预训练网络,只使用嘴唇运动系数(lip motion only)作为系数目标。至于其他细微的面部运动(如眼睛眨动)等,可以在渲染图像上的额外landmark损失中引入。
(4)PoseVAE
研究人员设计了一个基于VAE的模型以学习谈话视频中真实的、身份相关(identity-aware)的风格化头部运动。
在训练中,使用基于编码器-解码器的结构对固定的n个帧进行姿势VAE训练,其中编码器和解码器都是两层MLP,输入包含一个连续的t帧头部姿势,将其嵌入到高斯分布;在解码器中,网络从采样分布中学习生成t帧姿势。
需要注意的是,PoseVAE并没有直接生成姿势,而是学习第一帧的条件姿势的残差,这也使得该方法在测试中能在第一帧的条件下生成更长、更稳定、更连续的头部运动。根CVAE,PoseVAE中还增加了相应的音频特征和风格标识作为rhythm awareness和身份风格的条件。模型使用KL散度来衡量生成运动的分布;使用均方损失和对抗性损失来保证生成的质量。
(5)3D-aware面部渲染
在生成真实的三维运动系数后,研究人员通过一个精心设计的三维图像动画器来渲染最终的视频。最近提出的图像动画方法face-vid2vid可以隐含地从单一图像中学习3D信息,不过该方法需要一个真实的视频作为动作驱动信号;而这篇论文中提出的脸部渲染可以通过3DMM系数来驱动。研究人员提出mappingNet来学习显式3DMM运动系数(头部姿势和表情)和隐式无监督3D关键点之间的关系。
mappingNet通过几个一维卷积层建立,类似PIRenderer一样使用时间窗口的时间系数进行平滑处理;不同的是,研究人员发现PIRenderer中的人脸对齐运动系数将极大地影响音频驱动的视频生成的运动自然度,所以mappingNet只使用表情和头部姿势的系数。
训练阶段包含两个步骤:首先遵循原论文,以自监督的方式训练face-vid2vid;然后冻结外观编码器、canonical关键点估计器和图像生成器的所有参数后,以重建的方式在ground truth视频的3DMM系数上训练mappingNet进行微调。在无监督关键点的域中使用L1损失进行监督训练,并按照其原始实现方式给出最终生成的视频。
3 实验效果
为了证明该方法的优越性,研究人员选取了Frechet Inception Distance(FID)和Cumulative Probability Blur Detection(CPBD)指标来评估图像的质量,其中FID主要评估生成帧的真实性,CPBD评估生成帧的清晰度。
为了评估身份保留程度,使用ArcFace来提取图像的身份嵌入,然后计算源图像和生成帧之间身份嵌入的余弦相似度(CSIM)
为了评估唇部同步和口型,研究人员评估了来自Wav2Lip的口型的感知差异,包括距离评分(LSE-D)和置信评分(LSE-C)。
在头部运动的评估中,使用Hopenet从生成的帧中提取的头部运动特征嵌入的标准偏差来计算生成头部运动的多样性;计算Beat Align Score来评估音频和生成头部运动的一致性。
在对比方法中,选取了几种最先进的谈话头像生成方法,包括MakeItTalk、Audio2Head和音频转表情生成方法(Wav2Lip、PC-AVS),使用公开的checkpoint权重进行评估。
从实验结果中可以看出,文中提出的方法可以展现出更好的整体视频质量和头部姿势的多样性,同时在唇部同步指标方面也显示出与其他完全说话的头部生成方法相当的性能。
研究人员认为,这些唇语同步指标对音频太敏感了,以至于不自然的唇部运动可能会得到更好的分数,不过文中提出的方法取得了与真实视频相似的分数,也表明了该方法的优势。
不同方法生成的视觉结果中可以看到,该方法与原始目标视频的视觉质量非常相似,而且与预期的不同头部姿势也非常相似。
4 安装部署与使用:
(1)annoconda环境安装
annoconda环境安装与使用详见:环境安装
(2)sadtalker运行环境构建
conda create -n sadtalker python=3.8
conda activate sadtalker
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113
conda install ffmpeg
pip install -r requirements.txt
(3)预训练模型下载
mkdir ./checkpoints
#### download the new links.
wget -nc https://github.com/OpenTalker/SadTalker/releases/download/v0.0.2-rc/mapping_00109-model.pth.tar -O ./checkpoints/mapping_00109-model.pth.tar
wget -nc https://github.com/OpenTalker/SadTalker/releases/download/v0.0.2-rc/mapping_00229-model.pth.tar -O ./checkpoints/mapping_00229-model.pth.tar
wget -nc https://github.com/OpenTalker/SadTalker/releases/download/v0.0.2-rc/SadTalker_V0.0.2_256.safetensors -O ./checkpoints/SadTalker_V0.0.2_256.safetensors
wget -nc https://github.com/OpenTalker/SadTalker/releases/download/v0.0.2-rc/SadTalker_V0.0.2_512.safetensors -O ./checkpoints/mapping_00109-model.safetensors
### enhancer
mkdir -p ./gfpgan/weights
wget -nc https://github.com/xinntao/facexlib/releases/download/v0.1.0/alignment_WFLW_4HG.pth -O ./gfpgan/weights/alignment_WFLW_4HG.pth
wget -nc https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth -O ./gfpgan/weights/detection_Resnet50_Final.pth
wget -nc https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth -O ./gfpgan/weights/GFPGANv1.4.pth
wget -nc https://github.com/xinntao/facexlib/releases/download/v0.2.2/parsing_parsenet.pth -O ./gfpgan/weights/parsing_parsenet.pth
(4)视频生成
通过图片+语音生成视频:
python inference.py --driven_audio data/sample.wav --source_image data/sample.png
通过视频片段+语音生成视频
python inference.py --driven_audio data/sample.wav --source_image data/sample.mp4
(5)通过参数对生成的视频进行控制
--preprocess full 表示完整图片
--still 可以减少头部运动
--enhancer gfpgan
参数1是保留全身,如果不加这个参数,则视频中只剩头部
参数2是减少头部晃动,头部晃动是会和脖子的连接部位脱节
参数3是基于gfpgan对视频进行增强