基于PaddleGAN精准唇形合成实现持枪人讲电话已关机

基于PaddleGAN精准唇形合成实现持枪人讲电话已关机

基于PaddleGAN精准唇形合成实现持枪人讲电话已关机

宋代著名诗人苏轼「动起来」的秘密

就在上周,坐拥百万粉丝的独立艺术家大谷Spitzer老师利用深度学习技术使宋代诗人苏轼活过来,穿越千年,为屏幕前的你们亲自朗诵其著名古诗~ 点击量近百万,同时激起百万网友热议,到底是什么技术这么牛气?
基于PaddleGAN精准唇形合成实现持枪人讲电话已关机_第1张图片

PaddleGAN的唇形迁移能力–Wav2lip

铛铛铛!!飞桨PaddleGAN这就来给大家揭秘,手把手教大家如何实现唇型的迁移,学习过本项目的你们,从此不仅能让苏轼念诗,还能让蒙娜丽莎播新闻、新闻主播唱Rap… 只有你想不到的,没有PaddleGAN做不到的!

本教程是基于PaddleGAN实现的视频唇形同步模型Wav2lip, 它实现了人物口型与输入语音同步,俗称「对口型」。 比如这样:

基于PaddleGAN精准唇形合成实现持枪人讲电话已关机_第2张图片

不仅仅让静态图像会「说话」,Wav2lip还可以直接将动态的视频,进行唇形转换,输出与目标语音相匹配的视频,自制视频配音不是梦!

本次教程包含四个部分:

  • Wav2lip原理讲解
  • 下载PaddleGAN代码
  • 唇形动作合成命令使用说明
  • 成果展示

若是大家喜欢这个教程,欢迎到Github PaddleGAN主页点击star呀!下面就让我们一起动手实现吧!

Wav2lip模型原理

Wav2lip实现唇形与语音精准同步突破的关键在于,它采用了唇形同步判别器,以强制生成器持续产生准确而逼真的唇部运动。

此外,该研究通过在鉴别器中,使用多个连续帧而不是单个帧,并使用视觉质量损失(而不仅仅是对比损失)来考虑时间相关性,从而改善了视觉质量。

该wav2lip模型几乎是万能的,适用于任何人脸任何语音任何语言,对任意视频都能达到很高的准确率,可以无缝地与原始视频融合,还可以用于转换动画人脸,并且导入合成语音也是可行的

下载PaddleGAN代码

# 下载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/

唇形动作合成命令使用说明

重点来啦!!本项目支持大家上传自己准备的视频和音频, 合成任意想要的逼真的配音视频!!基于PaddleGAN精准唇形合成实现持枪人讲电话已关机_第3张图片

只需在如下命令中的face参数audio参数分别换成自己的视频和音频路径,然后运行如下命令,就可以生成和音频同步的视频。

程序运行完成后,会在当前文件夹下生成文件名为outfile参数指定的视频文件,该文件即为和音频同步的视频文件。本项目中提供了demo展示所用到的视频和音频文件。具体的参数使用说明如下:

  • face: 原始视频,视频中的人物的唇形将根据音频进行唇形合成–通俗来说,想让谁说话
  • audio:驱动唇形合成的音频,视频中的人物将根据此音频进行唇形合成–通俗来说,想让这个人说什么
# !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的使用只用三步

  1. 安装Paddle环境并下载PaddleGAN
  2. 选择想要「配音/对口型」的对象以及音频内容
  3. 运行代码并保存制作完成的对口型视频分享惊艳众人

贴心的送上项目传送门:PaddleGAN 记得点Star关注噢~~

除了嘴型同步,PaddleGAN还有哪些魔法?

PaddleGAN是只能做「对口型」的应用么?NONONO!当然不是!!

基于PaddleGAN精准唇形合成实现持枪人讲电话已关机_第4张图片

接下来就给大家展示下PaddleGAN另外的花式应用,如各类图形影像生成、处理能力

人脸属性编辑能力能够在人脸识别和人脸生成基础上,操纵面部图像的单个或多个属性,实现换妆、变老、变年轻、变换性别、发色等,一键换脸成为可能;

动作迁移,能够实现肢体动作变换、人脸表情动作迁移等等等等。

强烈鼓励大家玩起来,激发PaddleGAN的潜能!

基于PaddleGAN精准唇形合成实现持枪人讲电话已关机_第5张图片
基于PaddleGAN精准唇形合成实现持枪人讲电话已关机_第6张图片

欢迎加入官方QQ群(1058398620)与各路技术高手交流~~

基于PaddleGAN精准唇形合成实现持枪人讲电话已关机_第7张图片

你可能感兴趣的:(livingbody,paddlepaddle,PaddleGAN,飞桨)