[SadTalker] AIで画像をしゃべらせる [リップシンク]

2023年3月25日土曜日

Artificial Intelligence

本記事では、SadTalkerと呼ばれる機械学習手法を用いて任意の顔画像を任意の音声に合わせて喋らせる方法をご紹介します。

eyecatch
出典: winfredy/sadtalker

SadTalker

概要

SadTalkerは、単一の顔画像と音声から、音声に合わせた発話を行う動画を生成するTalking Head Generation技術です。

従来技術は、2Dモーションフィールドからの学習が原因で不自然な頭の動きや、ゆがんだ表情が含まれる場合がありました。一方で、3D情報を明示的に使用すると、表現が硬直したり映像に一貫性がなくなる場合がありました。

SadTalkerでは、音声から3DMMの3Dモーション係数(頭のポーズ、表情)を生成し、Talking Headの生成のための3D-aware face renderを変調し、係数と3Dレンダリングされた顔の両方を抽出することにより、音声から正確な表情を学習しています。

また、音声から正確な表情を学習するためExpNetと構築し、Head poseの合成には、PoseVAEを設計しビデオを合成することで、生成するモーション及び、ビデオの品質の情報を実現しています。

Architecture
出典: SadTalker: Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation

詳細はこちらの論文をご参照ください。

本記事では上記手法を用いて、単一画像と音声からwav2lipを動かしていきます。

デモ(Colaboratory)

それでは、実際に動かしながら画像をしゃべらせていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

初めにGithubからソースコードを取得します。

%cd /content

!git clone https://github.com/Winfredy/SadTalker

%cd /content/SadTalker
# Commits on Mar 22, 2023
!git checkout df0be73c6b24975438b98a6e4bb7ce7928505a8c

次にPythonのバージョンを変更していきます。

!update-alternatives --install /usr/local/bin/python3 python3 /usr/bin/python3.8 2  
!update-alternatives --install /usr/local/bin/python3 python3 /usr/bin/python3.9 1

!apt-get update
!apt install software-properties-common
!sudo dpkg --remove --force-remove-reinstreq python3-pip python3-setuptools python3-wheel
!apt-get install python3-pip

%cd /content/SadTalker

!export PYTHONPATH=/content/SadTalker:$PYTHONPATH 

次にライブラリをインストールします。

%cd /content/SadTalker

!python3.8 -m pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113
!python3.8 -m pip install moviepy
!python3.8 -m pip install imageio==2.4.1
!python3.8 -m pip install -r requirements.txt
!python3.8 -m pip install cmake==3.25.2
!python3.8 -m pip install boost==0.1
!python3.8 -m pip install dlib-bin
!python3.8 -m pip install basicsr==1.4.2
!python3.8 -m pip install facexlib==0.2.5
!python3.8 -m pip install kornia==0.6.10
!python3.8 -m pip install face-alignment==1.3.5 yacs==0.1.8
### install gpfgan for enhancer
!python3.8 -m pip install git+https://github.com/TencentARC/GFPGAN

最後にライブラリをインポートします。

%cd /content/SadTalker

import glob
import matplotlib.pyplot as plt
from PIL import Image

from moviepy.video.fx.resize import resize
from moviepy.editor import VideoFileClip

以上で環境セットアップは完了です。

学習済みモデルのセットアップ

ここでは、論文発表元が公開している学習済みモデルをダウンロードしていきます。

%cd /content/SadTalker

!mkdir ./checkpoints  

!wget https://github.com/Winfredy/SadTalker/releases/download/v0.0.1/auido2exp_00300-model.pth -O ./checkpoints/auido2exp_00300-model.pth
!wget https://github.com/Winfredy/SadTalker/releases/download/v0.0.1/auido2pose_00140-model.pth -O ./checkpoints/auido2pose_00140-model.pth
!wget https://github.com/Winfredy/SadTalker/releases/download/v0.0.1/epoch_20.pth -O ./checkpoints/epoch_20.pth
!wget https://github.com/Winfredy/SadTalker/releases/download/v0.0.1/facevid2vid_00189-model.pth.tar -O ./checkpoints/facevid2vid_00189-model.pth.tar
!wget https://github.com/Winfredy/SadTalker/releases/download/v0.0.1/shape_predictor_68_face_landmarks.dat -O ./checkpoints/shape_predictor_68_face_landmarks.dat
!wget https://github.com/Winfredy/SadTalker/releases/download/v0.0.1/wav2lip.pth -O ./checkpoints/wav2lip.pth
!wget https://github.com/Winfredy/SadTalker/releases/download/v0.0.1/mapping_00229-model.pth.tar -O ./checkpoints/mapping_00229-model.pth.tar
!wget https://github.com/Winfredy/SadTalker/releases/download/v0.0.1/BFM_Fitting.zip -O ./checkpoints/BFM_Fitting.zip
!wget https://github.com/Winfredy/SadTalker/releases/download/v0.0.1/hub.zip -O ./checkpoints/hub.zip
!unzip ./checkpoints/hub.zip -d ./checkpoints/
!unzip ./checkpoints/BFM_Fitting.zip -d ./checkpoints/

Inference

それでは、画像と音声データからwav2lipを実行します。

まず、Web上から画像を取得します。

%cd /content/SadTalker

!wget -c https://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Leonardo_da_Vinci_-_Mona_Lisa.jpg/1200px-Leonardo_da_Vinci_-_Mona_Lisa.jpg \
      -O ./examples/source_image/my_img.jpg

推論を実行します。

!python inference.py \
  --driven_audio ./examples/driven_audio/RD_Radio31_000.wav \
  --source_image ./examples/source_image/my_img.jpg \
  --result_dir ./my_results

出力結果は以下の通りです。
音声に合わせて口元と表情が変化する動画が生成されています。

まとめ

本記事では、SadTalkerを用いて単一画像を音声に合わせて喋らせてみました。

主観的で定性的な表現ですが、従来技術に比べ、口元や顔全体の動きが自然で且つ、滑らかになっている印象です。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - SadTalker: Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation

2. GitHub - winfredy/sadtalker

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology