【超簡単】1枚の画像と音声から口パク動画を作りたい!【EchoMimic】
はじめに
人物画像の口を発話音声に合わせて自然に動かす技術をリップシンクといいます。
2024年7月頭に非常に高性能かつ使いやすいオープンソースモデルが出てきたため、実際に使ってみたいと思います。
下記の動画は一枚の画像と、音声から作成された動画です。
かなり自然なリップシンク動画ができていると思います。
上記の動画は、下記のオープンソースモデルにて作成されました。
今回の記事では、こちらのモデルを無料版のGoogle Colabでも動作させることができるようにしました。
ちなみに、下記でデモも公開してくださっています。簡単に試すには下記で実行すると良いです。
事前準備
EchoMimicリポジトリの準備
まずは、上記のリポジトリをクローンします。
git clone https://github.com/BadToBest/EchoMimic.git
その後その中身を、GoogleDriveにアップロードしましょう。
(.git
フォルダ以外をアップロードしてください)
この時、トラブル回避のため、MyDriveの直下に「EchoMimic」フォルダを格納してください。
下記のようなディレクトリ構造になると思います
MyDrive/
└ EchoMimic/
└ ・・・(EchoMimicリポジトリの中身)
ipynbファイルの準備
続いて、下記より、Google Colabファイル(.ipynbファイル)を取得してください
下記のような画面が出ると思うので、下矢印「↓」のようなボタンからダウンロードして、「EchoMimic」フォルダにおいてください。
下記のようなディレクトリ構造になります
MyDrive/
└ EchoMimic/
├ EchoMimic_colab.ipynb
└ ・・・(EchoMimicリポジトリの中身)
リップシンクに使う入力画像と音声の準備
これは、個人で利用する画像と音声を適当に準備して、画像はimage.png
、音声はaudio.wav
として下記の場所に保存してください。
MyDrive/
└ EchoMimic/
├ asset/
| ├ images/
| | └ image.png
| └ audios/
| └ audio.wav
├ EchoMimic_colab.ipynb
└ ・・・(EchoMimicリポジトリの中身)
ちなみに今回のデモでは、下記の画像を利用します
上記の画像は、下記のモデルを利用して生成しました。
画像生成に関しては、下記の記事でご紹介していますし、普通にWebUIなどを利用しても良いと思います。また音声に関しては、Style-Bert-VITS2を利用しました。
下記のデモにて、テキストからの音声を生成できます。それを利用するのが簡単です。
また、より深くStyle-Bert-VITS2による合成音声を楽しみたい方は、下記の記事にて詳しく説明していますので、ぜひご一読ください。
今回は、下記で音声を公開してくださっている「あみたろ」さんのモデルを利用して、音声を生成させていただきました。
実験
コードの実行
EchoMimic_colab.ipynb
を実行してください。
EchoMimic_colab.ipynb
をGoogle Colabratoryアプリで開いてください。
ファイルを右クリックすると「アプリで開く」という項目が表示されるため、そこからGoogle Colabratoryアプリを選択してください。
もし、ない場合は、「アプリを追加」からアプリストアに行き、「Google Colabratory」で検索してインストールをしてください。
Google Colabratoryアプリで開いたら、一番上のセルから順番に実行していけば、問題なく最後まで動作して、画像生成をすることができると思います。
実行途中で下記のようなポップアップが表示されます。それぞれ対処が必要です
上記のポップアップが出た場合は、Google Driveの中身をマウントするための認証を求められているため、指示に合わせて認証を行ってください。
上記のようなポップアップが出た場合は、元々Google Colabに入っているモジュールのバージョンとの依存関係がおかしくなっていることによる警告ですが、(今回に限っては)「キャンセル」ボタンを押して無視することができますので、キャンセルで良いです。
上記のポップアップは、モデルの重みとモジュールのダウンロードによりディスク容量が持っていかれていることによる警告です。
今回は無料版のディスクに収まるように、モデル重みを削減しているため、無視で問題ないです。
コマンドの実行にはかなりの時間がかかります。
特に、
!git clone https://huggingface.co/asap-bb/EchoMimic_Audioacc pretrained_weights
このコマンド実行時に20GBもの重みファイルをダウンロードすることになるので、時間がかかります。気長に待ちましょう。
また、最後まで実行後、パラメータを変更して再度実行する場合は、「ランタイム」→「セッションを再起動して全て実行する」をクリックしてください。
結果の確認
実行後、下記のようなディレクトリ構造になっているかと思います。
MyDrive/
└ EchoMimic/
├ output/
| ├ {yyyymmdd}(日付)/
| | ├ {xxxx--seed_xxx-xxxxxxx}
| | ├ image_audio_512x512_1_xxxx_withaudio.mp4 | | └ image_audio_512x512_1_xxxx.mp4
├ asset/
| ├ images/
| | └ image.png
| └ audios/
| └ audio.wav
├ EchoMimic_colab.ipynb
└ ・・・(EchoMimicリポジトリの中身)
出力の動画はimage_audio_512x512_1_xxxx_withaudio.mp4
のファイルです。
普通に再生することで、下記のように、入力画像と音声から、自然な動画が生成されていることがわかります。
かなり、自然なリップシンク動画を作成できていることがわかります。
一方で、投入した画像は、もう少し全身が写っている画像でしたが、動画になると顔の部分だけ切り抜かれて動画になっています。全身が写った状態で動画にする技術はまだ難しいということでしょうか。
(元の画像のサイズが1024x1024サイズで、それを512x512のサイズの動画にしていますが、顔の部分だけ引き伸ばされている関係上、解像度が下がっている感覚がありますね)
もしかしたら、中身をいじればできるかもですが、まだそこまでできていません。
ipynbコードの解説
今回利用した、ipynbファイルの中身を簡単に解説します。
(EchoMimicリポジトリの中身は解説できるほどはわかっていないのでご容赦ください)
EchoMimic_colab.ipynb
です。
1セル目
#Google Driveのフォルダをマウント(認証入る)
from google.colab import drive
drive.mount('/content/drive')
セルの途中に認証が入ると、結構だるいので、今回は1セル目にDriveマウント認証が来るようにしました。
2セル目
%cd /content
!wget https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.4-amd64-static.tar.xz
!tar xvf ffmpeg-4.4-amd64-static.tar.xz
!chmod +x ffmpeg-4.4-amd64-static/ffmpeg
!rm -rf ffmpeg-4.4-amd64-static.tar.xz
import os
os.environ['FFMPEG_PATH'] = '/content/ffmpeg-4.4-amd64-static/ffmpeg'
!git lfs install
!git clone https://huggingface.co/asap-bb/EchoMimic_Audioacc pretrained_weights
ffmpegをEchoMimicの中身で利用するので、ダウンロードして、環境変数に追加しています。
加えて、モデルの重みデータをダウンロードしています。
実は本家の重みは下記からダウンロードすることを推奨されています。
しかしながら、こちらには、Audio Drivenでのリップシンクに必要な重みだけでなく、そのほかの顔の特徴なども利用した動画生成に利用するモデルや、低速高精度なモデルの重みなど全ての重みがアップロードされています。
そして、その容量は60GB以上になります。
その場合は、無料版のGoogle Colabでは利用することができません。
また、Google Driveに重みデータを全て、あらかじめアップロードしておき、それを読み込む方法を利用すれば、Google Colabのディスクは使わないので、一見問題なさそうです。
しかしながら、Google Driveの無料版を利用している場合、Driveのディスク容量は15GBしかないため、本家の重みも、今回利用する重み(20GB)もどちらも容量オーバになるため、Google Driveの課金が必要になります。
したがって、今回は、高速に動作する高速モードのモデルかつ、音声と画像のみから動画を生成するモデルだけに絞って、Google Colabの無料版のディスク容量にギリギリ収まるくらいまで厳選した重みを、毎回クローンしてくることで、処理を行っています。
厳選した重みは下記のリポジトリにおいています。
3セル目
# カレントディレクトリを本ファイルが存在するディレクトリに変更する。
import glob
import os
pwd = os.path.dirname(glob.glob('/content/drive/MyDrive/EchoMimic/EchoMimic_colab.ipynb', recursive=True)[0])
print(pwd)
%cd $pwd
!pwd
ここでは、カレントディレクトリを「EchoMimic」リポジトリが格納されているGoogle Drive上の場所に変更しています。
こうすることで、「EchoMimic」を自然に利用することができます。
ディレクトリ構造として、このノートブックが下記で示すDriveのフォルダに格納されている必要があります。
os.path.dirname(glob.glob('/content/drive/MyDrive/EchoMimic/EchoMimic_colab.ipynb', recursive=True)[0])
MyDriveの直下に「EchoMimic」フォルダを格納していない場合は、こちらのPathを実際に格納しているPathに変更してください。
4セル目
!pip install -r requirements.txt
!pip install accelerate
EchoMimic
にて利用するパッケージをインストールしています。
このタイミングで、2つほどポップアップが出ると思うので、「実験」の章の「コードの実行」の節で解説している通り、対処をしてください。
5セル目
#設定を行う。
config_text = """
## dependency models
pretrained_base_model_path: "/content/pretrained_weights/sd-image-variations-diffusers/"
pretrained_vae_path: "/content/pretrained_weights/sd-vae-ft-mse/"
audio_model_path: "/content/pretrained_weights/audio_processor/whisper_tiny.pt"
## echo mimic checkpoint
denoising_unet_path: "/content/pretrained_weights/denoising_unet_acc.pth"
reference_unet_path: "/content/pretrained_weights/reference_unet.pth"
face_locator_path: "/content/pretrained_weights/face_locator.pth"
motion_module_path: "/content/pretrained_weights/motion_module_acc.pth"
## deonise model configs
inference_config: "./configs/inference/inference_v2.yaml"
weight_dtype: 'fp16'
## test cases
test_cases:
"./assets/images/image.png":
- "./assets/audios/audio.wav"
"""
with open("./configs/prompts/animation_acc.yaml", "w", encoding="utf-8") as f:
f.write(config_text)
EchoMimic
では./configs/prompts
に格納されているyamlファイルの中身に各種設定が記載されています。
今回は、音声のみからリップシンクを行い、かつ、高速に動作するモデルを利用するため、その中でもanimation_acc.yaml
の設定ファイルを読み込みます。
Google Driveに格納されている設定ファイルをエディタで編集しても良いですが、面倒なのでセルから書き換えをして、上書きができるようにしています。
## dependency models
pretrained_base_model_path: "/content/pretrained_weights/sd-image-variations-diffusers/"
pretrained_vae_path: "/content/pretrained_weights/sd-vae-ft-mse/"
audio_model_path: "/content/pretrained_weights/audio_processor/whisper_tiny.pt"
## echo mimic checkpoint
denoising_unet_path: "/content/pretrained_weights/denoising_unet_acc.pth"
reference_unet_path: "/content/pretrained_weights/reference_unet.pth"
face_locator_path: "/content/pretrained_weights/face_locator.pth"
motion_module_path: "/content/pretrained_weights/motion_module_acc.pth"
上記の部分は、モデルが利用する重みが格納されているpathを指定しています。
## test cases
test_cases:
"./assets/images/image.png":
- "./assets/audios/audio.wav"
上記には、リップシンク動画を作るにあたって必要な画像と音声の組みを指定しています。
6セル目
!python -u infer_audio2vid_acc.py
EchoMimic
リポジトリの推論コードを実行しています。今回は画像と音声のみからリップシンク動画を作成し、かつ高速モードで実行するため、こちらの推論コードを実行していますが、タスクが変われば実行するコードも変わります。
まとめ
今回は、一枚の画像と音声から簡単に自然なリップシンク動画を高速かつ高性能に生成できるEchoMimicという技術を使ってみました。
こちらの技術は非常にレベルが高い技術ではありますが、一方で下記のようなアニメ画像ではうまく動画にできなかったです。そちらが少し残念ではあります。
(公式のデモなどを確認した感じでは、口などがはっきり書かれているような画像でないと難しいのかなと感じました。)
アニメ画像でも、音声からリップシンクができる技術をもしご存知な方がいらっしゃれば、教えていただけると嬉しいです。
ありがとうございました!
参考
こちらの動画を参考にさせてもらいました。
EchoMimicを使って、首揺れ&まばたきするAI美女の口パク動画を生成する方法!身振り付きのリップシンク(LipSync)・バーチャル女子アナの作り方😆
Discussion