1.はじめに
今回ご紹介するのは、ml4aというPythonライブラリに含まれている、定番の「1枚の顔画像を音声から動かす」 wav2lip という技術です。
2.ml4aとは?
ml4aは、機械学習でアートを作成するためのPythonライブラリで、人気の高い深層学習のモデルを簡単なAPIで動かすことができます。
例えば、実写をアニメ化する Cartoonization、実写を悪夢に変換する deepdream、実写をスケッチに変換する photosketch、絵のスタイル転送する style_transfer、画像を生成する styleGAN、そして wav2lip など様々なモデルを簡単なAPIで動かすことが出来ます。
それでは、早速コードを動かしてみましょう。
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、セットアップを行います。ml4aをインストールして、ライブラリを3つインポートするだけで準備は完了です。残りは、サンプルデータのダウンロードとサンプリング・レートを自動チェックしたかったので関数を1つ定義しているだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#@title セットアップ # ml4aインストール !pip install tensorflow==1.15.0 !pip install imageio==2.4.1 !pip3 install --quiet ml4a # ライブラリ・インポート from ml4a import audio from ml4a import image from ml4a.models import wav2lip # サンプルデータ・ダウンロード import gdown gdown.download('https://drive.google.com/uc?id=1JxpWvO7ssUbO3O_4Wvqf-tTa23GiP-1Y', './data.zip', quiet=False) ! unzip data.zip # サンプリング・レート取得関数 def get_rate(file_path): import wave wf = wave.open(file_path, "r") fs = wf.getframerate() return fs |
さあ、後は image に顔画像ファイルのpath(jpg or png)を、audio に音声ファイルのpath(wav)を設定すれば、一発で動きます。簡単!
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#@title wav2lip変換 image = './image/03.jpg' #@param {type:"string"} audio ='./audio/coffe.wav' #@param {type:"string"} rate = get_rate(audio) wav2lip.run(image, audio, sampling_rate = rate, output_video = 'output.mp4', pads = [0, 10, 0, 0], resize_factor = 2, crop = None, box = None) |
作成した動画を再生します。
1 2 3 4 5 6 7 8 9 10 |
#@title 動画の再生 from IPython.display import HTML from base64 import b64encode mp4 = open('output.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つやってみましょう。今度は、image=’./image/01.jpg’, audio=’./tenki.wav’ と設定します。
口は音声と連動して自然な感じで動いています。
では、また。
(オリジナルgithub : https://github.com/ml4a/ml4a)
Google Colabで実行しようとしましたがエラーでできませんでした。
修正をお願いできないでしょうか?
高橋さん
情報ありがとうございます。修正しました。改めてお試しください^^