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.9conda activate wav2lip conda install ffmpegcd Wav2lippip 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()breakframes.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 = -1for fb in batches:preds = fa[gpu_id].get_detections_for_batch(np.asarray(fb))for j, f in enumerate(preds):i += 1if f is None:continuex1, y1, x2, y2 = fcv2.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()breakframes.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 = -1for fb in batches:preds = fa[gpu_id].get_detections_for_batch(np.asarray(fb))for j, f in enumerate(preds):i += 1if f is None:continuex1, y1, x2, y2 = fcv2.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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins基础篇--添加节点

节点介绍 Jenkins 拥有分布式构建(在 Jenkins 的配置中叫做节点)&#xff0c;分布式构建能够让同一套代码在不同的环境(如&#xff1a;Windows 和 Linux 系统)中编译、测试等。 Jenkins 运行的主机在逻辑上是 master 节点&#xff0c;下图是主节点和从节点的关系。 添加节点 …

2024年五款值得买的云服务器推荐,便宜又好用

作为多年站长使市面上大多数的云厂商的云服务器都使用过&#xff0c;很多特价云服务器都是新用户专享的&#xff0c;本文有老用户特价云服务器&#xff0c;阿腾云atengyun.com有多个网站、小程序等&#xff0c;国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…

Bluefin借助Sui性能,交出亮眼的DeFi成绩

Bluefin的创始人希望在去中心化平台上提供先进、资本效率高的衍生品交易。要与传统金融领域的竞争对手一较高下&#xff0c;该平台需要在性能、成本效益和可访问性方面表现出色&#xff0c;以服务机构和个人用户。 2023年&#xff0c;Bluefin团队在Arbitrum上进行的beta发布帮…

Android studio第一次构建项目Gradle失败的解决方法

每次在AS上新创建一个项目&#xff0c;gradle要下载半天或者是直接下载半天后以失败告终&#xff0c;抓狂并崩溃。 原因&#xff1a; 这是因为AS默认去下载gradle的网站是在国外的&#xff0c;而且国内的网络经常是访问不到那个网站的&#xff0c;能访问到有时候就跟中大奖一…

GPT function calling v2

原文&#xff1a;GPT function calling v2 - 知乎 OpenAI在2023年11月10号举行了第一次开发者大会&#xff08;OpenAI DevDays&#xff09;&#xff0c;其中介绍了很多新奇有趣的新功能和新应用&#xff0c;而且更新了一波GPT的API&#xff0c;在1.0版本后的API调用与之前的0.…

springboot057洗衣店订单管理系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 研究背景 如…

《NLP入门到精通》栏目导读

一、说明 栏目《NLP入门到精通》本着从简到难得台阶式学习过度。将自然语言处理得知识贯穿过来。本栏目得前导栏目是《深度学习》、《pytorch实践》&#xff0c;因此&#xff0c;读者需要一定得深度学习基础&#xff0c;才能过度到此栏目内容。 二、博客建设理念 本博客基地&am…

C++系列-第1章顺序结构-6-加法、减法和乘法

在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客&#xff0c;主要讲述加法减法乘法的用法 加法 减法 乘法 当然可以。下面我将分别为初一的同学提供C中加法、减法、乘法的简单教程和案例&#xff0c;最后再提供一个综合性的…

GIT 分支管理办法(二)

GIT 分支管理办法&#xff08;二&#xff09; 一. 大型项目分支管理中存在的痛点 大型项目中需求的上线存在很大的不确定性&#xff0c;而且往往存在多版本、多团队、多开发并行的情况。尤其是大型企业对上线分支中编号的管理十分严苛&#xff0c;严禁夹带上线。这时对于开发…

Linux部署WBO在线白板

部署Node.js环境 wget https://nodejs.org/dist/v16.17.0/node-v16.17.0-linux-x64.tar.xz在/opt目录下&#xff0c;解压Node.js安装包 tar -xf node-v16.17.0-linux-x64.tar.xzln -s /opt/node-v16.17.0-linux-x64/bin/node /usr/local/bin/node ln -s /opt/node-v16.17.0…

Java SE入门及基础(9)

if选择结构 1. 基本if选择结构 语法 if ( 条件 ){ // 如果条件满足&#xff0c;则执行代码块 //代码块 } 案例 从控制台输入一个整数&#xff0c;如果该数字小于 10 &#xff0c;则输出 10 与该数字的差值。 流程图 代码实现 public class Example1 { public s…

230.【2023年华为OD机试真题(C卷)】转盘寿司(JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-转盘寿司二.解题思路三.题解代码Python题解代码…

The Planets:Earth

靶机下载 The Planets: Earth ~ VulnHub 信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-11 09:20 CST Nmap scan report for 192.168.1.1 Host is up (0.00036s latency). MAC Address: …

Linux 抓包还不会?这篇文章赶紧收藏!

前言 什么是TCPDUMP TCPdump&#xff0c;全称dump the traffic on a network&#xff0c;是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具。 tcpdump可以支持的功能&#xff1a; 1、在Linux平台将网络中传输的数据包全部捕获过来进行分析 …

RT-DETR优化:UNetv2多层次特征融合模块结合DualConv、GSConv

🚀🚀🚀本文改进:多层次特征融合(SDI)结合DualConv、GSConv模块等实现二次创新 🚀🚀🚀SDI 亲测在多个数据集能够实现涨点,同样适用于小目标检测 🚀🚀🚀RT-DETR改进创新专栏:http://t.csdnimg.cn/vuQTz 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定…

SmartX 超融合和分布式存储支持哪些信创硬件?如何选型配置?

为了推动 IT 基础架构国产化转型&#xff0c;不少用户都使用 SmartX 超融合和分布式存储构建信创云基础设施。其中&#xff0c;信创硬件的选型与配置往往是用户在规划与部署环节关注的重点&#xff1a;国产 CPU/存储怎么选&#xff1f;哪个系列/型号的性价比最高&#xff1f;如…

记录汇川:H5U与Fctory IO测试9

主程序&#xff1a; 子程序&#xff1a; IO映射 子程序&#xff1a; 出料程序 子程序&#xff1a; 自动程序 Fctory IO配置&#xff1a; 实际动作如下&#xff1a; Fctory IO测试9

【python,机器学习,nlp】RNN循环神经网络

RNN(Recurrent Neural Network)&#xff0c;中文称作循环神经网络&#xff0c;它一般以序列数据为输入&#xff0c;通过网络内部的结构设计有效捕捉序列之间的关系特征&#xff0c;一般也是以序列形式进行输出。 因为RNN结构能够很好利用序列之间的关系&#xff0c;因此针对自…

螺杆冷水机组工作原理

螺杆冷水机组主要由螺杆压缩机、冷凝器、蒸发器、膨胀阀及电控系统组成。水冷单螺杆冷水机组制冷原图如下&#xff1a; &#xff08;一&#xff09;双螺杆制冷压缩机 双螺杆制冷压缩机是一种能量可调式喷油压缩机。它的吸气、压缩、排气三个连续过程是靠机体内的一对相互啮合的…