基于PaddleGAN精准唇形合成实现持枪人讲电话已关机
就在上周,坐拥百万粉丝的独立艺术家大谷Spitzer老师利用深度学习技术使宋代诗人苏轼活过来,穿越千年,为屏幕前的你们亲自朗诵其著名古诗~ 点击量近百万,同时激起百万网友热议,到底是什么技术这么牛气?
铛铛铛!!飞桨PaddleGAN这就来给大家揭秘,手把手教大家如何实现唇型的迁移,学习过本项目的你们,从此不仅能让苏轼念诗,还能让蒙娜丽莎播新闻、新闻主播唱Rap… 只有你想不到的,没有PaddleGAN做不到的!
本教程是基于PaddleGAN实现的视频唇形同步模型Wav2lip, 它实现了人物口型与输入语音同步,俗称「对口型」。 比如这样:
不仅仅让静态图像会「说话」,Wav2lip还可以直接将动态的视频,进行唇形转换,输出与目标语音相匹配的视频,自制视频配音不是梦!
本次教程包含四个部分:
若是大家喜欢这个教程,欢迎到Github PaddleGAN主页点击star呀!下面就让我们一起动手实现吧!
Wav2lip实现唇形与语音精准同步突破的关键在于,它采用了唇形同步判别器,以强制生成器持续产生准确而逼真的唇部运动。
此外,该研究通过在鉴别器中,使用多个连续帧而不是单个帧,并使用视觉质量损失(而不仅仅是对比损失)来考虑时间相关性,从而改善了视觉质量。
该wav2lip模型几乎是万能的,适用于任何人脸、任何语音、任何语言,对任意视频都能达到很高的准确率,可以无缝地与原始视频融合,还可以用于转换动画人脸,并且导入合成语音也是可行的
# 下载PaddlePaddle安装包
%cd /home/aistudio/work
/home/aistudio/work
# 从github上克隆PaddleGAN代码(如下载速度过慢,可用gitee源)
!git clone https://gitee.com/PaddlePaddle/PaddleGAN
#!git clone https://github.com/PaddlePaddle/PaddleGAN
# 安装所需安装包
!mkdir sndfile
%cd sndfile
!wget http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.28.tar.gz
!tar xzvf libsndfile-1.0.28.tar.gz
%cd libsndfile-1.0.28
!./configure --prefix=/home/aistudio/build_libs CFLAGS=-fPIC --enable-shared
!make
!make install
%cd /home/aistudio/work/PaddleGAN
!pip install -r requirements.txt
%cd applications/
重点来啦!!本项目支持大家上传自己准备的视频和音频, 合成任意想要的逼真的配音视频!!
只需在如下命令中的face参数和audio参数分别换成自己的视频和音频路径,然后运行如下命令,就可以生成和音频同步的视频。
程序运行完成后,会在当前文件夹下生成文件名为outfile参数指定的视频文件,该文件即为和音频同步的视频文件。本项目中提供了demo展示所用到的视频和音频文件。具体的参数使用说明如下:
# !export PYTHONPATH=$PYTHONPATH:/home/aistudio/work/PaddleGAN && python tools/wav2lip.py --face /home/aistudio/work/mona46s.mp4 --audio /home/aistudio/work/guangquan.m4a --outfile pp_guangquan_mona46s.mp4
!export PYTHONPATH=$PYTHONPATH:/home/aistudio/work/PaddleGAN && python tools/wav2lip.py --face /home/aistudio/work/meinv.mp4 --audio /home/aistudio/work/guanji.wav --outfile guanji.mp4
/home/aistudio/work/PaddleGAN/ppgan/models/base_model.py:52: DeprecationWarning: invalid escape sequence \/
"""
/home/aistudio/work/PaddleGAN/ppgan/modules/init.py:70: DeprecationWarning: invalid escape sequence \s
"""
/home/aistudio/work/PaddleGAN/ppgan/modules/init.py:134: DeprecationWarning: invalid escape sequence \m
"""
/home/aistudio/work/PaddleGAN/ppgan/modules/init.py:159: DeprecationWarning: invalid escape sequence \m
"""
/home/aistudio/work/PaddleGAN/ppgan/modules/init.py:190: DeprecationWarning: invalid escape sequence \m
"""
/home/aistudio/work/PaddleGAN/ppgan/modules/init.py:227: DeprecationWarning: invalid escape sequence \m
"""
/home/aistudio/work/PaddleGAN/ppgan/modules/dense_motion.py:116: DeprecationWarning: invalid escape sequence \h
"""
Reading video frames...
Number of frames available for inference: 320
(80, 985)
Length of mel chunks: 305
W0130 11:44:24.694782 9610 device_context.cc:362] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.0, Runtime API Version: 10.1
W0130 11:44:24.700759 9610 device_context.cc:372] device: 0, cuDNN Version: 7.6.
100%|████████████████████████████████| 141910/141910 [00:02<00:00, 60080.20it/s]
Model loaded
0%| | 0/3 [00:00 #0:0 (mpeg4 (native) -> h264 (libx264))
Stream #0:0 -> #0:1 (pcm_f32le (native) -> aac (native))
Press [q] to stop, [?] for help
frame= 305 fps=161 q=-1.0 Lsize= 579kB time=00:00:12.30 bitrate= 385.1kbits/s
video:373kB audio:195kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.829867%
[1;36m[libx264 @ 0x1c25ea0] [0mframe I:2 Avg QP:17.00 size: 65208
[1;36m[libx264 @ 0x1c25ea0] [0mframe P:77 Avg QP:17.98 size: 2572
[1;36m[libx264 @ 0x1c25ea0] [0mframe B:226 Avg QP:24.89 size: 233
[1;36m[libx264 @ 0x1c25ea0] [0mconsecutive B-frames: 1.0% 0.7% 0.0% 98.4%
[1;36m[libx264 @ 0x1c25ea0] [0mmb I I16..4: 9.4% 86.0% 4.6%
[1;36m[libx264 @ 0x1c25ea0] [0mmb P I16..4: 0.1% 1.1% 0.0% P16..4: 10.5% 2.2% 2.1% 0.0% 0.0% skip:84.1%
[1;36m[libx264 @ 0x1c25ea0] [0mmb B I16..4: 0.0% 0.1% 0.0% B16..8: 5.9% 0.1% 0.0% direct: 0.0% skip:93.8% L0:49.8% L1:49.1% BI: 1.2%
[1;36m[libx264 @ 0x1c25ea0] [0m8x8 transform intra:86.9% inter:85.1%
[1;36m[libx264 @ 0x1c25ea0] [0mcoded y,uvDC,uvAC intra: 80.0% 88.4% 48.8% inter: 1.4% 2.1% 0.2%
[1;36m[libx264 @ 0x1c25ea0] [0mi16 v,h,dc,p: 40% 31% 20% 9%
[1;36m[libx264 @ 0x1c25ea0] [0mi8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 35% 19% 27% 3% 2% 3% 2% 3% 6%
[1;36m[libx264 @ 0x1c25ea0] [0mi4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 49% 27% 9% 3% 2% 3% 2% 3% 3%
[1;36m[libx264 @ 0x1c25ea0] [0mi8c dc,h,v,p: 32% 24% 34% 10%
[1;36m[libx264 @ 0x1c25ea0] [0mWeighted P-Frames: Y:0.0% UV:0.0%
[1;36m[libx264 @ 0x1c25ea0] [0mref P L0: 73.2% 5.9% 12.9% 8.0%
[1;36m[libx264 @ 0x1c25ea0] [0mref B L0: 79.9% 16.3% 3.8%
[1;36m[libx264 @ 0x1c25ea0] [0mref B L1: 92.7% 7.3%
[1;36m[libx264 @ 0x1c25ea0] [0mkb/s:249.97
[0m
视频比较长的话,运行时间会稍长,建议把视频下载到本地预览
# display the output video
import cv2
import imageio
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML
import warnings
# video display function
def display(driving, fps, size=(8, 6)):
fig = plt.figure(figsize=size)
ims = []
for i in range(len(driving)):
cols = []
cols.append(driving[i])
im = plt.imshow(np.concatenate(cols, axis=1), animated=True)
plt.axis('off')
ims.append([im])
video = animation.ArtistAnimation(fig, ims, interval=1000.0/fps, repeat_delay=1000)
plt.close()
return video
# Display the output video
# 视频比较长的话,运行时间会稍长,建议把视频下载到本地预览,视频保存路径为'/home/aistudio/work/PaddleGAN/applications'
video_path = 'guanji.mp4'
video_frames = imageio.mimread(video_path, memtest=False)
# 获得视频的原分辨率
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
HTML(display(video_frames, fps).to_html5_video())
基于PaddleGAN精准唇形合成实现持枪人讲电话已关机
首先帮大家总结一波:让图片会说话、视频花式配音的魔法–Wav2lip的使用只用三步:
贴心的送上项目传送门:PaddleGAN 记得点Star关注噢~~
PaddleGAN是只能做「对口型」的应用么?NONONO!当然不是!!
接下来就给大家展示下PaddleGAN另外的花式应用,如各类图形影像生成、处理能力。
人脸属性编辑能力能够在人脸识别和人脸生成基础上,操纵面部图像的单个或多个属性,实现换妆、变老、变年轻、变换性别、发色等,一键换脸成为可能;
动作迁移,能够实现肢体动作变换、人脸表情动作迁移等等等等。
强烈鼓励大家玩起来,激发PaddleGAN的潜能!
欢迎加入官方QQ群(1058398620)与各路技术高手交流~~