見出し画像

動くPNGTuber(MotionPNGTuber)コードをGitHubに公開するまでの思考回路の垂れ流し

 今回は「動くPNGTuber」のプログラムを作り、GitHubに公開するまでの思考なんかも合わせて垂れ流していきます。公開したリポジトリはこちら。

 記録としてXにて時系列で呟いていましたのでその時に思っていた事など思い出しつつ、コメントも添えて振り返っていこうと思います。


 まず、以前から「PNGTuber」と言う存在は認識はしており、画像数枚から作れるのでAI画像との相性は良さそうだなというのが頭の片隅にありました。そんな中、11月に革命的な「Nano Banana Pro」が発表されました。

 ここからはほぼ思いつく限りの画像を作れる状態になりましたね。AI画像を活用した「PNGTuber」ってのはAITuberでオリジナルキャラを作る1つの選択肢としてアリだな。時は満ちた。そんな中、ふとYouTubeで目に入ってきたのがこの動画。

 口がパクパクして少しのポージングの変化でここまで楽しい画が作れるなら、制作コストを考えるとショート動画などのコンテンツを作るのに最適だなと(もちろんこの動画は演者さんの面白さあってこそのクオリティですけどね)。

 思いついたら直ぐに作りましょう。口パク部分やモーションを変えた画像をAIで出力してPNGTuberを作っていきます。基本的にはポーズと口の差分を作って切り替えていく単純なものです。


 PNGTuberは画像を切り替えているだけなので、これならリアルタイムに複数同時に動かしてもPCの負荷も殆ど無いし良いのではと、試しに3つほど作って試してみました。全く問題なしですね。軽い動作が最高だ。


 せっかくなのでもう少し増やしてテスト。9つのPNGTuber同時起動とリアルタイムのリップシンクでも全然大丈夫でした。これが出来ると、ショート動画制作なんかで複数カメラで撮影して素材を一気に取れる感じなので、動画編集ソフトで美味しいところを摘まめば良さそうだななんて妄想しつつ。


 PNGTuberはピコピコと動いて可愛いなと思います。が、人間と言うものは欲が出てくるものです。これだと従来のものと変わらないし、せっかくならもう少しだけリッチな画にしたいなと。そこでAI動画を使う事を思いつきました。

 ちょうどニケさんが先鋭的な「生成AI動画を使ったAITuber」にトライされていたので、AI動画を使うのも面白いなと頭の片隅にあったんですね。


 そこからは「従来のPNGTuberからは外れる」けれどもAI動画を使う演出を考え始めました。顔の位置が固定されて居れば、口の部分だけ動かせば大丈夫かなと言うのが初期段階の発想です。


 これに関しては従来のPNGTuberより少しだけリッチに見せられるし、コードも簡単(Pythonのモジュール1つ)に実装も出来るのでなかなか良さそうだなと感じています。なのでnoteにまとめてみました。


 違う絵柄のキャラクターで試しましたが、同じように再現できたので皆さんのオリジナルキャラでも同様に動かせると思います。


 前置きが長くなりましたが、ここからが「沼」の始まりです。もう少しキャラクターも動いて欲しいなと。私は特にLive2Dモデル特有の髪がフワフワして、プルンとした瞳なんかが好きなのでキャラには有機的に動いて欲しかったんですね。


 これは動画の中での口の位置を検出して、そのトラッキング情報を渡すことで比較的簡単に実装が出来ました。実はここが落とし穴で、この動画素材の「口が小さく」「動きがゆっくり」だったので簡単だっただけでした。


 早い動きになったらこれまでのアルゴリズムでは上手く検出できずにブレるブレる。ここで口の部分の検出のプログラムをガラッと変えた記憶があります。なんとか上手くいったようです。


 口の部分の検出のプログラムの精度を更にチューニングして、かなり正確にトラッキングできるようになりました。動画スピードに対してスムージングを変えるパラメータを追加したと思います。


 Xでリアルタイム動画にリップシンクを合わせたいななんて戯言を呟いていますね。実は、またここで横道に逸れて「リアルタイムのリップシンク」のリポジトリを探して試したりしていました。思い付きで動いている。

 厳選した結果「MuseTalk」と言うリポジトリを試して、AIを使い高速化や軽量化の改造にもトライしましたが上手くいかず。4秒の動画を処理するのに7秒かかったり、口元が溶けたようになりキャラが可愛くならなかったので諦めました。リアルタイム処理って難しいですな。


 ここで、ふと思いついたのですが今までは口のPNG画像は「唇とその周りの肌の塗り足し」で作っていました。ただ、この仕様だと動画毎に口を作る必要がありますし、いちいち口部分を切り取る手間はあるのに資産性が無いなと。と言う事で動画内の口部分を消すことにしました。

 これなら口まわりの肌の部分は不要ですしPNGの使い回しが出来る。

 Xではサラッと書いていますが実は少し苦労しています。と言うのも、口部分の検出をした後に、周りの肌の色と上手くなじませる「良い塩梅」の仕様がAIに伝わりにくく画像のスクショを何枚かAIに見せて直しました。


 なんだかここまで来ると口の開閉パターンがワンパターンだと少し物足りなくなってきます。従来のPNGTuberでも感情表現として喜怒哀楽を切り替えたりもするので、ボタンを押すと口の形が切り替わる機能を入れました。


 ここまではオリジナルキャラの「トマリちゃん」の画像、1~2枚で試していたものの、もっと汎用的にするために色々な種類の絵柄やキャラと角度でパラメータ調節を入れていきます。これはその口元を消す調節の際に出来た画像の口けしアプリ。GitHubにて「mouth_erase_tuner_gui.py」として同梱しています。

 実のところ色々な画像で試しましたが、自動的になんでも上手くいくような汎用的と言うのは難しく、パーフェクトにはならないものだなと実感しました。ただ、最終的にはかなり良い感じに消せるようには調整できた。この部分からのフィードバックで自動再計算・部分修復により精度を上げる機能なんかも公開したものには盛り込んでいます。


 せっかくなら手動ではなく「感情によって自動で口の形も変えちゃえ」と言う事で実装しました。感情分析は深層学習(PyTorch、TensorFlow等)や音声処理ライブラリ(librosa等)をAIにおススメされましたが、どれも動作が重いので拒否しまくっていたらnumpyのみでシンプルにしましょうと言う結論に。

 実際の所、実写の動画の口元だと複雑な感情表現の形状がある方が良いかもしれませんが、アニメ系の場合は少し形状変化するだけでも大きく印象が変わるので、オマケ的に実装できて良かったかなと。

 AITuberのみの場合はテキストからの感情分析が出来ますが、今回は人間がアバターとしてもリアルタイムにリップシンクする事を考えて簡易的にすることにしました。ここはAITuberではプログラム部分を書き換えて、より正確な感情から形状変化させても良いかもですね。


 そんなこんなで、やっとこ出来たのでプログラムの公開に至ると言う感じです。Xでのツイートで興味を持ってくださった方も居るようですので参考になれば嬉しいです。

 バイブコーディングのみでここまでプログラムを組める時代。本当にAIのコーディング能力の向上には驚くばかりです。

 ちなみに私は実装計画に関してはGPT-5.2 賢いモデル。計画の精査&実装はClaudecode の Opus 4.5に行ってもらっています。このダブルチェックで殆どミスすることなく進みました。ドキュメントも全てClaudecodeだよ。

 また自作のAIキャラ関連のツールは色々と公開していこうと思っています。かなりニッチな独自ツールを溜め込んでいるので整理も兼ねてですね。


製作過程の振り返り、お読みいただきありがとうございました!

いいなと思ったら応援しよう!

ピックアップされています

#おすすめ

  • 102本

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
買うたび 抽選 ※条件・上限あり \note クリエイター感謝祭ポイントバックキャンペーン/最大全額もどってくる! 12.1 月〜1.14 水 まで
政治・経済・テクノロジーの情報収集効率化の為のアカウント。最近はAIツールで好奇心を満たす日々。AITuber(AIのVtuber)開発やってます。
動くPNGTuber(MotionPNGTuber)コードをGitHubに公開するまでの思考回路の垂れ流し|ろてじん
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1