弊社には数ある分科会の中に 「VTuber分科会」 という研究グループが存在しており、自分もそこで活動しています。

VTuberを研究すると言うと不思議に思われるかもしれませんが、実はVTuberというのは様々な技術の上に成り立っています。その技術を1つずつ紐解き、仕組みを理解することは意外に面白いものです。
今回はその分科会が発足して約1年が経過したということで成果発表を兼ねて、活動で得た知見をまとめてみました。
どのような活動を行ってきたのか?
「3DVTuberの動画を作る」という目的を持ってゼロからVTuberの仕組みを調べ、制作環境を用意してきました。途中半年以上コロナウィルスで出社制限がかかってしまったこともあり、動画作成までには至れなかったのですが、とても貴重な経験ができたと思っています。
活動の中で調査・用意したものは以下になります。
- 3Dアバターの制作
- トラッキング技術の検証
- 動画配信の調査
この3つの内容をまとめていきたいと思います。
3Dアバターの制作
今回は3Dモデルの作成にPixiv社の VRoid Studio というツールを使用しました。
VRoid Studioはテレビゲームのキャラメイキングの要領でモデリングを行えるところがとても素晴らしいと感じました。パラメータのスライダーを動かすだけでキャラクターの容姿を調整することができます。リギングも自動で行ってくれるので、我々は画像テクスチャさえ何とかすれば良いという嬉しい状況になりました。
そしてその後試行錯誤があり、結果生まれたのがこのVTuberです。

終わってみればなかなか無難に可愛いキャラクターが生まれました。
決してVRoid Studioを上手く使えていたわけではないのですが、同じような困難に陥ってる同士のために自分なりの工夫点を残したいと思います。
髪型の作り方
体型はスライダーで調整していくので簡単だったのですが、髪型は以下のようにマウスで線を引く要領で作っていくことになります。

髪型は自由度が高いので難所は色々あると思いますが、自分はまず髪型を狙った形にするところが苦労したので今回はそのコツを書きたいと思います。
髪型を作るとき、髪の束の1本1本を手書きしていくのでそこに集中しがちですが、実際はその前段階としてガイドというアタリを作る必要があります。ガイドは白のメッシュで表示されているもので、髪の束はガイドの上を這うように形作られます。なのでまずはガイドをちゃんと作ることが大事です。

また、ガイドは複数作ることができます。これを利用して前髪や横髪などでグループを分けて、それぞれ別々のガイドを用意してあげると色々な髪型に対応しやすいです。自分は「前髪」「横髪」「後ろ髪」「三編み」の4つに分けて作りました。
衣装の作り方
VRoid Studioでは衣装のモデルがプリセットとして色々用意されており、それを着せ替せの要領で組み合わせていきます。衣装にはそれぞれパラメータが設定されており、その数値をいじることで形状の変化も可能です。

そのままでは真っ白な服ですが、テクスチャに色を書き込むことで特徴をつけていくことができます。書き込みは下のようにVRoid Studio上でもできますし、pngで書き出して他のイラストソフトを使うこともできます。

今回自分はワンピース衣装をベースに下のようなテクスチャを作りました。大まかに緑のように部位が分けられているので、それに沿って色や模様を描いていけばそれっぽく仕上がります。

チェックの部分は透明になっています。
何故透明になっているかというと、VRoid Studioではパラメータである程度はモデルの形状を変えられますが、それは一定の範囲に限られます。その上限を越えてモデルの形状を変えたい場合、一部を透明にすることで形を整えていくことになります。今回の場合、若干スカートを短く、首元を見えるようにしている調整が行われています。
揺れものの作り方
今回自分はワンピースをベースにして、セーラー服を作ることにしました。基本的な形状は同じなのですが、ワンピースには胸元のリボンがないのでそれは別の方法で解決する必要がありました。

こういう揺れものやアクセサリーを付け加える場合、髪の毛として作るのがVRoid Studioハックです。それを踏まえてリボンは以下のように作られています。先ほどのメッシュガイドが見えると思います。

これで解決と思いきや、髪の毛は頭に追従するように作られているので、リボンが胸元に固定されず頭と合わせて動いてしまっています。

これを修正するためにはBlenderを使って、リボンを頭ではなく胸に追従するようにボーン構造を変更する必要があります。まずはBlenderにVRoid Studioの出力フォーマットであるVRMファイルを読めるようにアドオンを追加します。
saturday06/VRM_Addon_for_Blender
https://github.com/saturday06/VRM_Addon_for_Blender
アドオンを入れると以下のようにVRMファイルをBlenderにインポートできるようになります。
ここからリボンが頭に追従せず自然な感じになるように手を加えていきます。
まず、リボンが顔(Head)ではなく胸(Upper_Chest)に追従するようにボーンの親を変更します。
次にリボンが顔の影響を受けないようにボーンウェイトを0にします。
ボーンウェイトは赤に近いほど影響が強く、青に近いほど影響が弱いことを表しています。今回は完全に影響を切りたいので真っ青に塗りぬぶします。
以上で対応は完了です。

上手く設定できていればこのようにキャラクターが動いてもリボンが胸元に固定されるようになります。
トラッキング技術の検証
VTuberには多種多様な配信スタイルがありますが、どのような場合でもアバターを動かすという点は変わりません。演者の身体の動きを何かしらの方法でトラッキングし、リアルタイムにアバターに反映していきます。
自分が考えるトラッキングするべき演者の動きは以下の3つです。

今回はこの要素をどうやってトラッキングするかを調べてみました。
表情
表情のトラッキングでは ARKit を検証しました。
iPhoneでARを扱うためのSDKなのですが、顔情報の検出を行うこともできます。
最初はWebカメラと OpenCV の組み合わせを考えていました。
ですがiPhoneX以降のTrueDepthカメラは顔認証システム(Face ID)にも使われるほど優秀だということと、大手VTuber事務所でもARKitを表情のトラッキングで使用しているということで、かなりの精度の高さだろうと判断してARKitを検証対象にしました。
今度実際どちらの方が精度が良いのかを検証してみたいところではあります。
以下が検証デモになります。
このときはLive2Dの検証も同時に行っていたのでモデルが2Dになっていますが、検証には特に影響はありません。

デモを見てもらえればARKitが高い精度で顔を追従し、口・目の開閉を正確に捉えていることが分かります。デモの生身の人間はメガネをかけていますが、目のトラッキングに目立った影響が出ていないのも驚きです。
3DVTuberは最終的にPCでレンダリングが行われるので、このARKitで得た表情データは何らかの方法でiPhoneからPCに送信してUnityで使えるようにする必要があります。そのために以下のようなツールがあります。
gdssk/ARKitFaceRpc
https://github.com/gdssk/ARKitFaceRpc
このツールを使えばLANを経由してARKitで得られるパラメータをUnityに送ることができます。
指
指のトラッキングは実はまだ検証できていません。
いくつか候補はあったのですが、デバイスが用意できなかったので後回しにしています。
候補にしているデバイスは以下の2つがあります。
Noitom Hi5
グローブ型のデバイスです。
モーションキャプチャスーツ Perception Neuronを作っているNOITOM社が制作しています。

Valve Indexコントローラー
コントローラーに接触判定と触れた10指を推測する仕組みがあり、精度高くトラッキングできるようです。

身体
身体のトラッキングではViveトラッカーを検証しました。
ViveトラッカーはHTC Viveのアタッチメントであり、取り付けた物体の位置・回転を取得してVRゲームの体験の幅を広げるために開発されたデバイスです。
VTuber界ではこれを腰や足に付けて、身体のトラッキング精度を上げるという使い方をしています。

今回は上のような頭・両手・腰・両足の6点トラッキング構成の精度を検証してみました。トラッキングの制御にはバーチャルモーションキャプチャーというソフトウェアを使用しています。
バーチャルモーションキャプチャー(VMC)
https://booth.pm/ja/items/999760
Viveトラッカーは定期的に位置・回転を送信してきますが、それをそのままアバターに当てはめてしまうとトラッキングのロストやブレが出たときにアバターにノイズのような動きが現れてしまいます。それにそもそもViveトラッカーを使う前に、演者の体型やトラッカーの傾きを補正するためのキャリブレーションを行う必要があります。それらの仕組みを作るのはとても大変なのですが、バーチャルモーションキャプチャーはそれを高い水準で備えており、個人で活動している3DVTuberに良く採用されるツールとなっています。
身体を回したり、手足を大きく動かしていますが滑らかにアバターが動いているのが伝わると思います。
またバーチャルモーションキャプチャーのトラッキングデータはOSCで送信することができ、それをUnityで受け取ることでUnityの中でアバターを綺麗に動かしつつ独自のコンテンツを遊ばせることができます。トラッキングデータを受信するツールはEVMC4Uが有名です。今回はそちらも使用してみました。
EVMC4U – EasyVirtualMotionCaptureForUnity
https://booth.pm/ja/items/1801535
VMCのモーションがEVMC4Uを通してUnityで再現できているのが伝わる内容になっていると思います。
このようにViveトラッカーを使った方式は手軽な設備で身体トラッキングを行うことができます。しかし、トラッカーの設定や周囲の環境を調整しないと上手く動作しないことが多々あります。自分もそういうミスを重ねてきたのでいくつか記載したいと思います。
1つのドングルに複数のトラッカーが結びついている。

何個もトラッカーを使っていると意図せずに1つのドングルと複数のトラッカーが結びついている場合があります。そういう場合、トラッカーのペアリングが全然できず困らせられることがあります。そうならないように面倒ですが1つずつ順番にドングルを指してトラッカーの電源を入れるという手順を取るのが安全です。
2.4GHzの電波が飛び交っている。
ドングルとトラッカーは2.4GHz帯で通信しているので、Wi-Fiや他のBluetoothがたくさんある環境だと通信が安定せずトラッキングが不安定になることがあります。
鏡面の床や窓がある、日光が降り注いでいる。

Viveではベースステーションから発射される赤外線をHMD・コントローラー・トラッカーが反射することでデバイスの位置・回転を計測しています。その仕組み上、赤外線が通りづらい直射日光環境、赤外線が変に跳ね返る鏡面が多い環境ではトラッキングが不安定になりがちです。
動画配信の調査
これまでの調査でアバターと人体のトラッキング方法を用意し、それをUnityで動かすことができました。最後の工程としてUnityの画面をYouTubeに送信する方法をまとめたいと思います。
今回はUnityとYouTubeを繋ぐツールにOBS Studioを利用します。

OBS Studio
https://obsproject.com/ja
OBS Studioは動画配信の定番ツールで映像や画像をレイヤーで重ねて1つの動画にしたり、クロマキー合成などの加工を行ったり、YouTubeやTwitchへ動画を配信したりととにかく色々なことができます。
そんなOBSにUnityの画面を送って、ゲーム画面などと合成してやればVTuberっぽい画面になるという算段です。Unityの画面をOBSに送るには以下のツールを利用します。
Spout
https://spout.zeal.co/
SpoutはWindowsアプリケーション間でリアルタイムに画像を共有するツールです。
Spout Cam
https://spout.zeal.co/
Spout CamはSpoutが送信した画像を受信できる仮想カメラです。
KlakSpout
https://github.com/keijiro/KlakSpout
KlakSpoutはUnityからSpoutを使うことができるプラグインです。
このプラグインからSpoutを介してUnityの画面を他アプリに送信したり、画像を受け取ったりすることができます。
これらのツールを使って、UnityからOBSへ画面を送ることができます。一時期ZoomにUnityのカメラの絵を出すのがバズりましたが、やっていることはそれと同じです。
ソース

出来上がった映像
UnityからSpout経由でグリーンバックのキャラクター映像をOBSが受け取り、元々用意していた背景画像とクロマキー合成して動画を作ることができました。
まとめ
最終的な構成図は以下のようになります。

以上、様々なツールを使ってVTuberになろうという記事でした。
改めてまとめてみると、結構な数のツールを使っていたのが分かり驚きました。普段何気なく観ている動画や配信も裏ではすごい技術や手間がかかっているかもしれませんね。