AI生成した絵で爆速でVTuberになってみる

この記事は[NTTテクノクロス Advent Calender 2023](https://qiita.com/advent-calendar/2023/ntt-tx)の24日目の記事です。
 
# はじめに
***Happy Holidays!***

こんにちは、NTTテクノクロスの田中麻斗です。
普段は現場作業DXを実現するためにウェアラブルデバイスやスマホアプリなどをタッチポイントに工事現場やプラント施設などに伺ってシステム化の提案をしたり、検証を実施したり、製品開発をしたりと幅広い業務に従事しています。
 
こういう記事の執筆は初めてなので、イマイチな点を見つけた場合はくれぐれも優しくDisっていただけると助かります。
 
真面目でカッコいい話はきっと他の方々がしてくれているはずなので、今回は業務とは一切関係のないエンタメ寄りの話をしようと思います。
 
# みなさんご存じ「VTuber」
皆さん、ご存じですか、VTuber。流石にご存じですね。

2018年辺りがVTuber元年と言われて久しいですが、その頃には、モデルを用意するのにもそれなりにハードルが高く、物珍しい存在でした。
しかし、今ではツールや環境の整備によって爆発的に数が増え、その辺の一般の方や学生が趣味でVTuberをやっているような誰でも始めやすい存在になっていて、一般化に驚くばかりです。筆者の周りでもいつの間にか友人が駆け出しVTuberになっていたり、思っている以上に身近な存在になっているようです。
 
手軽になったとはいいつつも、真面目にVTuber活動をしようと思ってLive2Dモデルを用意しようとすると、自力でイラストやモデルを用意できない場合は、イラストに数万円、モデリングに数万円、それぞれの納期が1-2ヶ月となかなかに始めたいと思ったその日から、というのは難しそうです。
 
本記事では、そこそこのスペックのPCとスマートフォン(iPhone)があれば思い至ったその日にVTuber(もどき?)になれる方法を紹介したいと思います。
 
# 必要なもの
* そこそこのスペックのNvidia製GPUを搭載したPC
  * GPUはGeForce RTX 2080以上推奨
* iPhoneX以降のiPhone
* [iFacialMocap](https://apps.apple.com/jp/app/ifacialmocap/id1489470545)(iOSアプリ、980円、トライアル版有)
 
## 参考までに筆者の環境
* 主にゲーム用途のデスクトップPC
  * OS: Windows 11 Pro
  * CPU: AMD Ryzen 7 7700X
  * GPU: GeForce RTX 4080 16GB
  * RAM: 64GB
* iPhone 11 Pro
 
# 立ち絵の用意
まず、立ち絵を用意しましょう。筆者はまともな絵が描けないので、生成AIにお願いしましょう。
今回は、先日`DALL-E3`が利用できるようになった`Bing Image Creator`で立ち絵を生成してみたいと思います。
 
試しに弊社のイメージキャラクターっぽいのを生成してもらいましょう。
HPから説明文を引用しつつ、プロンプトは

「NTTテクノクロス株式会社のイメージキャラクター NTTテクノクロス株式会社はNTT研究所の技術を軸に世の中の先端技術とサービスを掛け合わせ価値を提供することをミッションとする会社です」

でいいですかね。
 
![AI生成した絵](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/d186974a-3095-b034-4935-79f852649a18.png)

 
**kawaii!!**
 
欲を言うのであれば、手に持っているノートパソコンのようなものの背面にあるマークがダイナミックループ(NTTのロゴのアレ)になっていると100点ですね。当然、ロゴの利用規約的に怒られそうですが。
 
今回は背景について特に指定せずに出力していますが、プロンプトに「背景は単純な白色」などを付け加えると背景を切り抜く加工が楽になるのでおすすめです。

尚、`Bing Image Creator`で出力される画像は、jpeg形式なので「背景は透明」と指定すると透明に見える人には透明に見えるけど透明じゃない画像を出力してくれます。当然、透明ではないので、単色を指定してくりぬいた方が楽です。
 
参考画像：

![透明じゃない透明背景](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/b3748840-9128-2103-ec26-72467478b1b8.jpeg)

 
# 立ち絵を動かす
[Talking Head Anime from A Single Image 3](https://github.com/pkhungurn/talking-head-anime-3-demo)というプロジェクトを使って立ち絵を動かしていきたいと思います。
 
## 立ち絵の下準備
利用する立ち絵には[いくつかの条件](https://github.com/pkhungurn/talking-head-anime-3-demo#contraints-on-input-images)があるようなので、生成AIで出力した画像を条件に合うように少し加工します。

主には、

* 背景がアルファチャンネル(透過)であること
* キャラクターの顔の位置が画像の上半分の128x128の縮尺に収まっていること

が守れていると上手く動作すると思います。
 
![加工した画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/64a50572-250f-a241-c867-65f91b391120.png)


体や手の位置についての指定もありますが、正面の画像を指定した場合に生成AIが出力しがちなバストアップの画像でも以下のように顔の位置、縮尺が条件と一致するように加工できれば概ね上手く動作しました。
 
参考画像：

![バストアップのみ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/5ede222d-f9bf-8d66-79d0-3ae2af988dd8.png)


## 動作環境の用意
動作環境は[こちら](https://github.com/pkhungurn/talking-head-anime-3-demo)に示された通りのPython環境ですが、めんどくさいのでAnacondaで構築してしまいます。
 
まずは、[プロジェクト](https://github.com/pkhungurn/talking-head-anime-3-demo)のソースコードをダウンロードして任意の場所に展開します。
以降の手順は`C:\talking-head-anime-3-demo`にソースコードを展開した前提で記載します。

動作に使用するモデルファイルはgithub上ではなく、プロジェクトの作者の[dropbox上にある](https://github.com/pkhungurn/talking-head-anime-3-demo#download-the-models)ので、そちらからダウンロードします。([直リンク](https://www.dropbox.com/s/y7b8jl4n2euv8xe/talking-head-anime-3-models.zip))

ダウンロードしたモデルファイル(`standard_float`などのフォルダ)をフォルダごと`C:\talking-head-anime-3-demo\data\models`配下に入れます。

![モデルの配置先](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/6af91aec-55c3-ad36-87f8-871df92934c7.png)
 
[Python](https://www.python.org/downloads/windows)と[Anaconda](https://www.anaconda.com/download)をそれぞれダウンロードしてインストールします。何か都合がなければ、その時の最新版、インストーラーのウィザードについてもデフォルトで問題ありません。筆者は`Python3.12.0`、`Anaconda3-2023.09-0`で環境を構築しました。
 
インストールが終わったら、`Anaconda Navigator`から`Powershell Prompt`を開きます。

![Annaconda](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/374f4a87-9a04-d8bb-6c24-b0c152f06f9f.png)
 
`Powershell Prompt`が開いたら以下のコマンドを実行して環境構築を行います。

```powershell
cd C:\talking-head-anime-3-demo      # ソースコードを展開したディレクトリに移動
conda env create -f environment.yml  # Anacondaで環境構築
```
 
## 加工した生成絵をアバターとして動かす
環境構築が正常に完了していれば、環境構築時と同様、`Anaconda Navigator`から`Powershell Prompt`を立ち上げて以下のコマンドを実行するとプログラムが立ち上がります。

```powershell
cd C:\talking-head-anime-3-demo           # ソースコードを展開したディレクトリに移動
conda activate talking-head-anime-3-demo  # Conda環境名を指定
python tha3/app/ifacialmocap_puppeteer.py # プログラムを実行
```
 
`Load Image`から画像を読み込ませます。

![load image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/8d6f2a7a-2476-75ed-6259-d4c60452e1ab.png)
 
次に手元のiPhoneでフェイストラッキングアプリの[iFacialMocap](https://apps.apple.com/jp/app/ifacialmocap/id1489470545)を立ち上げます。
なお、先日リリースされた[iFacialMocap Powered by NVIDIA Broadcast](https://apps.microsoft.com/detail/9N01FGS2ZK3X)というデスクトップアプリを使えば、iPhoneではなく、通常のWebカメラでも同様のフェイストラッキングができるようです。今回はカメラのスペック的にiPhoneの方が精度が出そうなので、iOS版のアプリでやってみようと思います。
 
アプリに画面に表示されたIPアドレスをプログラムのIPアドレス入力欄に入力して`START CAPTURE!`をクリックします。

 ![start capture](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/b5c06ea2-0906-ba56-d27b-2afbc6fc5850.png)

この状態でスマホを目の前に置いてきょろきょろしてみると...

![demo1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/9e26e06e-132c-5d3a-8d77-e7e6e167d686.gif)
 
体の動きやまばたきは反応しますが、口の開閉が反応しませんね。こう見えて筆者はめっちゃ口をパクパクしてます。
立ち絵の画像の口をよく見てみると、生成AIでの出力画像によくあるのですが、口が厳密には線で表現されておらず、境界が曖昧でした。
 
 ![口の拡大画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/dba3302c-4077-a348-dd2c-c406c89a00c0.png)
 
このような場合、口は閉じた状態の線を書き加えると上手く動作することが多いです。いくつかの画像で試したところ、開いた状態の口を書き加えた方が口の開閉に対する反応が良く、口の中の色が分かりやすくなりやすい傾向があるように感じたので、今回は開いた状態の口を書き加えてみます。

![口追記後の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/38cc3e51-ed9a-d7ce-3abc-2032196854ce.png)
 
この画像を読み込ませて動かしてみると
 
![demo2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/1008daf7-644d-f54c-e23c-82e40f4ba54c.gif)
 
いい感じに動いてますね！`Eyebrow Down Mode`などもお好みで変更するとよいです。
 
# OBSに取り込む
デスクトップ上で顔の動きに合わせて立ち絵がぐりぐりと動くようになったので、配信や動画に載せるために[OBS Studio](https://obsproject.com/)に取り込みます。
 
クロマキー合成で取り込みを行うため、プログラムの画面で背景を緑に指定します。

![green back](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/dd599a85-6b69-9eb0-767a-8da686799750.png)

`OBS Studio`上でプログラムの画面をウインドウキャプチャします。

![window capcure1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/001a911d-019c-ce6b-0e0a-44d27b8fa3bc.png)
![window capcure2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/cd5909a2-28d2-480d-8b10-27f298235397.png)
 
ウインドウキャプチャにフィルタでプログラムの不要な部分のクロップ(切り抜き)とクロマキー合成を追加します。

![crop1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/a9aba869-e808-32db-57a9-8893b21bd0a3.png)
![crop2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/b9422f7f-8d81-8ac2-fbdd-1c5233698d3a.png)
![crop2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/aba931a3-6e40-c9a1-6ec1-745e1fc559d7.png)

![chroma key1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/7494bd47-07f5-29bc-32cb-0d87a302bc86.png)
![chroma key2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/705d33d0-c725-fedd-290c-b3e5936f3987.png)

後は、任意の背景やテロップなどを付けてこんな感じにしてみました。(OBSで録画)

 ![demo3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629657/fb301453-db4a-d854-085a-c7fbaa16003a.gif)
 
また、`Microsoft Teams`などのWeb会議で今回用意したアバターを使って登場したい場合は、仮想カメラとして認識させて、アプリケーション内でカメラデバイスに仮想カメラ(OBS)を指定するとよいです。
 
# おわりに
いかがだったでしょうか。画像の加工やコマンドの実行に慣れている方であれば、1時間程度で動くアバターを手に入れることができたかと思います。
本物のLive2Dのモデルと比較すると画角や解像度に制約があったり、振り向いた時の頭部の影など元画像に存在しない部分の描画に多少の違和感はありますが、想像以上になめらかに動くと思います。
今後、同様の技術の開発が進むことで、絵が不得意であっても、好みの姿を言葉にしたり、思い浮かべるだけで手軽にアバターを手に入れられるようになりそうですね。
 
**かがくの　ちからって　すげー！**

このような簡易な方法でアバターを作って動かしてみて、「面白いな」「もう少し本格的にやってみたいな」と思えた場合、本格的なLive2Dの作成方法を@w-ryuくんが[別のアドベントカレンダーの記事](https://qiita.com/w-ryu/items/8a99e423edc93d42f5ed)で書いてくれているので、ぜひご一読いただければと思います。

明日はアドベントカレンダー最終日です。@kanaza-sさんが昨年に続き、PostgreSQL関連の記事を書いてくれるそうです。どうぞお楽しみに！
 
# 余談
今回、立ち絵の生成には`Bing Image Creator`を利用しましたが、`Bing Image Creator`を利用して生成した画像は規約で商用利用が禁止されています。
この方法で作成したアバターで「収益化まで走りきってやる！」という場合は自身で`Stable diffusion`等の環境を用意して立ち絵を生成するか、`DALL-E3`を手っ取り早く使いたいのであれば、`ChatGPT Plus`を利用して画像生成するとよいでしょう。