Sad Talker:使用一张图片和一段语音来生成口型和头、面部视频
论文:SadTalker: Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation
代码:https://github.com/Winfredy/SadTalker
出处:CVPR2023 | 西安交大、腾讯、蚂蚁
时间:2023.03
贡献:
- 提出了 SadTalker,能够输入一个图片和一段音频来实现 talking head vedio 的生成
- 将 3DMM 的 motion coefficient 作为中间表达,通过 ExpNet 和 PoseVAE 来分别生成更真实的表情和 head pose,以得到更真实的 3D 系数
- 使用更真实的 3D 系数来构建 3D-aware face render,得到更真实的 talking vedio
Talking Head 的模式:
- Talking head 有两种模式,一种是输入语音+图片,还有一种是输入文本+图片,输入文本+图片就需要一个 TextToSpeech 的部件来将文本转换为语音,整体来说 Talking head 就是用语音驱动每一帧图片的表情(眼睛、嘴巴等)和头部(head motion)运动,并重建人脸以生成视频
SadTalker 的主要部件如下,下图不是绝对严格的流程图,只是一个大概的图示例而已:
一、背景
使用语音来驱动一张静态的图片生成动态的视频一直是很有挑战的工作,但其又有很多应用场合,比如数字人的生成或语音会议等。
之前的一些方法主要是聚焦于生成唇部运动模式(lip motion),因为唇部动作和发音的关系是最紧密的,还有一些方法生成 head pose 的的动作。
上述的方法主要通过 landmark 和 latent warping 引入 2D motion fields。但是生成的 vedios 还是不够自然和真实,主要问题:
- preference pose [17, 51]
- month blur [30]
- identity modification [39, 40]
- distorted face [39, 40, 49]
想要生成一个看起来比较自然的 talking head vedio 还是面临着很多的挑战,主要是由于不同的发音会对应不同的动作,唇部动作(lip movement)和发音的关系是最大的,其次还有头部动作(head poses)和眨眼动作(eye blink)等。
所以,基于脸部 landmark 的方法会产生变形扭曲的脸部结果,因为没有将 head motion 和 expression 完全解耦开来。
本文中,作者的出发点在于,3D facial model 包含了高度解耦的表达,并且可以被用于单独学习每种 motion
本文提出的方法是:SadTalker:Stylized Audio-Driven Talking-head video generation system
具体做法:
- 将 3DMM(3D Morphable Models)的运动系数看做中间表达,将整个任务划分成两部分
- 第一部分:作者的主要目的是从语音中生成更加真实的运动系数(如 head pose、lip motion、eye blink),并且每个系数是单独学习的,这样会解耦来降低不确定性
- 表情:作者设计了一个 audio to express coefficient network
- head pose:使用了一个 conditional VAE 来建模多样且自然的 head motion
- 第二部分:生成了 3DMM 系数后,会做从原本的图片建立 3D 人脸,然后再生成最后的视频
训练的时候会分模型训练,在推理的时候是 end-to-end 的模式
二、方法
本文框架如图 2 所示,使用 3D motion coefficient 作为 talking head 生成的中间表达特征
- 首先,从原图中抽取 coefficients
- 然后,分别使用 ExpNet 和 PoseVAE 来生成真实的 3DMM motion coefficients
- 最后,使用 3D-aware face render 来生成 talking head vedio
2.1 3D Face Model
3D 信息对提升生成的 vedio 的真实性是很重要的,因为真实的 vedio 是在 3D 环境下采集的
之前的方法很少考虑到 3D 空间,因为从单个图片中获得 3D coefficient 是很困难的,且高质量的 face render 很难设计。
所以本文作者参考了从单张图来重建 3D 的方法 [5],且把预测出的三维模型 3D Morphable Models (3DMMs) 看做中间变量的表达
在 3DMM 中,3D face shape S 被解耦如下:
- S ˉ \bar{S} Sˉ 表示 3D face 的 average shape
- U i d U_{id} Uid 表示 LSFM morphable model 的 identity orthonormal basis
- U e x p U_{exp} Uexp 表示 LSFM morphable model 的 expression orthonormal basis
- α \alpha α 和 β \beta β 分别是 person identity 和 expression
motion 系数: β , r , t \beta, r, t β,r,t
- head pose: ρ = [ r , t ] \rho=[r,t] ρ=[r,t],r 和 t 分别表示 head rotation 和 translation
- expression coefficients: β \beta β
2.2 motion 系数如何通过声音来生成
motion 系数包含两部分:head pose 和 expression
- head pose:是 global motion
- expression:是相对 local 的
所以,如果一起学习这些参数的话,会引入很多的不确定性,因为 head pose 其实和声音的关系比较弱,lip motion 和声音的关系比较强
- head pose:使用 PoseVAE 来生成运动系数
- expression:使用 ExpNet 来生成运动系数
1、ExpNet:
学习一个通用的模型来从声音来产生 expression coefficient 是比较难的,主要原因有两个:
- audio-to-expression 对于不同的个体来说不是一对一的映射任务
- 在 expression(表情)中,有很多和 audio 不相关的动作,也会影响预测的准确性
- ExpNet 的提出就是为了降低这些不确定性
ExpNet 是怎么做的:
- 通过第一帧的 expression coefficient β 0 \beta_0 β0 来将 expression motion 和 specific person 进行关联
- 为了降低在说话过程中其他面部部位的影响,作者只使用 lip motion coefficient 作为 target coefficient。
- 其他不是很重要的面部动作(如眨眼)会使用额外的 landmark loss 来训练
如图 3 所示:
- 作者从 audio window a { 1 , . . . , t } a_{\{1,...,t\}} a{1,...,t} 中生成 t 帧 expression coefficient,每帧的 audio 特征是 0.2s mel-spectrogram
- 首先,使用audio encoder(ResNet-based, P h i A Phi_A PhiA)将 audio feature 编码到隐空间
- 然后,使用一个线性层(mapping, P h i M Phi_M PhiM)来解码出 expression coefficient,同时会在 Mapping 中引入 β 0 \beta_0 β0 来降低不确定性,此外还会引入一个眨眼睛控制信号 z b l i n k ∈ [ 0 , 1 ] z_{blink} \in [0,1] zblink∈[0,1] 和对应的 eye landmark loss 来生成控制眨眼睛的信号
整个 ExpNet 的结构可以写成如下的形式:
loss 函数:
- 首先,使用 L d i s t i l l L_{distill} Ldistill 来衡量 lip expression coefficient R e R_e Re 和生成的 β { 1 , . . . , t } \beta_{\{1,...,t\}} β{1,...,t} 的不同。这里的 R e R_e Re 是将第一帧 I 0 I_0 I0 和 audio window a { 1 , . . . , t } a_{\{1,...,t\}} a{1,...,t} 输入锁住的 wav2lip 中得到的,这样主要是为了降低 pose 变化和面部其他部位带来的影响
- 然后,还使用了 differentiable 3D face render R d R_d Rd 来计算额外的 loss,如图 3 ,计算 landmark loss 来衡量 eye blink 和整个面部的准确性,同时,还使用了一个训练好的 lip reading network
2、PoseVAE
如图 4 所示,这里使用了一个 VAE based 模型来学习更真实的 head movement ρ ∈ R 6 \rho \in R^6 ρ∈R6
训练时, pose VAE 在固定 n 帧上使用 encoder-decoder 的结构进行训练
encoder 和 decoder 都是两层 MLP 结构,输入包含连续 t 帧 head pose ,且假设其服从高斯分布。
decoder 中,网络学习的目标是从分布中通过采样来生成 t 帧 pose ,但不是直接生成 pose,而是学习和第一帧 pose ρ 0 \rho_0 ρ0 的残差,这样能保证生成的 pose 更连续、稳定、一致,所以也叫 conditional VAE,这里的 conditional 就是第一帧的 head pose。
此外,还将每个声音的特征 a { 1 , . . . , t } a_{\{1,...,t\}} a{1,...,t} 和 style identity Z s t y l e Z_{style} Zstyle 作为条件来作为 identity style。
KL 散度用于衡量生成的 motion
MSE 和 GAN loss 用于保证生成的质量
2.3 3D-aware Face Render
生成了 3D motion coefficient 后,需要通过面部渲染来得到最后的 3D-aware image animator
作者受启发于 face-vid2vid[42],这个方法能够实现从单张图中学习隐含的 3D 信息。
可以使用 3DMM coefficient 来驱动 face render,如图 5 所示
所以,本文在此处提出了 mappingNet 来学习 3DMM motion coefficient (head pose 和 expression)和隐式无监督 3D keypoints 的关系。
训练分为两步:
- 第一步:如原始论文中那样使用自监督模式来训练 face-vid2vid
- 第二步:冻结训练好的 appearance encoder,canonical keypoints estimator,image generator 进行 tuning。然后,以重建的方式在 gt 视频的 3DMM 系数上训练 mapping net。使用 L1 损失和最终生成的视频按照其原始实现在无监督关键点领域进行监督。
三、效果
3.1 数据集
训练数据集:
- 使用 VoxCeleb 数据集来训练,包括超过 10w 的 vedios(1251 subjects)
- 对输入视频 resize 到 256x256,预处理后,会用于训练 FaceRender。由于 VoxCeleb 中的一些视频和音频是没有对齐的,所以作者选了 1890 个对齐的视频和音频(46 subjects)来训练 PoseVAE 和 ExpNet,输入的音频被下采样到 16kHz,并且处理的和 Wav2lip 的方式一样
测试数据集:
- 从 HDTF 中选择了 346 个视频的前 8s 的视频(共约 7w 帧)
- 视频也同样被 resize 为 256x256,也是使用每个视频的第一帧作为参考图像来生成视频
3.2 训练细节
训练:
- ExpNet, PoseVAE 和 FaceRender 都是分开训练的,都使用的 Adam 优化器,学习率分别为 2 e − 5 2e^{-5} 2e−5、 1 e − 4 1e^{-4} 1e−4、 2 e − 4 2e^{-4} 2e−4
- 3DMM 参数是从训练好的 3D 人脸重建方法 [5] 中得到的
- ExpNet:使用连续的 5 帧来学习
- PoseVAE:使用连续 32 帧来学习
- FaceRender:使用 5 个连续帧的系数来一帧一帧生成的
推理:端到端的推理
3.3 测评指标
- FID: Frechet Inception Distance,衡量生成帧的写实性
- CPBD: cumulative probability blur detection,衡量生成帧的分辨率
- CSIM:cosine similarity,衡量对每个个体特点的保留度,也就是对比 source image 和 生成的帧的相似性,使用的 ArcFace 提取每个图片的 embedding 来计算余弦相似度来衡量
- LSE-D(distance score) 和 LSE-C(confidence score):,衡量 lip 同步性和 mouth shape,主要是从 wav2lip 得到的 mouth shape 的不同
- head motions:使用 Hopenet 计算得到的生成帧的 head motion embedding 的标准差
- Beat Align Score:用于计算音频和生成的 head motion 的对齐
3.4 和 SOTA 的对比
和多种不同的方法类别进行了对比:
- talking head video generation SOTA:MakeItTalk、Audio2Head、
- audio to expression generations:Wav2Lip、PC-AVS
如表 1 所示,本文提出的方法在视频质量、头部动作多样性上都表现的更好,且在 lip synchronization(唇部同步性)上和其他 talking head generation methods 都有相当的效果
如图 6 所示,作者在视觉上展示了唇部同步性的效果,本文的方法在视觉观察上和真值的同步性最好,Wav2Lip 的下半张脸被模糊了,PC-AVS 和 Audio2Head 能艰难的维持面部个体特征,且 Audio2Head 只会产生正面的脸,MakeItTalk 和 Audio2Head 由于使用的 2D warping 所以脸部会扭曲。
作者还做了一个 user studies 来让 20 位人员来对不同方法生成的 20 个视频进行评选,让这些人员根据视频锐度、唇部同步性、头部动作多样性和自然性、整体的质量来对这些视频进行评分,38% 的人认为本文的方法的唇部同步性比其他方法好
3.5 消融实验
1、ExpNet 的消融实验
如图 7 和表 3 所示,联合学习 motion coefficient 很难生成看起来真实的 talking head vedios
2、PoseVAE 的消融实验
3、FaceRender 的消融实验
3.6 局限性
尽管本文方法能够使用单个图像和语音来生成较为真实的视频,但也有一些局限性
由于 3DMM 不能建模眼睛和牙齿的变化,所以 FaceRender 中的 mappingNet 不能合成看起来真实的牙齿,但这个局限性可以通过 blind face restoration networks[43] 来提升,如图 10 所示
另外一个局限性是本文的方法只考虑了 lip motion 和 eye blinking,没有考虑其他面部表情,如情绪和眼神看的方向,所以生成的视频的人物的表情是固定的,会降低一定的真实性