irisuinwl’s diary

サークル不思議(略)入巣次元の、数学や技術的なことを書きます。

拡散生成モデルはVTuberを作るか?

こんにちは、いりすです。

StableDiffusionで作った一枚絵をブラウザ上で顔認識して動かすVTuberアプリのプロトタイピングをしたので、解説をします。

成果物:

概要

やったことは以下です。

  • StableDiffusionで良い感じのキャラを作る
  • pkhungurnさんのtalking-head-anime-3を使って、blednshapeを入力にキャラクターの顔を動かすAPIを作成する
  • mocap4faceで顔認識 -> blendshapeにして先述のAPIに食わせて結果を表示させる

今回利用したrepo

github.com

github.com

改変したコード

frontend:

github.com

  • Running:
cd js-example
npm install && npm run dev

backend:

github.com

  • READMEに書いてある通りにモデルを持ってくる
  • Running:
DIR=$(pwd) docker compose -f docker-compose-api.yaml up

拡散生成モデルを使ってキャラクターを作る

まず、動かすためのキャラクターを作りました。以下です:

使った環境は、Stable Diffusion Web UI (ModelはWaifu Diffusion) と TrinArt です。

まず、txt2imgでやってみましたが、全然正面を向いた構図にならなかったので、img2imgにしました。

雑にラフを描いたのが以下です:

これをWaifu Diffusionで良い感じの生成をしてもらいます。

prompt: girl, portrait, face on front, silver hair, fox ears, pixiv ranking, Kuudere, Azurlane, centering, gothic dress

出力結果をさらにTrinArtのimg2imgにinputとして画像生成します(promptは同一):

talking-head-animeで動かすための顔の位置が決まっているので、下側を雑に描きます:

Strength低めにして、TrinArtにインプットし、最初に提示した画像が出来上がります。

talking-head-anime-3を試す

作成した画像でtalking-head-anime-3が動くかを確認します。

元のリポジトリのnotebookを使っても良いですが、後々APIにする上で内部実装を理解するために、streamlitでアプリを再開発しました。

(何故かこの動画を貼ったらTwitterがロックされておこだった)

code:

github.com

(間違えてfork元のrepoにpr投げてて恥ずかしかった)

talking-head-anime-3をAPIにする

大体のモデル推論の仕組みは理解できたのでAPI化します。

今回は簡単に実装するため、パラメーターをリクエストで送って、画像のバイナリをレスポンスするAPIを作ります。

作ったコードは最初に提示したURLにあります。

ちょっと工夫したところは以下です

  • CORS
    • CORSをちゃんと設定しないと画像が表示されない(雑にfetchでno-corsにしたら表示されない)ので、flask-corsを使いました。
  • PytorchのPerformance Tuning
    • APIにリアルタイム推論させて画像をAPIで返すので結構遅い(FPSが低い)です。なので、なるべくチューニングをします。
      • 100msでも10fpsです(60fpsを実現するには16msにしないといけない)
    • チューニングの際にはpytorchの公式documentを参考にしました。基本的にTensor計算をjitにしました。

pytorch.org

mocap4faceを使いWeb上で顔認識させて推論結果の画像を表示させる

最後にmocap4faceで顔認識させて得られたblendshapeから、先ほど作ったAPIのリクエストを作り、推論された画像を表示します。

基本的にはサンプルアプリに以下の処理を追加しました:

やってみてどうだったか

ちゃんと顔認識させてキャラクターが動くアプリケーションが作れました。

Webブラウザ上で完結するWebカメラ一つと一枚絵でVの者になれるアプリのプロトタイプは出来たんじゃないかなって思います。

しかし、試行錯誤しながらスピードアップさせましたが、結構カクついてます。

mocap4faceはTensorflowを使っており同じく推論してスムーズなので高速化の方法を考えたいです。

また、VTubing Appを初めて作ってみましたが、バーチャルアバターの実在性が一つの品質であり、

それを高めるためにアプリケーションのlatencyが非常に重要だということが分かりました。

VTubing Appを作ってる方々はすごいなと改めて感じました(IRIAMとかはよく作られているなと感じます)

今後の展望

作っていく上で課題が見えたのでそれをまとめます:

  • mocap4faceの移行
    • mocap4faceはREADMEにある通りもうメンテされてません(公式サイトも消えてます)
    • 移行先としてkaleidokitにするか、MeFaMoで全てPythonで書いてしまおうか考え中です

github.com

github.com

  • latency改善
    • 結構カクつくので、原因究明とパフォーマンスチューニングを行います
  • モデルの理解
    • 今回、すでにあるモデルを呼び出すのみで、モデルの理解をしていません。
    • モデルのアーキテクチャを理解することで、アーキテクチャ改善などの選択肢を取れるので、正しく理解したいです。