こんにちは、いりすです。
StableDiffusionで作った一枚絵をブラウザ上で顔認識して動かすVTuberアプリのプロトタイピングをしたので、解説をします。
成果物:
良い感じにスピードアップしてVTuber感出てきた pic.twitter.com/gGwhjSzk2F
— いりす (@irisuinwl) 2022年9月18日
概要
やったことは以下です。
- StableDiffusionで良い感じのキャラを作る
- pkhungurnさんの
talking-head-anime-3
を使って、blednshapeを入力にキャラクターの顔を動かすAPIを作成する mocap4face
で顔認識 -> blendshapeにして先述のAPIに食わせて結果を表示させる
今回利用したrepo
改変したコード
frontend:
- Running:
cd js-example npm install && npm run dev
backend:
- READMEに書いてある通りにモデルを持ってくる
- Running:
DIR=$(pwd) docker compose -f docker-compose-api.yaml up
拡散生成モデルを使ってキャラクターを作る
まず、動かすためのキャラクターを作りました。以下です:
使った環境は、Stable Diffusion Web UI (ModelはWaifu Diffusion) と TrinArt です。
まず、txt2imgでやってみましたが、全然正面を向いた構図にならなかったので、img2imgにしました。
雑にラフを描いたのが以下です:
img2imgで元にした絵 pic.twitter.com/C4dDs44iAP
— いりす (@irisuinwl) 2022年9月15日
これを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でアプリを再開発しました。
talking-head-anime-3をstreamlitで動かせるようにした。 pic.twitter.com/x8H0BOLmBr
— いりす (@irisuinwl) 2022年9月17日
(何故かこの動画を貼ったらTwitterがロックされておこだった)
code:
(間違えてfork元のrepoにpr投げてて恥ずかしかった)
talking-head-anime-3をAPIにする
大体のモデル推論の仕組みは理解できたのでAPI化します。
今回は簡単に実装するため、パラメーターをリクエストで送って、画像のバイナリをレスポンスするAPIを作ります。
作ったコードは最初に提示したURLにあります。
ちょっと工夫したところは以下です
- CORS
- CORSをちゃんと設定しないと画像が表示されない(雑にfetchでno-corsにしたら表示されない)ので、
flask-cors
を使いました。
- CORSをちゃんと設定しないと画像が表示されない(雑にfetchでno-corsにしたら表示されない)ので、
- PytorchのPerformance Tuning
mocap4faceを使いWeb上で顔認識させて推論結果の画像を表示させる
最後にmocap4faceで顔認識させて得られたblendshapeから、先ほど作ったAPIのリクエストを作り、推論された画像を表示します。
基本的にはサンプルアプリに以下の処理を追加しました:
やってみてどうだったか
ちゃんと顔認識させてキャラクターが動くアプリケーションが作れました。
Webブラウザ上で完結するWebカメラ一つと一枚絵でVの者になれるアプリのプロトタイプは出来たんじゃないかなって思います。
しかし、試行錯誤しながらスピードアップさせましたが、結構カクついてます。
mocap4faceはTensorflowを使っており同じく推論してスムーズなので高速化の方法を考えたいです。
また、VTubing Appを初めて作ってみましたが、バーチャルアバターの実在性が一つの品質であり、
それを高めるためにアプリケーションのlatencyが非常に重要だということが分かりました。
VTubing Appを作ってる方々はすごいなと改めて感じました(IRIAMとかはよく作られているなと感じます)
今後の展望
作っていく上で課題が見えたのでそれをまとめます:
- mocap4faceの移行
- mocap4faceはREADMEにある通りもうメンテされてません(公式サイトも消えてます)
- 移行先としてkaleidokitにするか、MeFaMoで全てPythonで書いてしまおうか考え中です