1.はじめに
前回、1枚の顔画像を音声から動かすwav2lipという技術をご紹介しました。そうした中で今回ご紹介するのは、その動画版です。
*この論文は、2020.8に提出されました。
2.wav2lipとは?
人物動画の口を音声に合わせて動かす技術は以前から色々なものが提案されて来ましたが、学習に使用した話者の音声と動画を使えば完成度の高い動画が生成できるものの、不特定多数の話者の音声と動画を使用すると不具合が発生するため、話者毎に追加の学習が必要でした。
そこで提案されたのが wav2lip で、その概要を下記に示します。左側の四角で囲まれた部分は、音声に連動させて人物動画の口を動かす LipGAN の学習済み Generatorです。この部分だけでは学習した話者にしか使えないため、ブラッシュアップを行います。
ブラッシュアップでは、音声入力と生成動画の同期差(Sync loss)の低減と、オリジナル動画と生成動画の視覚品質差の低減(Visual Quality Discriminator)によってGeneratorのパラメータを最適化します。これによって、不特定多数の話者の音声と動画に対しても完成度の高い動画が生成できるようになります。
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、セットアップを行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#@title セットアップ # githubからコードを取得 ! git clone https://github.com/cedro3/Wav2Lip.git %cd Wav2Lip # ライブラリ・インストール ! pip install -r requirements.txt # 学習済みパラメータのダウンロード import gdown gdown.download('https://drive.google.com/uc?id=195RPsqXVhfh4QyCnaDQdf56KrGk20AUq', 'checkpoints.zip', quiet=False) ! unzip checkpoints.zip ! wget "https://www.adrianbulat.com/downloads/python-fan/s3fd-619a316812.pth" -O "face_detection/detection/sfd/s3fd.pth" |
inference.py で人物の口を音声で動かす動画を作成します。videoで動画の指定、audioで音声の指定、chinで顎の位置の指定(顎が長いほど数値を大きくします)します。
自分で用意したファイルを使う場合は、動画はvideoフォルダに、音声はaudioフォルダに、事前にアップロードしておいて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 |
#@title wav2lip video = 'page.mp4'#@param {type:"string"} audio = 'mix.wav'#@param {type:"string"} video_path = 'video/'+video audio_path = 'audio/'+audio chin = 40 #@param {type:"slider", min:0, max:60, step:5} pads = '0 '+str(chin)+' 0 0' ! python inference.py --checkpoint_path checkpoints/wav2lip_gan.pth\ --face $video_path\ --audio $audio_path\ --pads $pads |
1 2 3 4 5 6 7 8 9 |
#@title 動画の再生 from IPython.display import HTML from base64 import b64encode mp4 = open('/content/Wav2Lip/results/result_voice.mp4','rb').read() data_url = "data:video/mp4;base64," + b64encode(mp4).decode() HTML(f""" <video width="70%" height="70%" controls> <source src="{data_url}" type="video/mp4"> </video>""") |
下記ブロックを実行すると、作成した動画をダウンロードします。
1 2 3 4 5 6 7 8 9 10 |
#@title 動画のダウンロード import os import shutil from google.colab import files video_name = os.path.splitext(video) audio_name = os.path.splitext(audio) file_name = 'results/'+video_name[0]+'_'+audio_name[0]+'.mp4' shutil.copy('results/result_voice.mp4', file_name) files.download(file_name) |
もう1つやってみましょうか。今度は、videoをkoike.mp4、audioをtenki.wav、chinを10の設定で実行します。
割と自然な感じで口元を音声に連動させてくれます。
では、また。
(オリジナルgithub)https://github.com/Rudrabha/Wav2Lip