Paper | Project Page | Code | Demo
Tri-Plane Hash Representation 用于维持主体身份
Face-Sync Controller 用于将嘴唇运动和语音对齐,并创新性地使用 3D 面部混合形状模型(3D facial blendshape model)来捕捉准确的面部表情
Head-Sync Stabilizer 优化头部姿态,实现更自然的头部动作
Portrait-Sync Generator 可恢复头发细节,并将生成的头部和躯干融合,获得无缝的视觉体验
0. Introduction
现有方法普遍面临的一个基本挑战是需要实现同步。
- 传统居于GAN的方法虽然擅长建模说话人的嘴唇运动,但通常会在不同帧之间产生不一致的身份,从而导致牙齿尺寸不同和嘴唇厚度波动等问题。
- 基于神经辐射场的新兴方法在保持身份一致性和保留面部细节方面表现出色,但存在嘴唇运动不匹配、面部表情控制困难和头部姿势不稳定问题,从而降低了视频的整体真实感。
本文的主要贡献如下:
- 提出了一种面部同步控制器(Face-Sync Controller),该控制器将视听编码器(Audio-Visual Encoder)与面部动画捕捉器(Facial Animation Capturer)结合使用,确保准确的口唇同步和动态面部表情渲染;
- 引入了头部同步稳定器(Head-Sync Stabilizer),可以跟踪头部旋转和面部运动关键点。该稳定器采用束调节方法,保证头部运动的平滑和同步;
- 设计了一个肖像同步生成器(Portrait-Sync Generator),通过修复 NeRF 建模中的伪影并细化高分辨率视频中的头发和背景等复杂细节来提高视觉保真度。
SyncTalk 概述。 给定一个说话头部的裁剪参考视频和相应的语音,SyncTalk 可以通过两个同步模块 (a) 和 (b) 提取唇部特征
f
l
f_l
fl、表情特征
f
e
f_e
fe 和头部姿势
(
R
,
T
)
(R, T)
(R,T)。 然后,三平面哈希表示对头部进行建模,输出粗略的语音驱动视频。肖像同步生成器进一步恢复头发和背景等细节,最终生成高分辨率的头部说话视频
1. 面部同步控制器(Face-Sync Controller)
1.1 音视频编码器(Audio-Visual Encoder)
使用预训练的唇部同步判别器(Out of time: automated lip sync in the wild),它可以为视频的嘴唇同步效果提供confidence数值。判别器的输入为:
- F —— 连续的面部窗口
- A —— 对应的音频帧
当F和A完全重叠为正样本(y=1),否则为负样本(y=0)
判别器计算这些序列之间的余弦相似度:
s
i
m
(
F
,
A
)
=
(
F
⋅
A
∣
∣
F
∣
∣
2
∣
∣
A
∣
∣
2
)
sim(F, A) = ( \frac{{F \cdot A}}{{||F||_2 ||A||_2}} )
sim(F,A)=(∣∣F∣∣2∣∣A∣∣2F⋅A)通过使用以下二元交叉熵损失函数(Binary Cross-Entropy Loss,简称BCE)来最小化同步样本距离并最大化非同步样本距离:
L
s
y
n
c
=
−
(
y
log
(
sim
(
F
,
A
)
)
+
(
1
−
y
)
log
(
1
−
sim
(
F
,
A
)
)
)
L_{sync}= - \left( y \log(\text{sim}(F, A)) + (1 - y) \log(1 - \text{sim}(F, A)) \right)
Lsync=−(ylog(sim(F,A))+(1−y)log(1−sim(F,A)))在口唇同步鉴别器的监督下,接下来训练一个与唇形运动相关的高度同步的音频视觉特征提取器。首先用卷积网络获取音频特征Conv(A)和面部特征Conv(F),这些特征将concat起来。在解码阶段,使用堆叠卷积层 Dec(Conv(A)⊕Conv(F)) 来恢复面部帧。
L
1
L_1
L1重建损失如下:
L
r
e
c
o
n
=
∥
F
−
D
e
c
(
C
o
n
v
(
A
)
⊕
C
o
n
v
(
F
)
)
∥
1
.
L_{recon} = \| F - Dec(Conv(A) \oplus Conv(F))\|_1.
Lrecon=∥F−Dec(Conv(A)⊕Conv(F))∥1.通过使用嘴唇运动鉴别器对同步和非同步片段进行采样,并采用上式
L
s
y
n
c
L_{sync}
Lsync 损失。通过最小化两个损失,训练一个与音频相关的面部生成网络。
训练后,我们使用 Conv(A) 作为从音频中提取的唇部空间。 最终,我们获得了与嘴唇运动相关的高度同步的视听编码器。
1.2 面部动画捕捉器(Facial Animation Capturer)
之前基于NeRF的方法只能改变眨眼,不能准确模拟面部表情。为了实现更加同步和真实的面部表情,本文提出表情同步控制模块,具体来说,使用52个语义面部混合形状系数B来对面部进行建模,如下图所示:
由于3D人脸模型能够保留人脸运动的结构信息,因此能够很好地反映人脸运动的内容,而不会造成人脸结构扭曲。训练时首先使用复杂的面部混合形状捕获模块捕获面部表情为
E
(
B
)
E(B)
E(B),并选择七个核心面部表情控制系数来控制眉毛、额头和眼睛区域。它们与表情高度相关,与嘴唇运动无关。
1.3 面部感知掩码注意力(Facial-Aware Masked-Attention)
为了减少训练过程中嘴唇特征和表情特征之间的相互干扰,本文引入了 Facial-Aware Disentangle Attention 模块。基于区域注意力向量 V ,我们分别将掩模
M
l
i
p
M_{lip}
Mlip 和
M
e
x
p
M_{exp}
Mexp 添加到嘴唇和表情的注意力区域。具体来说,新的注意力机制由以下公式给出:
V
l
i
p
=
V
⊙
M
l
i
p
,
V_{lip} = V \odot M_{lip} ,
Vlip=V⊙Mlip,
V
e
x
p
=
V
⊙
M
e
x
p
.
V_{exp} = V \odot M_{exp} .
Vexp=V⊙Mexp.该方式使得注意力机制仅关注各自部分,从而实现各部分解耦。如果不进行以上操作,嘴唇运动可能引起眨眼倾向并影响头发体素。通过引入掩码模块,注意力机制可以集中在表情或嘴唇,而不影响其他区域,从而减少耦合带来的伪影。最终得到解耦的嘴唇特征
f
l
=
f
l
i
p
⊙
V
l
i
p
f_l = f_{lip} \odot V_{lip}
fl=flip⊙Vlip 和表情特征
f
e
=
f
e
x
p
⊙
V
e
x
p
f_e = f_{exp} \odot V_{exp}
fe=fexp⊙Vexp 。
2. 头部同步稳定器(Head-Sync Stabilizer)
2.1 头部动作追踪器(Head Motion Tracker)
头部姿势表示为p,指人的头部在3D空间中的旋转角度,由旋转矩阵 R 和平移向量 T 组成。不稳定的头部姿势会导致头部抖动。为了获取头部姿势的粗略估计,首先,在预定范围内进行
i
i
i 次迭代确定最佳焦距。对于每个候选焦距
f
i
f_i
fi ,重新初始化旋转和平移参数。目标是最小化 3DMM 投影地标和视频帧中的实际地标的误差。最佳焦距
f
o
p
t
f_{opt}
fopt 由下式给出:
f
o
p
t
=
arg
min
f
i
E
i
(
L
2
D
,
L
3
D
(
f
i
,
R
i
,
T
i
)
)
,
f_{opt} = \arg \min_{f_i} E_i(L_{2D}, L_{3D}(f_i, R_i, T_i)),
fopt=argfiminEi(L2D,L3D(fi,Ri,Ti)),其中
E
i
E_i
Ei 表示这些地标之间的均方误差MSE,
L
3
D
(
f
i
,
R
i
,
T
i
)
)
L_{3D}(f_i, R_i, T_i))
L3D(fi,Ri,Ti)) 是给定焦距
f
i
f_i
fi 和相应旋转和平移参数
R
i
{R_i}
Ri 和
T
i
{T_i}
Ti 下3DMM的投影地标,
L
2
D
L_{2D}
L2D 是视频帧中实际地标(通过face_alignment提取)。随后利用最佳焦距
f
o
p
t
f_{opt}
fopt 细化所有帧的旋转 R 和平移 T 参数,以更好地将模型投影地标和实际地标对齐。细化过程的数学公式表示为:
(
R
o
p
t
,
T
o
p
t
)
=
arg min
R
,
T
E
(
L
2
D
,
L
3
D
(
f
o
p
t
,
R
,
T
)
)
,
(R_{opt}, T_{opt}) = \text{arg min}_{R,T} E(L_{2D}, L_{3D}(f_{opt}, R, T)),
(Ropt,Topt)=arg minR,TE(L2D,L3D(fopt,R,T)),其中 E 表示最佳焦距
f
o
p
t
f_{opt}
fopt 的3D投影地标
L
3
D
L_{3D}
L3D 和实际2D地标
L
2
D
L_{2D}
L2D 之间的MSE度量。优化的旋转参数
R
o
p
t
R_{opt}
Ropt 和平移参数
T
o
p
t
T_{opt}
Topt 是通过最小化所有帧上的MSE误差得到的。
2.2 头部点追踪器(Head Points Tracker)
由于基于NeRF的方法及其对输入头部旋转 R 和平移 T 的要求,之前的方法利用3DMM技术来提取头部姿势,但会生成不准确的结果。为了提高 R 和 T 的精度,本文使用 CoTracker 的光流估计模型来跟踪面部关键点 K。
具体而言,先使用预训练的光流估计模型,获得面部运动光流后,使用拉普拉斯滤波器来选择最显着流量变化所在的关键点,并跟踪这些关键点在流量序列中的运动轨迹。 通过该模块,我们的方法确保所有帧上的面部关键点对齐更加精确和一致,从而提高头部姿势参数的准确性。
2.3 束调整(Bundle Adjustment)
给定关键点和粗略的头部姿势,我们引入一个两阶段的优化框架来提高关键点和头部姿态估计的准确性。第一阶段先随机初始化关键点的3D坐标,并优化他们的位置以对齐图像平面上跟踪的关键点。该过程涉及最小化损失函数
L
i
n
i
t
L_{init}
Linit,该函数捕获投影关键点P和跟踪关键点K之间的差异,如下式所示:
L
init
=
∑
j
∥
P
j
−
K
j
∥
2
.
L_{\text{init}} = \sum_j \|P_j - K_j\|_2.
Linit=j∑∥Pj−Kj∥2.随后,在第二阶段,开始进行更全面的优化,以细化3D关键点和相关的头部联合姿势参数。通过Adam优化器,调整空间坐标、旋转角度 R 和平移 T 以最小化对齐误差
L
s
e
c
L_{sec}
Lsec :
L
sec
=
∑
j
∥
P
j
(
R
,
T
)
−
K
j
∥
2
L_{\text{sec}} = \sum_j \left\| P_j(R, T) - K_j \right\|_2
Lsec=j∑∥Pj(R,T)−Kj∥2经过优化后,观察到所得的头部姿势和平移参数平滑且稳定。
3. 动态肖像渲染器(Dynamic Portrait Renderer)
3.1 三平面哈希表示(Tri-Plane Hash Representation)
NeRF通过输入3D空间位置
x
=
(
x
,
y
,
z
)
\mathrm{x}=(x, y, z)
x=(x,y,z) 和观看方向
d
=
(
θ
,
ϕ
)
\mathrm{d}=(\theta, \phi)
d=(θ,ϕ),经过MLP网络输出辐射亮度(颜色)
c
=
(
r
,
g
,
b
)
\mathrm{c}=(r, g, b)
c=(r,g,b) 和密度
σ
\sigma
σ 。预测的像素颜色,用
C
^
(
r
)
\hat{C}(\mathrm{r})
C^(r) 表示,与源自相机核心位置 o 的射线
r
(
t
)
=
o
+
t
d
\mathrm{r}(t)=\mathrm{o}+t\mathrm{~d}
r(t)=o+t d 一起通过以下公式导出:
C
^
(
r
)
=
∫
t
n
t
f
σ
(
r
(
t
)
)
⋅
c
(
r
(
t
)
,
d
)
⋅
T
(
t
)
d
t
\hat{C}(\mathrm{r})=\int_{t_n}^{t_f} \sigma(\mathrm{r}(t)) \cdot \mathrm{c}(\mathrm{r}(t) , \mathrm{d}) \cdot T(t) d t
C^(r)=∫tntfσ(r(t))⋅c(r(t),d)⋅T(t)dt其中
t
n
t_n
tn 和
t
f
t_f
tf 是近边界和远边界,
T
(
t
)
T(t)
T(t) 是累积透射率。为了解决哈希冲突和优化音频特征处理的挑战,结合了三个相互正交的2D哈希网格(参考 ER-NeRF)。由
x
=
(
x
,
y
,
z
)
∈
R
X
Y
Z
\mathrm{x}=(x, y, z) \in \mathbb{R}^{\mathrm{XYZ}}
x=(x,y,z)∈RXYZ 给出坐标,通过三个单独的2D多分辨率哈希编码器对其投影值进行编码转换,公式1:
H
A
B
:
(
a
,
b
)
→
f
a
b
A
B
\mathcal{H}^{\mathrm{AB}}:(a, b) \rightarrow \mathrm{f}_{a b}^{\mathrm{AB}}
HAB:(a,b)→fabAB其中,输出为
f
a
b
A
B
∈
R
L
D
\mathrm{f}_{a b}^{\mathrm{AB}} \in \mathbb{R}^{L D}
fabAB∈RLD,L是分辨率级数,D是每个哈希表条目的特征维度,输出的特征表示与投影坐标 (a,b) 相对应的平面几何特征,
H
A
B
\mathcal{H}^{\mathrm{AB}}
HAB 表示平面
R
A
B
\mathbb{R}^{\mathrm{AB}}
RAB 的多分辨率哈希编码器。通过融合结果,得到最终的几何特征
f
g
∈
R
3
×
L
D
\mathrm{f} g \in \mathbb{R}^{3 \times L D}
fg∈R3×LD 如下:
f
x
=
H
X
Y
(
x
,
y
)
⊕
H
Y
Z
(
y
,
z
)
⊕
H
X
Z
(
x
,
z
)
\mathrm{f}_{\mathrm{x}}=\mathcal{H}^{\mathrm{XY}}(x, y) \oplus \mathcal{H}^{\mathrm{YZ}}(y, z) \oplus \mathcal{H}^{\mathrm{XZ}}(x, z)
fx=HXY(x,y)⊕HYZ(y,z)⊕HXZ(x,z)其中特征的连接用符号
⊕
\oplus
⊕ 表示,得到
3
×
L
D
3 \times L D
3×LD 通道的向量。应用
f
x
\mathrm{f}_{\mathrm{x}}
fx ,视角方向
d
\mathrm{d}
d,嘴唇特征
f
l
f_l
fl 和表情特征
f
e
f_e
fe,三平面哈希编码的隐式函数定义为:
F
H
:
(
x
,
d
,
f
l
,
f
e
;
H
3
)
→
(
c
,
σ
)
,
\mathcal{F}^{\mathcal{H}}:\left(\mathrm{x}, \mathrm{d}, f_l, f_e ; \mathcal{H}^3\right) \rightarrow(\mathrm{c}, \sigma),
FH:(x,d,fl,fe;H3)→(c,σ),其中
H
3
\mathcal{H}^3
H3 合并了平面哈希编码器的三元组,如公式1所示。
训练阶段采用两阶段从粗到细的策略,首先使用MSE损失来评估预测的
C
^
(
r
)
\hat{C}(\mathrm{r})
C^(r) 和实际图像颜色
C
(
r
)
C(\mathrm{r})
C(r) 。由于MSE在细节捕捉方面的局限性,在细化阶段通过结合 LPIPS 损失来增强细节,与 ER-NeRF 类似。本文在图像中随机选取图像块
P
\mathcal{P}
P,将 LPIPS(由
λ
\lambda
λ 加权)与 MSE 相结合以改进细节表示,如下所示:
L
total
=
∑
r
∥
C
(
r
)
−
C
^
(
r
)
∥
2
+
λ
×
L
L
P
I
P
S
(
P
^
,
P
)
\mathcal{L}_{\text {total }}=\sum_{\mathrm{r}}\|C(\mathrm{r})-\hat{C}(\mathrm{r})\|_2+\lambda \times \mathcal{L}_{\mathrm{LPIPS}}(\hat{\mathcal{P}}, \mathcal{P})
Ltotal =r∑∥C(r)−C^(r)∥2+λ×LLPIPS(P^,P)
3.2 Portrait-Sync Generator(肖像同步生成器)
训练过程中,为了解决 NeRF 在捕捉发丝和动态背景等精细细节方面的局限性,本文引入了具有两个部分的肖像同步生成器。首先,NeRF 渲染面部区域 ( F r ) (F_r) (Fr),通过高斯模糊创建 G ( F r ) G(F_r) G(Fr),然后使用之前获取的同步头部姿势与原图 ( F o ) (F_o) (Fo) 合并来增强头发细节保真度。第二,当头部和躯干组合时,如果原视频中的人物在说话而生成的人脸保持沉默,则可能会出现暗间隙区域,如下图所示。本文使用平均颈部颜色 ( C n ) (Cn) (Cn) 填充这些区域。本方法通过肖像同步生成器产生更真实的细节并提高视觉质量。
代码如下:
pred = blend_with_mask_cuda(preds[0], data["bg_gt_images"].squeeze(0),data["bg_face_mask"].squeeze(0))
def blend_with_mask_cuda(src, dst, mask):
src = src.permute(2, 0, 1)
dst = dst.permute(2, 0, 1)
mask = mask.unsqueeze(0)
# Blending
# 源图像和遮罩的元素进行相乘,目标图像和遮罩的补(1-mask)进行相乘,然后将两个结果相加,得到混合图像。
blended = src * mask + dst * (1 - mask)
# Convert back to numpy and return
return blended.permute(1, 2, 0).detach().cpu().numpy()
4. 实验
头部重建的定性结果
与不同人脸生成方法的定性比较
自测效果:
【SyncTalk 数字人效果展示】
https://www.bilibili.com/video/BV1m1421X7NG/?share_source=copy_web&vd_source=b8636452a9812f2d54dc5ead2cab99df