Overview
本文首先提出了从端到端的网络,从输入的音频直接推断人脸表情变化对应的顶点位置的偏移量。为了解决声音驱动过程中,情绪变化对表情驱动效果的影响,网络自动从数据集中学习情绪状态潜变量。运行推断阶段,可将情绪潜变量作为用户输入控制参数,从而输出不同情绪下的说话表情。
网络结构
根据功能,网络主要划分为三个部分:频率分析层(Formant Analysis Network)、发音分析层(Articulation Network)、顶点输出层(Output Network)。
Formant Analysis Network
频率分析层包括一个固定参数的自相关处层(autocorrelation)、以及5个卷积层。自相关层使用线性预测编码(Linear Predictive Coding, LPC)提取音频的前K个自相关系数。由于自相关系数描述了原始音频信号共振峰的能量普分布,因此可以用系数来描述音频的特征。自相关层以多帧音频信号为输入,经过处理输出WH的2D音频特征图。其中W表示帧数,H表示自相关系数的维度。2D音频特征图再经过五层的13的卷积,对自相关系数进行压缩,最终输出W*1的特征向量。语音处理层的网络结构如下所示:
语音单帧时间长度为16ms,因此语音处理网络主要是针对音频的短时特征进行提取,包括语调、重音、以及特殊音位信息等。
Articulation Network
语音处理层输出的音频特征向量维度为。其中256为特征图的通道数。发音分析层包含5个卷积层,每层的卷积核为3*1,用于在时序上提取相邻序列帧的关联特征,输出发音特征图。由于发音不仅与声音频率相关,而且与说话者的情绪和类型等紧密相关。语音处理层同时接受训练提取的情绪状态,向量长度为E,直接连接到发音特征图,与发音特征图联合学习与表情的关系。语音处理层的网络结构如下图所示:
经过语音处理层处理后,最终输长度为(256+E)的特征向量,其中256为音频特征,E为情绪特征。在训练阶段,情绪向量的输入为E维的随机高斯分布采样。针对带情绪的输入样本,训练过程中存储语音处理层输出的特征向量,其中的E维特征向量即为自动学习到的该训练样本数据所蕴含的情绪状态。将不同情绪数据下学习到的情绪特征向量组合构成了情绪状态矩阵。在推断过程中,用户可以选择该矩阵的任意一组向量作为情绪输入(而非随机高斯分布采样),控制输出表情中包含指定的情绪。亦可通过线性组合不同的情绪向量作为输入,从而产生包含新情绪的表情动画。通过此中自动学习数据中蕴含的情绪,避免了手工标数据集的注情绪状态标签所造成的歧义和不准确性。情绪特征向量并没有实际的语义信息,因此并不能通过one-hot向量来描述不同的情绪,一个语义明确的情绪对应的情绪向量可能每一维度值都有取值。
情绪状态的学习有些类似基于编码解码器模型思想。通过输入随机变量,自动学习与输出目标对应的潜变量。在推断过程中,利用潜变量输入给解码器即可还原对应的输入。
Output Network
语音处理层输出的(256+E)维的特征向量即为从训练集上学习到的人脸说话表情动画的特征。输出网络通过两层全连接层实现从特征到人脸表情顶点坐标的映射。第一层实现了从语音特征到人脸表情基系数的映射,第二层实现了从表情系数到每个顶点坐标值的映射。第二层的权重矩阵对应的其实就是传统表情驱动中的多线性人脸表情模型,因此可以预先用150个预计算的PCA分量进行初始化。输出网络的结构图如下所示:
Loss Functions
损失函数包括三项,分别为位置项、运动项、以及情绪正则项。对于包含多项的损失函数,一个较大的挑战在于如何给各项选择合适的权重值,用于调和量纲的不同以及重要程度。论文对每一项都进行归一化处理,避免了额外增加权重。
Position term: 位置项,描述了网络预测的人脸表情与gt人脸表情之间的逐顶点均方差值:
其中V为人脸模型的顶点数。y描述的是将所有顶点按照分量展开后组成的长度为3V的向量。
Motion term: 运动项。位置项只约束了单帧预测的误差,没有考虑帧间的关系,容易导致帧间表情动作的波动,通过约束预测输出帧间顶点运动趋势与数据集上顶点在帧间运动趋势一致,可以有效避免表情动作的抖动,保证动作的平滑。训练通常采用minbatch策略。假设minbatch中训练样本数为B,则按相邻两帧为一组,划分为B/2组,计算组内前后两帧输出差值,作为顶点运动速度。计算符号定义为m[.],则运动项的定义为:
Regularization term: 正则项。为了避免学习到的情绪状态包含跟语音特征相似的特征,需要网络能够自动区分学习语言音频发音特征和情绪特征。考虑到语音频率的短时变化性,情绪在相对较长时间是不变的,可以通过约束情绪状态特征变化过快来引导网络通过音频发音特征描述短时的语音变化,而情绪特征描述长时的情绪变化。通过直接约束两帧情绪状态的变化速度为0即可达到目标:
其中表示训练样本x时对应的情绪状态特征向量的第i个分量。为了避免网络通过增大权重,而抑制e变量各分量为0来满足该正则项要求,通过借鉴BN的思想,对其进行归一化处理:
模型训练
训练数据集
训练数据集包含两个专业人员的面部表情数据。录制采用专业的动捕设备获取9个角度的数据数据,通过多角度重建技术获得每帧的3D人脸数据,并逐帧对齐到标准人脸模版从而得到拓扑一致的逐帧表情数据。录制人员通过不同情绪分别说出三句全字母句,用于尽可能的包含不同字母的发音。此外通过角色带入的方式说出指定的剧本,以便获得更多的情绪。两个录制人员各自录制3~5分钟,分别包含了9034帧和6762帧。
数据预处理
每个输入的声音样本长度为520ms,其中前260ms表示前向过去的声音,后260ms表示后向将来的声音,其对应到第260ms处的表情模型。声音样本被切分为64个音频帧,每帧的长度为16ms。相邻音频帧之间有8ms的重叠。每个音频帧均匀采样256个点,通过采样点间的相关分析,得到32个自相关系数。因此一个音频帧对应一个32维的音频特征,一个输入声音样本,经过频率分析,得到尺寸为64*32的2D共振峰特征图,作为网路的输入。
此外,音频数据通过随机前后偏移至多16.6ms的方式来增强数据。此外还对每个卷积层的输入增加倍增噪声,并作用在偏置上。
训练参数设置
使用Adam优化器,训练的epoch=500,minbatch设置为100,学习率按照10折方式衰减。情绪输入值采样自零均值高斯噪声。其中第一个角色E=16,噪声方差为0.01,第二个角色E=24,噪声方差为0.002。
模型推断
情绪状态筛选
由于网络无法完全准确的区分和学习音频和情绪特征,很多学习到的情绪特征仍然也只提取了邻近帧区间的特征,不适合用于泛化。主要原因是数据集中本身过小,无法完整的覆盖所观察的情绪下所有不同的音位和发音变化,这样导致无法准确的将情绪从音频特征中剥离。
通过观察,发现很多学习到的情绪特征抑制了嘴部的动作。通过从验证集中选择若干包括明显张闭嘴的音频样本,在样本上使用逐条输入情绪特征,只保留输出嘴部动作与gt一致的情绪特征输入。通过此过滤,最终备选的情绪状态向量只有100条。
对备选的情绪状态在音频验证集上逐一验证,剔除输出结果明显不符或者表情不太自然的情绪输入,剔除后备选情绪向量只有86条。最后,在未见过的说话者的音频数据上使用类似的方式进一步剔除,最终保留33条情绪状态向量。
实际驱动过程中,给定一段音频数据,并从33条情绪状态向量中选择一条作为情绪输入,即可得到对应情绪状态下的人脸说话表情动画。给定不同的情绪输入,即可得到相同音频输入下,不同的情绪动画效果。
动画迁移
目前网络输出的表情动画只能作用在固定的人脸模型上,为了能够驱动其它卡通形象,可以通过Deformation Transfer等技术实现。
总结
相对前面两篇文章,本文采用了端到端的学习方法,并且综合考虑了情绪的因素,情绪也是由网络自行学习得到,而无需数据标注。由于该方法是直接输出表情的顶点坐标,因此驱动其它角色时,需要进行变形迁移。此外,直接输出顶点坐标意味着如果希望预测效果好,则gt的表情坐标值进度需要足够的高。情绪向量的筛选需要通过手工方式完成,工作量较大。