アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【PythonDebian
Wav2Lipのオープンソース版で静止画の口元のみを動かして喋らせる
POSTED BY
2025-08-26

以前、静止画をしゃべらせるエンジンとしてSadTalkerを実装してみたがこれは顔全体がやや不自然に動くので、口元が動くだけにできないかな?と調べたところWav2Lipの昔のバージョンがそんな感じらしいので、実装してみたメモ。

1、Python3.8の仮想環境を作成し入る

【Ubuntu】プロジェクトごとに複数のPythonバージョンを使い分ける

のとおり。以下のようにする。

mkdir wav2lip_work
cd wav2lip_work
python3.8  -m venv venv
source ./venv/bin/activate
which python
python -V

2、静止画を、用意した音声データと同じ秒数の動画に変換する

SadTalkerと違い、Wav2Lipは入力が動画データであるため、写真をしゃべらせたい場合動画に変換する必要がある。また、Wav2Lipの入力画像は16:9が安定するので、その変換も同時に行う。

ffmpeg-pythonを導入する。

pip install ffmpeg-python

顔画像がface.jpg、音声がvoice.wav、出力動画をface.mp4とすると、以下のコードで作成できる。

import ffmpeg

image = "face.jpg"
audio = "voice.wav"
output = "face.mp4"

# 音声の長さを取得
probe = ffmpeg.probe(audio)
duration = float(probe["format"]["duration"])

(
    ffmpeg
    .input(image, loop=1, framerate=25)
    .output(output,
            t=duration,
            vcodec="libx264",
            pix_fmt="yuv420p",
            r=25,
            vf="scale=-2:720:force_original_aspect_ratio=decrease,"
               "pad=1280:720:(1280-iw)/2:(720-ih)/2")
    .run(overwrite_output=True)
)

こうすると、音声voice.wavと同じ秒数の動画face.mp4が16:9映像比で出力される。これで入力データの準備は整った。

3、プレトレーニング済みのモデルデータをダウンロードする

wav2lip_gan.pthを取得する必要がある。これは色々なサイトにあるが、当方はkaggle.comにユーザ登録してダウンロードした。

https://www.kaggle.com/datasets/blackpinkai/wav2lip?resource=download

Zipがダウンロードされるので解凍し、wav2lip_gan.pthを取得する。

s3fd.pthを取得する必要があり、これは以下から直接ダウンロードできた。

wget "https://www.adrianbulat.com/downloads/python-fan/s3fd-619a316812.pth" -O "s3fd.pth"

4、OpenSource版のWav2Lipをcloneし、モデルデータを配置する

git clone https://github.com/zabique/Wav2Lip
mv wav2lip_gan.pth Wav2Lip/checkpoints
mv s3fd.pth Wav2Lip/face_detection/detection/sfd

5、必要なモジュールをインストールする

pip install https://raw.githubusercontent.com/AwaleSajil/ghc/master/ghc-1.0-py3-none-any.whl
cd Wav2Lip
pip install -r requirements.txt
pip install -q youtube-dl
pip install librosa==0.9.1

これで準備は整ったので、いよいよリップシンク実行。

6、実行

cd Wav2Lip
python inference.py --checkpoint_path checkpoints/wav2lip_gan.pth --face "../face.mp4" --audio "../voice.wav" --outfile "../output.mp4"

無事output.mp4が出力され、口元だけがその音声でパクパク動く動画が作成できた!

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

【キーワード検索】