赞
踩
1、CMLR
2、LRW-1000
3、其他数据集
4、视频收集与处理与训练
5、资料
Wav2Lip实现的是视频人物根据输入音频生成与语音同步的人物唇形,使得生成的视频人物口型与输入语音同步。不仅可以基于静态图像来输出与目标语音匹配的唇形同步视频,还可以直接将动态的视频进行唇形转换,输出与目标语音匹配的视频。
但是预训练模型采用的是LRS2数据集,对于中文唇音同步效果不够真实,开放的或者可申请比较大的中文数据集有CMLR和LRW-1000等。也可以自己收集数据集进行清洗处理,但时间会很长,成本比较高。
CMLR https://www.vipazoo.cn/CMLR.html
中文新闻联播视频包含由 11 位主持人所表述的共 102 076 条句子. 每个句子最多包含 29 个汉字, 不包含英文字母、阿拉伯数字和稀有标点. 本文所用数据集为该数据集中的一部分,大约有 2100 条视频和对应的 2100 条文本
LRW-1000 数据集是由中科院计算所、中国科学院大学和华中科技大学团队于 2018 年提出,旨在建立一个在室外环境下并且图像尺寸不一的大规模基准,包含:1000000汉字的实例,718,018个样本,平均每个类有718个样本,1000个类,每个类对应一个普通话单词的音节,2000多名不同的说话人,覆盖说话方式,包括语速、视点、年龄、性别、化妆等
LRW-1000是目前最大的词级唇语识别数据集,也是目前唯一公开的大规模中文唇语识别数据集,可申请使用。(联系邮箱:dalu.feng@vipl.ict.ac.cn; shuang.yang@ict.ac.cn)
数据集官网地址:Lip Reading: CAS-VSR-W1k (The original LRW-1000)
1、HDTF https://pan.baidu.com/s/1UQ0I3L3FKxhA_PcS3YrL6w 提取码:elej
2、MEAD https://github.com/uniBruce/Mead
3、VOX https://pan.baidu.com/share/init?surl=wBL34jZRSMq4aJX-l3_pBw 提取码:xkfj
各大短视频平台:B站、抖音、快手、小红书、youtube等;
类型:演讲、介绍、电视剧、新闻联播等;
编写批处理脚本:筛选、裁剪、图像增强、音频处理。
1、视频:转换视频帧率为25fps(推荐),根据自己需求处理。使用ffmpeg裁剪得到的视频片段,会造成视频帧与音频出现不对齐。推荐使用cv2读取,再筛选合适的图像序列。
2、网上收集的视频,有的会出现跳帧的情况,一定要筛选出最长的图片序列。
3、音频:转换音频采样率为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.VideoCapture(video_path)
while cap.isOpened():
ret, frame = cap.read()
preds = fa.get_landmarks(frame)
# directly extract images from a video
# .png的清晰度比.jpg高
ffmpeg -y -i {./video_path/demo.mp4} -r 25 {./save_path/demo/%06d.png}
例如:ffmpeg -y -i D://videos//demo.mp4 -r 25 D://images//demo//%06d.png
# 预处理音频
# 使用ffmpeg将采样率转换为16000
ffmpeg -y -i {./demo.mp4} -async 1 -ac 1 -vn -acodec pcm_s16le -ar 16000 {xx.wav}
# 下面的操作就是将音频与视频对齐
syncnet_mel_step_size = 16 # 视频的一帧对应音频块的长度是16
def crop_audio_window(self, spec, start_frame):
start_frame_num = self.get_frame_id(start_frame) # 编号为 0, 1, 2, ..., n
start_idx = int(80. * (start_frame_num / 25.)) # 对应视频帧率25fps下的音频块的起点位置
end_idx = start_idx + syncnet_mel_step_size # 长度为16
return spec[start_idx : end_idx, :]
4.3 训练SyncNet
1、SyncNet模型中的图像编码器和音频编码器从零开始训练的话,需要训练数据中不同对象的数量够多,不然损失函数loss一直徘徊在0.69附近。
2、对象数量不多的前提下,中英文混合训练也是可行的(理论上分析)。
3、推荐分别使用预训练的主网络作为图像和音频的编码器。
4、没训练好的SyncNet模块会直接影响第二阶段的同步性效果,所以SyncNet的训练过程是痛苦的(一苦:没有数据;二苦:训练太慢,迟迟不出效果)。
5、数据预处理、模型训练都是耗时的,收集视频数据也是。没有中文数据的前提下,如果你想速成,跳过Wav2Lip等类似的通用模型吧,至少可以减轻些许痛苦。
# 在color_syncnet_train.py中数据集部分
# H x W x 3 * T
x = np.concatenate(window, axis=2) / 255.
x = x.transpose(2, 0, 1)
x = x[:, x.shape[1]//2:] # 仅取下半脸区域(训练用于判断嘴唇与音频是否同步的分类器)
# 以上是粗糙的做法
# 更为精细的做法是
# 仅使用嘴巴区域作为图像输入
# 可根据人脸关键点裁剪出嘴巴区域,1280*720分辨率下的嘴巴区域,
# 裁剪出来区域为64*64即可,通过resize操作为统一大小。# 输入嘴巴区域,能加速SyncNet的训练。# 数据量要足够(总视频时长、不同对象的数量),SyncNet模型才有泛化性。
4.4 测试SyncNet的准确率
import torch.nn as nn
# 加载模型
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = SyncNet()
model.load_state_dict(torch.load("ckpt_path", map_location="cpu"))
model.to(device)
model.eval()
# 加载输入,选定一个视频,重复多次
vidname = self.all_videos[0] # Dataset.__getitem__()
acc = 0
for _, (x, mel, y) in enumerate(test_loader):
x = x.to(device)
mel = mel.to(device)
y = y.to(device) # gt, 0 or 1
a, v = model(mel, x) # a和v的特征
av_sim = nn.functional.cosine_similarity(a, v) # a与v越相似,得分越高
for i in range(a.size(0)):
pred_label = 1 if av_sim[i] > 0.5 else 0
if pred_label == y:
acc += 1
avg_acc = acc / 总次数
本小节引用:Talking-Face-Generation系列之Wav2Lip模型
五、资料
1、AI数字人训练数据集汇总 https://blog.csdn.net/lsb2002/article/details/135999742
2、Talking-Face-Generation系列之Wav2Lip模型 https://zhuanlan.zhihu.com/p/613996840
3、改进Wav2Lip的文本音频驱动人脸动画生成 http://www.c-s-a.org.cn/csa/article/pdf/9405?file_name=A8D77C701D04C881E52E8B1CB9B8FEE13FAE6909B074264A4A0BF149715D8F6B877AEFB96ACDE3BE&open_type=self
4、wav2lip中文语音驱动人脸训练 https://blog.csdn.net/lsb2002/article/details/133377829
5、史上最详细唇语识别数据集综述 https://blog.csdn.net/qq_44697805/article/details/108341618
感谢你的阅读
接下来我们继续学习输出AIGC相关内容,欢迎关注公众号“音视频开发之旅”,一起学习成长。
欢迎交流
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。