会議でリアルタイムに美少女を受肉する
これはInfocom Advent Calendar 2024 8日目の記事です.
会議でリアルタイムに美少女(アバター)を受肉する方法を試したので,記録しておきます.
環境
- mac
- Mac mini
- M2 Pro
- memory: 32GB
- windows
- Core i5-12400F
- memory: 32GB
- GPU: NVIDIA GeForece RTX 4070
- VCClient: 2.0.73-beta mac
- FLIP: 20240811 windows
- OBS: 30.2.3
- DistroAV: 6.0.0
サンプル
リアルタイムであることを証明できないのが残念ですが,サンプル映像をインプットにして変換したものを流すとこのようになります.
音声変換のほうが遅延があるので,映像を500ms遅延レンダリングしています. また,この動画の左側は正確にはカメラ入力ではなく,スクリーンキャプチャです.(実際にはスクリーンで映像を流し,それをカメラで撮影していますが,この動画の作成のために後述するNDIでカメラ入力映像も含めて転送するとラグが大きすぎたため.)
動画作成にあたり,以下のものをライセンスに準拠して利用しています.
- 変換元動画: 【千葉ロッテマリーンズ】 中村奨吾選手 独占インタビュー【ビーレジェンド プロテイン】 - YouTube
- 合成音声素材: あみたろの声素材工房(https://amitaro.net/)
- 美少女画像の作成に利用したstable diffusionモデル: deadman44/SD_Photoreal_Merged_Models · Hugging Face
仕組み
以下のOSSを利用しました.
- 映像変換: warmshao/FasterLivePortrait: Bring portraits to life in Real Time!onnx/tensorrt support!实时肖像驱动!
- 音声変換: w-okada/voice-changer: リアルタイムボイスチェンジャー Realtime Voice Changer
- 美少女画像作成: Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models
構成
w-okada/voice-changer(VCClient)
VCCClientのリポジトリからvcclient_mac_2.0.73-beta.zipをDLして./start_http.command
を実行するだけです.(初回起動時のみ時間がかかります.)
本当は音声変換もwindows上でやりたかったのですが,以下のように遅延があまり変わらなかったのと,うまく音声をルーティングしてmacのマイク入力にする方法が思いつかなったので,mac上で動かしています.
- macで動かすと1.0secくらい
- winで動かすと0.8secくらい
- winでサーバとして動かしmacからブラウザでアクセスすると1.5secくらい
warmshao/FasterLivePortrait(FLIP)
本家のKwaiVGI/LivePortraitをリアルタイム変換対応したものです. こちらはmacで試してもうまく動かなかったのと,どちらにせよGPUがないとパフォーマンスがでないと思うので,GPU(RTX4070)を搭載したwindowsで実行しています.
リリースページを見てFasterLivePortrait-windows-20240811.zipをDLしました.
使用前にall_onnx2trt.bat
を実行しました.実行には20分くらいかかりました.
任意の画像を使ってリアルタイム変換を開始するにはcamera.bat <source_image>
と実行するようREADMEに書いてあるのですが,これは間違っていて,最新版(2024/12/07時点)ではcamera.bat --src_image <source_image>
と実行する必要があります.
また,私の環境では実行時に以下のようなエラーが発生して正常に動作しませんでした.
C:\Users\otti\Downloads\flip>C:\Users\otti\Downloads\flip\camera.bat --src_image "C:\Users\otti\Downloads\tmpuaetx0yt.png"
source image: [C:\Users\otti\Downloads\tmpuaetx0yt.png]
use animal: []
paste_back: []
Traceback (most recent call last):
File "C:\Users\otti\Downloads\flip\run.py", line 26, in <module>
from src.pipelines.faster_live_portrait_pipeline import FasterLivePortraitPipeline
File "C:\Users\otti\Downloads\flip\src\pipelines\faster_live_portrait_pipeline.py", line 15, in <module>
import torch
File "C:\Users\otti\Downloads\flip\venv\lib\site-packages\torch\__init__.py", line 148, in <module>
raise err
OSError: [WinError 126] 指定されたモジュールが見つかりません。 Error loading "C:\Users\otti\Downloads\flip\venv\lib\site-packages\torch\lib\fbgemm.dll" or one of its dependencies.
これを解決するには,Visual Studio Communityを「MSVC v143 - VS 2022 C++ x64/x86 ビルドツール(最新)」コンポーネントにチェックしてインストールする必要があります.
cf. [OSError: WinError 126] The specified module could not be found. · Issue #131662 · pytorch/pytorch
余談ですが,依存ライブラリを調べるために昔はDependency Walkerというのを使っていたのですが,今はDependenciesというのがあるようだったので,そちらを使って調べたりしました.
Stability-AI/stablediffusion
世の中にたくさん解説記事があると思うので,使い方は割愛します. 適当に以下のような美少女を作って,FLIPのcamera.batの引数に渡します.
映像,音声のルーティング
映像はwindowsに接続したカメラをソースとして,FLIPがリアルタイム変換してウィンドウに表示します.
このスクリーンをOBSでキャプチャして,NDIという仕組みでローカルネットワーク上に配信します.DistroAVを導入することで実現できます. macでもOBSを使い,windowsのOBSがNDIで配信した映像をシーンに追加します.
windows側のOBS
mac側のOBS(NDI映像の右半分だけになるようにフィルタでクロッピングしています)
音声はmacに接続したマイクをソースとして,VCCClientで変換して仮想オーディオデバイスであるBlackHoleに出力しています.
最後にMeetなどの会議ツールで,映像入力をOBSのバーチャルカメラ,音声をBlackHoleにすればOKです.
注意点
FLIPのcamera.batは開始時のカメラの初期フレームをベースとして扱うようで,変な顔(角度)から始まるとその後の変換もきれいになりません. camera.batを起動する瞬間に,カメラに対して真正面(というかセッション中に一番発生する角度)で真顔で目を開いた状態になっているとよいです.証明写真を取るような緊張感があります.
また,手などで顔が隠れたりカメラからフレームアウトして顔が認識できなくなると,変換された顔がグチャグチャになってしまうので, 会議相手が失神してしまわないように十分注意しなければならず,これも結構な緊張感があります.
あと,環境に依るとは思いますが,私の環境ではVCClientによる音声変換の遅延が1秒近くあったので,映像をそれに合わせて(mac側のOBSで)遅延レンダリングしました. それにより映像と音声がある程度同期するようにはなったのですが,正直リアルタイムのやりとりで1秒の遅延は大きすぎて,相手との会話がスムーズにできません. 遅延を減らす方法を考えたいです. (ただし,FLIPの遅延は小さく,たった1枚の画像からある程度の角度まで生成して映像を作ってくれるので,本当にすごいなと感じました.)