Capture, Learning, and Synthesisof 3D Speaking Styles论文阅读笔记
摘要
- 制作了一个4D面部(3D mesh 序列 + 同步语音)数据集:29分钟,60fps,12个人
- 在该数据集上训练了一个神经网络(这句话原话是we then train a neural network on our dataset that factors identity from facial motion,不知道怎么理解)
- 学习的模型VOCA,输入为任意语音信号(不局限为英文),可逼真的还原面部动画
- 可加入额外的条件进行训练,来学习不同的说话风格(有的人嘴张的大,有的人嘴张的小)
- 可通过动画师控制来改变说话风格、身份相关的面部形状、姿态(点头摇头、眼球转动等)
- VOCA可轻易的应用到新的目标上(without retargeting)
1 introduction
挑战
- 语音和面部运动非常相关,但又处在两个差异非常大的空间中;因此需要非线性回归来将二者关联起来,我们可以通过DNN来解决这个问题,但是需要大量的训练数据;
- 音素phoneme和和面部运动之间是多到多映射。
- 真人动画容易产生恐怖谷效应
- 缺少语音到3D人脸的多人数据库
- 之前的工作表明可以训练特定说话人动画的模型,目前还没有说话人无关的、捕捉不同说话风格的通用方法。
VOCASET
12个说话人,480段序列,每段大概3-4s,句子的分布尽可能最大化语音多样性,60fps
将扫描数据和一个人脸模板mesh对齐
VOCA
说话人无关
整合DeepSpeech来提取语音特征(对噪声和音源更鲁邦);
基于FLAME模型,1)可以建模全脸的运动(包括脖子);2)驱动大范围的成人人脸,FLAME可以通过扫描或图片来重建特定目标的模板;3)编辑身份相关的形状和姿态
2 依赖
DeepSpeech
DeepSpeech是一个端到端的ASR模型,前三层是非循环全连接层+ReLU,第四层是双向RNN,最后一层是全连接层+ReLU,最后通过softmax函数。Tensorflow的实现方式和原文有两点不同:用LSTM替代了RNN,用MFCC替代原本的声谱。
FLAME
不同目标的面部形状和头部运动差异很大,不同人的说话方式也不同。
FLAME使用线性变换来描述身份、表情相关的形变、LBS(linear blend skinning,实现脖子、下巴、眼球的运动)。给定一个静态模型,身份、姿态、表情blendshapes的变化都通过顶点移动来建模。
3 VOCA
overview
输入为特定目标的模板T和原始的语音信号,通过DeepSpeech提取语音特征
输出为目标的3D mesh
采取encoder-decoder网络结构,encoder部分将语音特征转换为低维embedding,decoder部分将这个embedding映射到高位的3D顶点位移空间。
语音特征提取
给定一段长度为T 秒的语音片段,使用DeepSpeech来提取语音特征。输出特征是未归一化的对数概率(某字母的概率),帧长度为0.02s(每秒50帧),因此输出是50T*D的数组,其中D是字母表中字母的个数+1(空白label)。通过线性插值将输出重采样到60fps。
为了合并时间信息,将语音帧转换为总长度为W*D的重叠窗口,每个窗口长度为W。输出是一个3D数组,每个数组长度为60T*W*D。
Encoder
encoder由4个卷积层和2个全连接层构成。语音特征和最后的卷积层取决于目标的label,在多个目标上训练从而学习到特定目标的风格。对8个训练目标,每个目标j编码为一个one-hot向量
I
j
=
(
δ
i
j
)
1
≤
i
≤
8
I_j=(\delta_{ij})_{1\le i\le 8}
Ij=(δij)1≤i≤8。该向量和每个D维语音特征向量进行级联(每个窗口输出长度W*(D+8)),并和最后一个卷积层的输出进行级联。
为了学习时间特征,减少输入维度,每个卷积层使用3x1的卷积核,步长为2x1。由于使用DeepSpeech提取的特征不含有任何空域相关性,我们对输入窗口进行reshape,使其维度为
W
∗
1
∗
(
D
+
8
)
W*1*(D+8)
W∗1∗(D+8),并在时间维度上进行1D卷积。为了避免过拟合,我们对参数量进行控制,对前两层学习32个滤波器,对后两层学习64个滤波器。
最后的卷积层和目标编码级联后,有两个全连接层,第一个全连接层有128个units,激活函数为tanh,第二个全连接层有50个units,激活函数为线性。
Decoder
decoder为一个全连接层+线性激活函数,输出为5023*3的数组,表示模型顶点的位移。
权重初始化:训练数据的顶点位移做PCA,得到的50个主成分。
bias初始化:0
animation control
inference时,改变8维one-hot向量来调整说话风格。VOCA的输出是一个和FLAME人脸模型具有相同拓扑结构的expressed 3D face。VOCA和FLAME的兼容性允许通过添加blendshapes来改变身份相关的人脸形状,人脸的表情和姿态也可以通过FLAME提供的blendshapes、joints和pose blendshapes来改变。
4 模型训练
训练准备
语音-4D扫描pairs,表示为
{
(
x
i
,
y
i
)
}
i
=
1
F
\{(x_i,y_i) \}_{i=1}^F
{(xi,yi)}i=1F
其中,
x
i
∈
R
W
×
D
x_i \in R^{W\times D}
xi∈RW×D是输入语音窗口,窗口中心为第i个视频帧
y
i
∈
R
N
×
3
y_i \in R^{N\times 3}
yi∈RN×3。此外,用
f
i
∈
R
N
×
3
f_i \in R^{N\times 3}
fi∈RN×3表示
x
i
x_i
xi的VOCA输出。
训练时,将采集的数据分成训练集(8个人),验证集(2个人),测试集(2个人)。
训练集每个人有40条句子,共320条句子。
验证集和测试集每个用20条不同的句子,即分别有40条句子。
训练集、验证集、测试集是完全无关的,无论是人还是句子。
损失函数
损失函数由两项组成:位置项和速度项
位置项:
E
p
=
∣
∣
y
i
−
f
i
∣
∣
F
2
E_p=|| y_i-f_i ||_F^2
Ep=∣∣yi−fi∣∣F2计算预测的顶点和训练数据顶点的距离
速度项:
E
v
=
∣
∣
(
y
i
−
y
i
−
1
)
−
(
f
i
−
f
i
−
1
)
∣
∣
F
2
E_v=||(y_i-y_{i-1})-(f_i-f_{i-1})||_F^2
Ev=∣∣(yi−yi−1)−(fi−fi−1)∣∣F2
训练参数
我们在验证集上调整超参数,使用1e-4的学习率训练50个epochs。位置项和速度项的权重分别是1和10,训练时使用batch normalization,batch size为64。窗口尺寸W=16,语音特征维度D=29
实施细节
VOCA基于Tensorflow实现,使用Adam优化算法训练。
在单个NVIDIA Tesla K20上训练一个epoch大概耗时十分钟。
DeepSpeech部分使用预训练好的模型,训练时保持不变。
5 VOCASET
数据集简介
audio-4D scan pairs:6男6女。
每个人40句英文,每句3-5秒;27句来自TIMIT语料库,3个全字母句,10个问句(来自SQuAD)。
5句话由所有人共享,15句话由3-5个人共享(50个独特的句子);20句话由1-2个人(200个独特的句子);
采集设置
使用多目相机立体声系统(3dMD LLC, Atlanta),采集高质量的3D头部数据和语音。
采集系统包括6对灰度双目相机,6个彩色相机,5个光斑投影仪,6个白光LED板。
系统以60fps的速度采集3D mesh,每个mesh包括120K个顶点。
彩色图片用来生成UV贴图。
语音和扫描系统同步,采集的采样率为22kHz。
数据处理
原始的3D头部数据使用FLAME模型提供的方法进行对齐。基于图像的关键点检测方法可以增强对齐的鲁棒性。
对齐后,每个mesh包括5023个顶点。所有扫描数据顶点和FLAME模型的绝对距离:中值0.09mm,均值0.13mm,标准差0.14mm。
之后,所有的mesh去除姿态(unposed):旋转、平移、头部绕脖子的旋转。
对于所有的续联,脖子边界和耳朵自动修复,眼镜周围的区域使用高斯滤波器进行平滑,移出采集噪声。嘴部区域不做平滑处理,从而可以保留细微的动作。
7 实验
定量的矩阵,比如预测误差的范数,不适合用来评估动画质量。因为唇型和语音之间是多对多映射。同一段语音序列对应的人脸动作范围很广,所以定量的评估比较棘手。因此我们使用感性和定性的评估。此外,我们训练的模型可用于研究用途。