EMO:语音驱动的肖像动画生成技术详解
EMO:语音驱动的肖像动画生成技术详解
在AI技术快速发展的今天,语音驱动的肖像动画生成技术正逐渐成为研究热点。其中,EMO(Emote Portrait Alive)以其卓越的效果和创新的技术原理脱颖而出。本文将详细介绍EMO的技术原理、实现方法和训练策略,并与现有的其他方法进行比较。
0、概述
EMO是一种音频驱动的肖像视频生成方法,不需要借助3D模型、面部landmark等,就可以保证整个视频中帧间的无缝过渡和ID信息的一致性。
输入:是单个参考图像,和一段语音,可以是说话、或者唱歌;
输出:表情丰富、且有各种头部姿势的肖像视频,还可以根据输入音频的长度生成任意持续时间的视频。
这里简单提一下关于音频驱动的头像生成的最近工作总结:
音频驱动的头像生成可以大致分为两种方法:基于视频的方法(video-based)和基于单图像的方法(single-image)。
基于视频的方法,对输入视频片段进行直接编辑。例如,Wav2Lip,使用音频-唇形同步鉴别器,根据音频重新生成视频中的唇形运动。它的局限性在于依赖于基础视频,导致头部运动固定并且仅产生嘴巴运动,这会限制真实感。
对于单图像方法,参考照片用于生成反映照片外观的视频。Vividtalk提出通过学习混合形状和头部姿势来独立生成头部运动和面部表情。然后使用它们创建3D facial mesh,作为中间表示来指导最终视频帧的生成。类似地,Sadtalker采用3D Morphable Model (3DMM)作为生成头部说话视频的中间表示。这些方法的一个常见问题是3D mesh的表示能力有限,这限制了生成视频的整体表现力和真实感。此外,这两种方法都基于非扩散模型,这进一步限制了生成结果的性能。Dreamtalk尝试使用扩散模型,但它没有直接应用于图像帧,而是使用它们来生成3DMM的系数。与前两种方法相比,Dreamtalk在结果上有所改进,但仍无法实现高度自然的面部视频生成。
下面看看EMO的具体实现原理吧,为什么它如此逼真?
1、原理
1.1 整体结构
这次先来放上EMO的整体框架图,方便对照查看。
1)temporal module:为了确保生成帧之间的连续性;
2)ReferenceNet:为了保持ID一致性,它输入参考图像以获得参考特征。
- audio layer:对语音特征进行编码,驱动角色说话。
4)face locator 和 speed layer,提供weak control,为了使运动可控且稳定。
1.2 Backbone
注意,Backbone依然采用类似UNet的结构,但是没有用prompt embedding,而是用的referencenet提取到的feature。
1.3 Audio layers
1)从预训练 wav2vec 的各个block中获取音频序列的特征;
2)将这些特征concate起来,生成第帧的audio embedding;
3)将第帧前后各帧的audio embedding concat 起来作为最终的audio embedding,因为考虑到动作可能会受到未来/过去音频片段的影响,例如说话前张嘴和吸气。
该audio embedding作为 audio-attention的输入。
1.4 ReferenceNet
从self-attention layer 获取参考图片的特征reference feature maps
1.5 Temporal Modules
借鉴AnimateDiff,把输入的feature map reshape成
为了生成不限长度的视频,借鉴之前的方法--采用前一剪辑末尾的帧作为后续生成的初始帧,这里实际是合并了最后 n 帧,把它称为先前生成的片段中的“运动帧”,以增强跨剪辑的一致性。
具体来说,这 n 个运动帧被输入到 ReferenceNet 中以提取多分辨率的motion feature map。在去噪过程中,将时间层输入与相同分辨率的motion feature map合并。
对于第一个视频片段,运动帧初始化为0。
注意,目标图像和运动帧仅concat一次并输入到 ReferenceNet 中,提取的特征在整个去噪过程中被重复使用,确保inference的计算时间不会大幅增加。
1.6 Face Locator and Speed Layers
ID一致性、帧间连续性已经解决,但是motion的一致性和稳定性还未解决,因为它们目前都是独立生成的。
Face Locator--在哪生成面部
前面提到,以前的3D模型的方法或者skeleton的方法,其自由度有限,并且在训练阶段打标不充分,使用这些控制信号可能不能很好地创建生动的面部表情和动作。
此外,其无法考虑个体的细微差别,相同的控制信号在不同角色之间也会有差异。
这里选择“弱”控制信号方法(weak control)。
1)从face box来获取一个mask;
2)Face Locator(一个由一系列卷积构成的轻量编码器)对mask进行编码;
3)该编码结果与latent noise相加,一起送入UNet。
由于M是整个视频片段的联合区域,表示允许面部在一个相当大的区域内运动,从而保证头部不限于静态姿势。
接下来,就是如何控制头部运动频率。
Speed Layers--头部运动速度
用一个参数来控制第帧头部运动速度。
将速度范围划分为个离散速度桶,每个速度桶代表不同的速度级别。每个桶都有一个中心值和一个半径。
可以表示为向量,其中。
采用与audio layer中的方法,每帧的头部运动速度embedding由前后各帧的embedding concat得到,即,并且
随后通过 MLP 来获取speed feature。
在temporal layer内,为了计算时shape的一致,repeat 为,并实现一种交叉注意力机制。
2、训练策略
2.1 训练方法
分为三个阶段。
第一阶段是图像预训练,包括 Backbone Network、ReferenceNet 和 Face Locator 。
在此阶段,Backbone 输入时单个帧,而 ReferenceNet 是从同一个视频片段中随机选择的与前面不同的一帧。
Backbone 和 ReferenceNet 都从原始 SD 初始化权重。
在第二阶段,引入视频训练,结合了temporal modules 和 audio layers,从video中采样n+f个连续帧,开始的n帧是运动帧。
temporal modules从 AnimateDiff 初始化权重。
第三阶段,加入speed layers,在这个阶段只训练temporal modules和speed layers。省略音audio layers, 因为说话人物的表情、嘴部动作和头部运动的频率主要受音频影响。因此,这些元素之间似乎存在相关性,可能会提示模型根据速度信号而不是音频来驱动角色的运动。而且实验结果表明,speed layers和audio layers的同时训练会破坏音频对角色运动的驱动能力
2.2 训练数据
数据集:
1)从互联网上收集了大约 250 小时的talking head 视频,
2)公开数据集 HDTF 和 VFHQ 。 由于 VFHQ 数据集缺乏音频,因此仅在第一个训练阶段使用。
打标:
用 MediaPipe 人脸检测框架来获取面部bounding box。
通过使用面部landmark提取每帧的 6-DoF 头部姿势来标记头部运动速度,然后计算连续帧之间的旋转度。
2.3 训练参数
裁剪为 512 × 512。
在第一个训练阶段,batch_size=48.
在第二和第三阶段,设置f = 12作为生成的视频长度,运动帧数设置为。
所有阶段的学习率均设置为1e-5。
在推理过程中,DDIM的采样算法,steps=40,耗时约为 15 秒(f = 12 帧)。
3、局限
1)更耗时。
2)由于没有使用任何明确的控制信号来控制角色的运动,因此可能会导致无意中生成其他身体部位(例如手),从而导致视频中出现伪影。该问题的一个潜在解决方案是采用专门针对身体部位的控制信号。