本次要分享的数字人论文是:A Lip Sync Expert Is All You Need for Speech to Lip Generation In the Wild,即Wav2Lip模型。
模型结构
Wav2Lip模型是一个两阶段模型。第一阶段是:训练一个能够判别声音与嘴型是否同步的判别器 ;第二阶段是:采用编码-解码模型结构(一个生成器 ,两个判别器);也可基于GAN的训练方式,在一定程度上会影响同步性,但整体视觉效果稍好。
损失函数:
- L1Loss:像素级
- VggLoss:高维语义特征
- GANLoss
- SyncNetLoss
优势
- 嘴型与声音的同步性好,得益于嘴型判别器 的强有力监督信号。
- 任意人脸对象、不同语种音频也能正常驱动。
- 推理速度还行。
不足
- 虽然同步性好,但整体清晰度偏低,英文音频下的测试效果还好,中文音频中的牙齿部分还原度稍差,对中文的支持不够友好。
- Wav2Lip在发某些音的时候,嘴巴张开幅度忽然变大。
- 参考人脸图片侧脸时,脸部会不协调。主要是因为训练时将下半脸全都置0(显示是全黑区域),模型在预测时对于被mask掉的区域是没有参考信息的,上下半脸衔接就会出现瑕疵。
可优化的方向
- 预处理用于训练的视频数据的清晰度。LRS2数据集的清晰度低(本人也没有LRS2/LRW数据集),如果训练数据都是模糊的,极大地限制模型复原牙齿部分。具体操作是利用超分模型提升脸部的清晰度,特别是嘴巴区域,可参考腾讯的超分模型GFPGAN。
- 增加模型输入的分辨率,但会增加训练时间和推理时间。
制作精细的下半脸mask,而不是像原论文直接mask掉下半脸的操作。具体操作是经过人脸关键点检测,然后根据关键点的点位得到固定大小的bbox,一个帧视频中所有下半脸的点位的最大最小值(如68个关键点,点位2、点位14、点位8),对于大批量数据,似乎又不太合适。 - 对于驱动的人像,说话时频率过快,通过增加静默视频数据即可。静默视频是指嘴巴紧闭且不发出声音的视频片段。
- 修改网络结构,可能更容易训练。
- 以上观点,仅供参考,不一定正确。
收集视频数据
- 各大短视频平台:B站、抖音、快手、小红书、youtube等;
- 类型:演讲、介绍、电视剧、新闻联播等;
- 编写批处理脚本:筛选、裁剪、图像增强、音频处理。
数据预处理
- 视频:转换视频帧率为25fps(推荐),根据自己需求处理。使用ffmpeg裁剪得到的视频片段,会造成视频帧与音频出现不对齐。推荐使用cv2读取,再筛选合适的图像序列。
- 网上收集的视频,有的会出现跳帧的情况,一定要筛选出最长的图片序列。
- 音频:转换音频采样率为16000k。
# 预处理视频数据
1. 使用cv2读取视频
import cv2
import face_alignment # pip install face_alignment
fa = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, device='cpu')
# cpu or gpu
video_path = "demo.mp4"
cap = cv2