ottijp blog

会議でリアルタイムに美少女を受肉する

  • 2024-12-08

これは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でカメラ入力映像も含めて転送するとラグが大きすぎたため.)

動画作成にあたり,以下のものをライセンスに準拠して利用しています.

仕組み

以下のOSSを利用しました.

構成

structure

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の引数に渡します.

girl

映像,音声のルーティング

映像はwindowsに接続したカメラをソースとして,FLIPがリアルタイム変換してウィンドウに表示します.

flip

このスクリーンをOBSでキャプチャして,NDIという仕組みでローカルネットワーク上に配信します.DistroAVを導入することで実現できます. macでもOBSを使い,windowsのOBSがNDIで配信した映像をシーンに追加します.

windows側のOBS obs windows

mac側のOBS(NDI映像の右半分だけになるようにフィルタでクロッピングしています) obs mac

音声はmacに接続したマイクをソースとして,VCCClientで変換して仮想オーディオデバイスであるBlackHoleに出力しています.

vcclient

最後にMeetなどの会議ツールで,映像入力をOBSのバーチャルカメラ,音声をBlackHoleにすればOKです.

meet

注意点

FLIPのcamera.batは開始時のカメラの初期フレームをベースとして扱うようで,変な顔(角度)から始まるとその後の変換もきれいになりません. camera.batを起動する瞬間に,カメラに対して真正面(というかセッション中に一番発生する角度)で真顔で目を開いた状態になっているとよいです.証明写真を取るような緊張感があります.

また,手などで顔が隠れたりカメラからフレームアウトして顔が認識できなくなると,変換された顔がグチャグチャになってしまうので, 会議相手が失神してしまわないように十分注意しなければならず,これも結構な緊張感があります.

あと,環境に依るとは思いますが,私の環境ではVCClientによる音声変換の遅延が1秒近くあったので,映像をそれに合わせて(mac側のOBSで)遅延レンダリングしました. それにより映像と音声がある程度同期するようにはなったのですが,正直リアルタイムのやりとりで1秒の遅延は大きすぎて,相手との会話がスムーズにできません. 遅延を減らす方法を考えたいです. (ただし,FLIPの遅延は小さく,たった1枚の画像からある程度の角度まで生成して映像を作ってくれるので,本当にすごいなと感じました.)


ottijp
都内でアプリケーションエンジニアをしています
© 2025, ottijp