wav2lip中文语音驱动人脸训练

1 Wav2Lip介绍

1.1 Wav2Lip概述

2020年,来自印度海德拉巴大学和英国巴斯大学的团队,在ACM MM2020发表了的一篇论文《A Lip Sync Expert Is All You Need for Speech to Lip Generation In The Wild 》,在文章中,他们提出一个叫做Wav2Lip的AI模型,只需要一段人物视频和一段目标语音,就能够让音频和视频合二为一,人物嘴型与音频完全匹配。

对口型的技术,此前其实已经有很多,甚至在基于深度学习的技术出现之前,就有一些技术使角色的嘴唇形状与实际的语音信号相匹配。但这Wav2Lip 在目前的众多方法中,显示出了绝对优势。现有的其它方法,主要是基于静态图像,来输出与目标语音匹配的唇形同步视频,但对于动态的、在讲话的人物,唇形同步往往效果不佳。而 Wav2Lip 则可以直接将动态的视频,进行唇形转换,输出与目标语音相匹配的视频结果。

论文地址:论文地址

代码地址:GitHub - Rudrabha/Wav2Lip

1.2 Wav2Lip模型结构

Wav2Lip模型是一个两阶段模型。

  • 第一阶段是:训练一个能够判别声音与嘴型是否同步的判别器;
  • 第二阶段是:采用编码-解码模型结构(一个生成器 ,两个判别器);

也可基于GAN的训练方式,在一定程度上会影响同步性,但整体视觉效果稍好。

在模型训练阶段,作者提出了两个新指标, “Lip-Sync Error-Distance”(越低越好)和 “Lip-Sync Error-Confidence”(越高越好),这两个指标可以测量视频的中的唇语同步精度。结果发现,使用Wav2Lip生成的视频几乎和真实的同步视频一样好。

需要注意的是,这个模型只在LRS2上的训练集上进行了训练,在对其他数据集的训练时需要对代码进行少量修改。

生成效果如下所示

1.3 论文内容

在这项工作中,我们研究了语音驱动任意人脸唇部的运动,使得语音与说话运动同步。当前的工作擅长在训练期间看到的特定人物的静态图像或视频上产生准确的嘴唇运动。然而,它们无法准确地改变动态、不受约束的说话面部视频中任意身份的嘴唇运动,导致视频的重要部分与新音频不同步。我们确定了与此相关的关键原因,并通过向强大的口型同步鉴别器学习来解决这些问题。接下来,我们提出新的、严格的评估基准和指标,以准确测量无约束视频中的唇同步。对我们具有挑战性的基准进行的广泛定量评估表明,我们的 Wav2Lip 模型生成的视频的口型同步精度几乎与真实同步视频一样好。

随着视听内容消费的指数级增长,快速视频内容创作已成为一种基本需求。与此同时,以不同语言翻译这些视频也是一个关键挑战。例如,深度学习系列讲座、一部著名电影或向全国发表的公开演讲,如果翻译成所需的目标语言,就可以供数百万新观众观看。翻译此类会说话的面部视频的一个关键方面是校正唇形以同步匹配所需的目标语音。因此,对人脸视频进行口型同步以匹配给定的输入音频流已经在研究界受到了相当多的关注。在这个领域深度学习的早期工作使用单个说话者的几个小时视频学习了从语音表示到唇部标志的映射。这方面最近的工作能够直接从语音表示生成图像,并在他们经过训练的特定说话人上展示了卓越的生成质量。然而,许多实际应用需要能够轻松用于通用身份和语音输入的模型,这种模型经过数千种身份和声音的训练。它们可以在任何声音中的任何身份的单个静态图像上生成准确的嘴唇运动,包括由文本到语音系统生成的合成语音。然而,要用于翻译讲座/电视剧等应用,对这些模型的要求就不仅仅需要运行在静态图像上。我们的工作建立在后一类通用说话者的工作之上,这些工作希望对任何身份和声音的说话面部视频进行口型同步。我们发现,这些适用于静态图像的模型无法准确地应用在视频内容中的各种嘴唇形状中。我们的主要贡献如下:

  • 我们提出了一种新颖的口型同步网络,Wav2Lip,它比以前的作品更加准确,可以在任意语音对任意说话的脸部视频进行口型同步。
  • 我们提出了一个新的评估框架,其中包括新的基准和指标,以实现对不受约束的视频中的口型同步的公平判断。
  • 我们收集并发布了ReSyncED,这是一个真实的口型同步评估数据集,用于在完全未见过的视频上对口型同步模型的性能进行基准测试。
  • Wav2Lip 是第一个通用说话者的模型,可生成与真实同步视频相匹配的口型同步精度的视频。人类评估表明,在超过 90% 的情况下,Wav2Lip 生成的视频优于现有方法。

2 Wav2Lip部署及使用

2.1 项目下载:

git clone https://github.com/Rudrabha/Wav2Lip

2.2 运行环境构建

conda环境准备详见:annoconda安装与使用

修改requirements.txt如下:

librosa==0.9.1
numpy==1.22.0
opencv-contrib-python>=4.2.0.34
opencv-python==4.6.0.66
torch==1.13.0
torchvision==0.14.0
tqdm==4.45.0
numba==0.58
conda create -n wav2lip python==3.9
 
conda activate wav2lip 

conda install ffmpeg
 
cd Wav2lip
 
pip install -r requirements.txt

2.3 预训练模型获取

预训练模型下载:预训练模型地址

下载完成后解压,并按如下目录方式存放

  • wav2lip.pth存放到checkpoints目录下
  • wav2lip_gan.pth存放到checkpoints目录下
  • lipsync_expert.pth存放到checkpoints目录下
  • visual_quality_disc.pth存放到checkpoints目录下
  • s3fd.pth存放到face_detection/detection/sfd/目录下

2.4 视频合成

  • 通过视频和音频进行合成
 python inference.py --checkpoint_path checkpoints/wav2lip_gan.pth --face data/demo.mp4 --audio data/demo.wav 
  • 通过图片和音频进行合成
 python inference.py --checkpoint_path checkpoints/wav2lip_gan.pth --face data/demo.png --audio data/demo.wav 

最后,生成的新视频文件保存在 results/result_voice.mp4 ,生成的中间文件存放在 temp

3 Wav2Lip模型微调

训练注意事项:

  • 可能无法通过在单个人的几分钟视频训练/微调来获得良好的结果。

  • 在训练wav2lip之前,需要用你自己的数据集训练expert discriminator

  • 如果是您自己从Web下载的数据集,则在大多数情况下需要sync-corrected同步校正。

  • FPS的更改将需要重大的代码更改,所以训练之前,所有视频数据要调整为25fps

  • expert discriminator的评估损失应降至约0.25,wav2lip评估同步损失应降至〜0.2,以获得良好的结果。

 如果想要自己训练一个syncnet模型的话, 简单的从网上拉一些看似音视频已经对齐的资源是不够的, 有可能仍存在<100 ms的非同步, 所以需要干净的经过检查的数据. 作者的做法是先拿未筛选的数据训练一版模型, 然后通过卡阈值把训练集中一部分false positive (即假对齐)给抛弃掉, 从而达到非人工筛选的目的。 

3.1 数据集准备

3.2 数据预处理

python preprocess.py --data_root /opt/data/25fps/ --preprocessed_root /opt/data/25fps_preprocessed

3.3 同步判别器训练

python color_syncnet_train.py --data_root /opt/data/25fps_preprocessed/ --checkpoint_dir syncnet_checkpoints/  --checkpoint_path checkpoints/lipsync_expert.pth

3.4 Wav2Lip训练

python wav2lip_train.py --data_root /opt/data/25fps_preprocessed/ --checkpoint_dir checkpoints/ --syncnet_checkpoint_path syncnet_checkpoints/checkpoint_step001880000.pth  --checkpoint_path checkpoints/wav2lip.pth

3.5 带视频质量判别器的Wav2Lip训练

python hq_wav2lip_train.py --data_root /opt/data/lrs2_preprocessed/ --checkpoint_dir hq_wav2lip_checkpoints/ --syncnet_checkpoint_path syncnet_checkpoints/checkpoint_step001880000.pth --checkpoint_path checkpoints/wav2lip_gan.pth --disc_checkpoint_path checkpoints/visual_quality_disc.pth

4 注意事项

windows下训练,需要更改预处理preprocess.py的代码

def process_video_file(vfile, args, gpu_id):
	video_stream = cv2.VideoCapture(vfile)
	
	frames = []
	while 1:
		still_reading, frame = video_stream.read()
		if not still_reading:
			video_stream.release()
			break
		frames.append(frame)
	
	vidname = os.path.basename(vfile).split('.')[0]
	dirname = vfile.split('/')[-2]

	fulldir = path.join(args.preprocessed_root, dirname, vidname)
	os.makedirs(fulldir, exist_ok=True)

	batches = [frames[i:i + args.batch_size] for i in range(0, len(frames), args.batch_size)]

	i = -1
	for fb in batches:
		preds = fa[gpu_id].get_detections_for_batch(np.asarray(fb))

		for j, f in enumerate(preds):
			i += 1
			if f is None:
				continue

			x1, y1, x2, y2 = f
			cv2.imwrite(path.join(fulldir, '{}.jpg'.format(i)), fb[j][y1:y2, x1:x2])


修改为:

def process_video_file(vfile, args, gpu_id):
	video_stream = cv2.VideoCapture(vfile)
	
	frames = []
	while 1:
		still_reading, frame = video_stream.read()
		if not still_reading:
			video_stream.release()
			break
		frames.append(frame)
	
	vidname = os.path.basename(vfile).split('.')[0]
	vfile = vfile.replace('\\', '/')
	dirname = vfile.split('/')[-2]

	fulldir = path.join(args.preprocessed_root, dirname, vidname)
	os.makedirs(fulldir, exist_ok=True)

	batches = [frames[i:i + args.batch_size] for i in range(0, len(frames), args.batch_size)]

	i = -1
	for fb in batches:
		preds = fa[gpu_id].get_detections_for_batch(np.asarray(fb))

		for j, f in enumerate(preds):
			i += 1
			if f is None:
				continue

			x1, y1, x2, y2 = f
			cv2.imwrite(path.join(fulldir, '{}.jpg'.format(i)), fb[j][y1:y2, x1:x2])
def process_audio_file(vfile, args):
	vidname = os.path.basename(vfile).split('.')[0]
	dirname = vfile.split('/')[-2]

	fulldir = path.join(args.preprocessed_root, dirname, vidname)
	os.makedirs(fulldir, exist_ok=True)

	wavpath = path.join(fulldir, 'audio.wav')

	command = template.format(vfile, wavpath)
	subprocess.call(command, shell=True)

修改为:

def process_audio_file(vfile, args):
	vidname = os.path.basename(vfile).split('.')[0]
	vfile = vfile.replace('\\', '/')
	dirname = vfile.split('/')[-2]

	fulldir = path.join(args.preprocessed_root, dirname, vidname)
	os.makedirs(fulldir, exist_ok=True)

	wavpath = path.join(fulldir, 'audio.wav')

	command = template.format(vfile, wavpath)
	subprocess.call(command, shell=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/312387.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT可以帮你做什么?

学习 利用ChatGPT学习有很多&#xff0c;比如&#xff1a;语言学习、编程学习、论文学习拆解、推荐学习资源等&#xff0c;使用方法大同小异&#xff0c;这里以语言学习为例。 在开始前先给GPT充分的信息&#xff1a;&#xff08;举例&#xff09; 【角色】充当一名有丰富经验…

vue3、vue2文件导入事件

一、vue3写法 1、html部分 <el-buttontype"info"plainicon"Upload"click"handleImport"v-hasPermi"[system:user:import]">导入</el-button><!-- 导入对话框 --><el-dialog :title"upload.title" v-…

性能分析与调优: Linux 磁盘I/O 观测工具

目录 一、实验 1.环境 2.iostat 3.sar 4.pidstat 5.perf 6. biolatency 7. biosnoop 8.iotop、biotop 9.blktrace 10.bpftrace 11.smartctl 二、问题 1.如何查看PSI数据 2.iotop如何安装 3.smartctl如何使用 一、实验 1.环境 &#xff08;1&#xff09;主机 …

【漏洞复现】先锋WEB燃气收费系统文件上传漏洞 1day

漏洞描述 /AjaxService/Upload.aspx 存在任意文件上传漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作…

ubuntu20固定串口名称

查看串口的详细信息 udevadm info --name/dev/ttyUSB0结果&#xff1a; P: /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0/tty/ttyUSB0 N: ttyUSB0 L: 0 S: serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UAR…

Arrow:在项目中进行时间处理的强大工具

目录 一、Arrow简介 二、安装与配置 三、基础功能与使用 1. 日期和时间格式转换 2. 时区处理 3. 时间序列分析 四、进阶应用与案例分析 五、性能与优化 六、最佳实践与经验分享 七、总结与展望 在处理日期和时间时&#xff0c;我们经常需要一个精确、可靠的库来帮助我…

FinClip SaaS 平台——小程序转APP操作指南及其实现

目录 前言 优势 操作指南 IDE生成APP 打开导出目录查看APP 使用AS打开导出的项目 Application初始化sdk MainActivity启动小程序并finish掉当前页面 &#xff0c;可查看前面文章进行操作&#xff0c;本文介绍FinClip SaaS 平台推出的新功能 生成APP 前言 通过这个「生…

pytorch11:模型加载与保存、finetune迁移训练

目录 一、模型加载与保存1.1 序列化与反序列化概念1.2 pytorch中的序列化与反序列化1.3 模型保存的两种方法1.4 模型加载两种方法 二、断点训练2.1 断点保存代码2.2 断点恢复代码 三、finetune3.1 迁移学习3.2 模型的迁移学习3.2 模型微调步骤3.2.1 模型微调步骤3.2.2 模型微调…

计算机毕业设计 基于SpringBoot的物资综合管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

mysql原理--redo日志2

1.redo日志文件 1.1.redo日志刷盘时机 我们前边说 mtr 运行过程中产生的一组 redo 日志在 mtr 结束时会被复制到 log buffer 中&#xff0c;可是这些日志总在内存里呆着也不是个办法&#xff0c;在一些情况下它们会被刷新到磁盘里&#xff0c;比如&#xff1a; (1). log buffer…

ROS2——常见的指令

在使用source ∼/bookros_ws/install/setup.bash后&#xff0c;可以让ROS2找到这个工作空间&#xff0c;进而可以调用相关的命令 概述 ros2 <command> <verb> [<params>|<option>]*这是ROS2与系统交互的方式 在终端输入ros2&#xff0c;即可查看相关…

YOLOv5改进 | 检测头篇 | ASFFHead自适应空间特征融合检测头(全网首发)

一、本文介绍 本文给大家带来的改进机制是利用ASFF改进YOLOv5的检测头形成新的检测头Detect_ASFF,其主要创新是引入了一种自适应的空间特征融合方式,有效地过滤掉冲突信息,从而增强了尺度不变性。经过我的实验验证,修改后的检测头在所有的检测目标上均有大幅度的涨点效果,…

065:vue中将一维对象数组转换为二维对象数组

第065个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Sqoop入门指南:安装和配置

Sqoop是一个强大的工具&#xff0c;用于在Hadoop和关系型数据库之间高效传输数据。在本篇文章中&#xff0c;将深入探讨如何安装和配置Sqoop&#xff0c;以及提供详细的示例代码。 安装Java和Hadoop 在开始安装Sqoop之前&#xff0c;首先确保已经成功安装了Java和Hadoop。Sqo…

第十四章JSON

第十四章JSON 1.什么是JSON2.JSON的定义和访问3.JSON在JavaScript中两种常用的转换方式4.JavaBean和JSON的相互转换5.List集合和JSON的相互转换6.map集合和JSON的相互转换 1.什么是JSON 2.JSON的定义和访问 JSON的定义 JSON的类型是一个Object类型 JSON的访问 我们要…

轮询定时器 清除 + vue2.0

需求? Gin Vue Element UI框架中, 我的大屏可视化项目, 大屏页面, 里边写了多个轮询定时器. 离开页面需要清理掉, 要不然切换路由还会在后台运行, 页面是自动缓存状态, 也不存在销毁一说了 所以通过路由router配置中, 页面路由监听中, 进行监听路由变化, 但是也没生效 …

屏幕截图编辑工具Snagit中文

Snagit是一款优秀的屏幕、文本和视频捕获与转换程序。它能够捕获屏幕、窗口、客户区窗口、最后一个激活的窗口或用鼠标定义的区域&#xff0c;并支持BMP、PCX、TIF、GIF或JPEG格式的保存。Snagit还具有自动缩放、颜色减少、单色转换、抖动等功能&#xff0c;并能将捕获的图像转…

安达发|APS排程系统之产品相似规则

APS排程系统是一种广泛应用于制造业的智能生产计划和调度工具&#xff0c;它能够帮助企业实现生产过程的优化、提高生产效率和降低生产成本。在APS排程系统中&#xff0c;相似产品规则是一种非常重要的功能&#xff0c;它可以帮助企业更好地管理和控制生产过程中的各种相似产品…

【微服务】日志搜集elasticsearch+kibana+filebeat(单机)

日志搜集eskibanafilebeat&#xff08;单机&#xff09; 日志直接输出到es中&#xff0c;适用于日志量小的项目 基于7.17.16版本 主要配置在于filebeat&#xff0c; es kibana配置改动不大 环境部署 es kibana单机环境部署 略 解压即可 常见报错&#xff0c;百度即可。 记录…

大模型关于Lora论文集合

《Chain of LoRA:Efficient Fine-tuning of Language Models via Residual Learning》 Chain of LoRA (COLA)&#xff0c;这是一种受 Frank-Wolfe 算法启发的迭代优化框架&#xff0c;旨在弥合 LoRA 和全参数微调之间的差距&#xff0c;而不会产生额外的计算成本或内存开销。CO…