前言
- 因为这是读的论文A Lip Sync Expert Is All You Need for Speech to Lip Generation的前置, 所以只对其生成器部分做重点介绍.
正文
论文目的
这篇论文目的可以用下图表示:
可以看到是将原视频嘴部替换成语言翻译后的结果, 对应的生成就是visual translation部分, 本质是从语音特征生成对应的嘴部动画
方法
整体方法是把语言LA转为LB, 然后再转为相应的说话视频, 整体的架构图:
- 首先是把语音LA转为文本:
- 这里使用Automatic Speech Recognition(ASR)领域的最近工作, 作者使用了Deep Speech 2 (来自论文:Deep speech 2: End-to-end speech recognition in english and mandarin) 的预训练模型用做英语语音识别.
-
然后是使用nmt(Neural Machine Translation)系统将LA的文本转换成LB的文本, (这里LA为英语,LA为印地语)
-
对于印地语文本-语音模型(TTS)(Text to Speech) ,采用了Ping等人提出的DeepVoice 3模型重新实现。由于印度语缺乏大规模的公共数据集,通过从抓取的新闻文章中记录印地语句子来管理一个类似于LJSpeech的数据集。采用了DeepVoice 3的nyanko-build 5实现来训练我们的印地语TTS模型。
-
生成语音之后为了有LA的说话人特征, 这里使用CycleGan, 转变语音风格。
-
最后是音频到视频的LipGAN
LipGAN
下面主要介绍Talking face generation这一部分
主要任务是给定包含身份脸部的图片
I
I
I以及语音A, 语音A被分成一系列语音段{A1,A2,… Ak}, 通过模型G可以生成一系列帧{S1,S2 ,… Sk}, 包含面部说话音频A与适当的唇同步。
整体架构如图:
- 生成器在论文 (You said that?)的基础上修改, 包含3个分支:Face Encoder, Audio Encoder, 还有Face Decoder。
Face Encoder
- 对于Face Encoder, 将随机身份的脸部图像 I I I 连同姿势等信息作为输入, 注意这里遮挡了脸部的下半部分并且将其按channel concatenate起来。
- 所以最后的输入是 H ∗ H ∗ 6 H*H*6 H∗H∗6大小的image. Face Encoder由一系列带有中间下采样的残差模块组成, 然后embeds输入的image到face embedding中, 大小为 h h h
这里的疑问是图片与被遮挡的图片是同一张吗?一会看看源码
Audio Encoder
音频编码器是个标准的CNN, 使用大小为 M ∗ T ∗ 1 M*T*1 M∗T∗1的MFCC heatmap作为输入(所以输入是图还是MFCC, 看看源码), 输出是音频embedding层, 大小为 h h h. 将得到的音频embedding与脸部embedding层concatenate起来, 生成联合的audio-visual embedding, 大小为 2 ∗ h 2*h 2∗h
Face Decoder
该部分使用恰当的嘴型补全蒙版区域, 包含一系列带有中间反卷积的残差块, 对特征图进行了上采样.
输出层是sigmoid激活的
1
∗
1
1*1
1∗1带有3个filter的卷积, 所以输出是
H
∗
H
∗
3
H*H*3
H∗H∗3. 在每个上采样操作后使用跳连接, 总共使用了6个. 当我们给定姿势时, 模型会给予与姿势匹配的嘴型.
Discriminator network
创建了一个将输入面部和音频编码为固定表示形式并计算它们之间的L2距离d的网络。
面部编码器和音频编码器与生成器网络中使用的相同.
训练过程
从输入的视频样本中随机选择一个T毫秒窗口,并提取其对应的音频片段A,然后以F Hz的频率重新采样. 从该窗口中先择中间视频帧 S S S作为所需的真实帧(ground-truth). 从这个ground-truth帧中遮挡嘴部区域(也就是图像的下半部分)得到 S m S_m Sm. 还对negative帧 S ′ S' S′ 进行采样, 即该窗口外部的帧,该帧预计不会与所选音频段A同步。
在对生成器的每个训练批次中,将未同步的面部S’与添加mask的地面真实面部 S m S_m Sm和目标音频片段A在channel上进行级联作为输入。 期望生成器生成同步的人脸G([ S ′ S' S′; S m S_m Sm], A) ≈ ≈ ≈ S S S.
鉴别器的每个训练batch包含3中不同类型的样本:
- 从生成器合成的样本: (G( S ′ S' S′, A), A); y i y_i yi =1
- 与音频 ( S , A ) (S,A) (S,A)同步的实际帧; y i y_i yi = 0
- 与音频 ( S ′ , A ) (S',A) (S′,A)不同步的实际帧, y i y_i yi=1
- 鉴别器学会通过最小化以下对比损失(contrastive loss)来检测同步:
m是距离大于m是设置的值, 这里设置为2. di是两个变量的欧氏距离, 看看源码是哪两个变量
-
生成器通过最小化L1重建损失来学习重建人脸图像:
-
使用以下GAN目标函数训练生成器G和鉴别器D:
其中 z ∈ { S , S ′ } z ∈ {\{ S, S′\} } z∈{S,S′}, G试图使 L a L_a La和 L R e L_{Re} LRe最小化,D试图使 L a L_a La最大化。因此,最终目标函数是:
训练细节
使用了LRS2数据集, 每个音频段中提取13个MFCC特征
(
T
=
350
,
F
=
100
)
(T = 350,F = 100)
(T=350,F=100), 并丢弃第一个feature.
使用dlib库检测面部, 并将面部裁剪尺寸调整为
96
∗
96
∗
3
96*96*3
96∗96∗3