嘴型同步模型Wav2Lip
软硬件环境是
-
ubuntu 18.04 64bit
-
nvidia GeForce 3090Ti
-
cuda 11.4
-
anaconda with python 3.7
简介
2020年,来自印度海德拉巴大学和英国巴斯大学的团队,在ACM MM2020发表了的一篇论文《A Lip Sync Expert Is All You Need for Speech to Lip Generation In The Wild 》,在文章中,他们提出一个叫做Wav2Lip的AI模型,只需要一段人物视频和一段目标语音,就能够让音频和视频合二为一,人物嘴型与音频完全匹配。
快速体验
可以先到作者提供的体验站体验一番,地址是:https://bhaasha.iiit.ac.in/lipsync/example3/
wav2lip
按照上图中的选择视频和音频上传即可同步。
实践
准备环境
首先使用conda创建新的虚拟环境,然后激活这个环境
conda create -n py_video python=3.7
conda activate py_video
接着来到官方网站,使用git克隆代码,或者直接下载源码压缩包解压,安装依赖
git clone https://github.com/Rudrabha/Wav2Lip.git
pip install -r requirements.txt
在windows平台上,使用了阿里云的pip源,发现找不到torch 1.1的版本,
后来使用了最新稳定版1.11也没有问题,其它依赖库使用最新版也是ok的。
接下来需要安装ffmpeg,这是音视频处理的神器,ubuntu版本使用apt安装
sudo apt install ffmpeg
windows用户的话,可以到 https://github.com/BtbN/FFmpeg-Builds/releases 下载,解压后将bin对应的路径添加到系统环境变量PATH中。
准备素材
下面开始准备素材,我们把官方体验站上的测试视频下载下来,使用下面的命令
wget --no-check-certificate https://bhaasha.iiit.ac.in/lipsync/static/samples/game.mp4
这个测试视频只有 3秒,那接下来就去找个对应 3秒 的音频。如果能有现成的音频文件最好,如果没有的话,我的做法是这样的,从某个视频文件中提取音频,然后进行裁剪,这里需要的时长是三秒。这两步会使用到ffmpeg这个工具
视频裁剪,从第15秒开始,总时长是3秒,目标视频的音视频编码格式与原始的保持一致
ffmpeg -ss 00:00:15 -t 00:00:03 -i input.mp4 -vcodec copy -acodec copy test.mp4
从视频中提取音频
ffmpeg -i test.mp4 -vn test.mp3
准备模型文件
第一个需要的模型是脸部检测预训练模型,下载地址是:
https://www.adrianbulat.com/downloads/python-fan/s3fd-619a316812.pth,
下载后放到目录 face_detection/detection/sfd
中,并重命名为s3fd.pth。
脸部模型:接下来去下载模型文件,这里作者提供了3个,可以任选一个,后两个优于第一个。
它们的区别如下表所示,本文使用的是Wav2Lip + GAN,下载地址:
https://iiitaphyd-my.sharepoint.com/:u:/g/personal/radrabha_m_research_iiit_ac_in/EdjI7bZlgApMqsVoEUUXpLsBxqXbn5z8VTmoxp55YNDcIA?e=n9ljGW ,
下载后放在项目 根目录
wav2lip
运行代码
执行下面的命令将视频 test.mp4 和音频 test.mp3 进行合成
python inference.py --checkpoint_path wav2lip_gan.pth --face test.mp4 --audio test.mp3
执行下面的命令将图片1.jpg 和音频 test.mp3 进行合成
python inference.py --checkpoint_path wav2lip_gan.pth --face 1.jpg --audio test.mp3
最后,生成的新视频文件保存在 results/result_voice.mp4
,生成的中间文件存放在 temp
下,像单独处理后的音频temp.wav
、视频 result.avi
等。
FAQ
ValueError: Face not detected! Ensure the video contains a face in all the frames.
这个一般是由于片头或者片尾没有脸,解决方法也很简单,使用ffmpeg或者剪辑软件,将片头或片尾相应的帧剪掉就可以了
备注
项目作者强调,基于此开放源代码的所有结果仅应用于学术研究和个人目的,由于模型是基于LRS2 (Lip Reading Sentences 2) 数据集进行训练,因此严禁任何形式的商业用途。
资源下载
打包了文中所使用的模型文件,下载地址:
链接:https://pan.baidu.com/s/1uaOC3PEFRvTuC5Xwbj1KUw
提取码:t9pg
参考资料
http://arxiv.org/abs/2008.10010
https://github.com/Rudrabha/Wav2Lip
http://bhaasha.iiit.ac.in/lipsync/
https://github.com/1adrianb/face-alignment
https://xugaoxiang.com/2020/09/29/ffmpeg-cmd/