この世界で最も愛しい生物とそれに関する技術について
この記事はTSG Advent Calendar 2019 - Adventar21日目の記事として書かれています。前日担当のiLissさん早く記事書けやオラァ。これTSGに関係あるの?毎年恒例。全く関係ないのもアレなので、未来に関係あるかもしれない話でもしましょう。
この世界で最も愛しい生物について
唐突ですが、僕はグソクムシ*1です。現実社会ではこのような等脚目は生きずらい*2ので、人間に化けて生活をしています*3。そのため、現在の科学技術において生物学的にホモサピエンスに分類しているはず。
ここまでどうでもいい茶番でしたが、そういうこともあり僕はグソクムシが好きです。どの程度好きかと言うと、近場であるすみだ水族館の年間パスポートを所持しており、2か月に一度程度の頻度でそこにいるダイオウグソクムシと会話したり*4、旅行先付近の水族館にわざわざ行ってグソクムシと会話してきたり。写真フォルダの30%位は彼らで占められているといっても過言ではないでしょう。僕のTwitterの画像欄を見ればそのごくごく一部が垣間見れるかも。
さて、ここまで何も考えずに書いていましたが、これ以上書き続けると逆に可読性を失ってしまったりしてしまうので、本題に入りましょう。
バーチャルグソクムシ「fiord」を取り巻く技術
そんな僕ですが、今年の春になって「VTuber」なるものを知りました。これを見た僕は思ったのです。「これはグソクムシをバーチャル空間に顕現させる義務がある」と。既存技術を探して、GWを使ってバーチャル空間上で動けるようにしました。そのため誕生日が2019/5/5になっています。Twitterに登録したら凍結するの目に見えているから登録しないけど。やっていることは以下のようなものです。
- 人間の顔をOpenCVで撮影、顔の位置を認識
- 1で取得した顔からdlibを用いて顔の特徴点(輪郭から左目の左端など、68の点を抜き出します)を取得
- 2で取得した顔の特徴点を雑に作った3Dモデルの点に合わせることで顔の角度を取得
- 顔の特徴点からEAR(eye aspect ratio)を用いて瞬きをしているか取得
- 3,4で取得したデータをUnityにUDPで投げつけて、Unityでそれを用いてモデルの顔を動かす
- 同時にNintendo SwitchのJoyconをPCにbluetooth接続しておくことで、ジャイロセンサーから傾きの変化を取得し、モデルの腕を動かす
- Unityではグリーンバックにしてモデルを表示し、OBS Studioでカラーキー入れれば配信でも使えるよ!デスクトップマスコット化するかは考え中。
ここまでサクッと書きました。TSGのみんなはプロなのでこれ以上説明は要らないでしょうし、多分これだけでも実装まで持っていけると思いますが、外の普通の方が見に来ることを考慮してちゃんと中身を書きます。
全体像
ところで、人間の動作とグソクムシの動作は明らかに異なるため、人間の動きをマッピングさせる必要があります*5。取り敢えず限定的に「顔と目、前足」のみの実現を目指します。Pythonで顔認識系統を全部担当。そこからUDPでUnityに「顔の角度、目の開き度合い」を送り付けています。別途UnityではNintendo SwitchのJoyConからその傾きの変化を取得して、その分腕を動かしています。
Python部分
opencv_contribにはfacemark apiというものがあり、それを用いるだけでも実は顔の特徴点を取得することができます。作成した当時はそんなことも知らなかったので、opencv+dlibを用いています。若干の高速化のためにopencvで顔の矩形検出、その範囲のみでdlibの顔の特徴点検出に回しています。UDPに送り付けるパートは…何でUDPにしたんだろう。他いい手段ないですか?また、誤差も出るので「EARだけ取る(カルマンフィルターにより瞬きが消されるので)」→「カルマンフィルターに全顔特徴点をかける」→「顔の傾きを取る」の流れで計算を行います。
Unity部分
Pythonから投げられたデータを受け取ります。顔の角度については(x,y,z)=(0,0,0)からのズレをオイラー角度のまま再現します。と同時に、SwitchのJoyconからも入力を受けます。こんなライブラリがあるので余裕です!
目の開き度合いについては、「閾値以下なら目を完全に閉じる」「閾値以上なら一定時間をかけて目を開いていく」というモーションを付けると自然な動きが出来ます。EARそのものは目の開き度合いに関与するとまずいので。ただ、これだといわゆる「薄目」が表現できないので、その辺は要考察。
出力背景が緑になっているので、例えばOBS Studioという配信ソフト(といいながら主にデスクトップ録画に僕は用いています)に送ってカラーキーつけるとVTuberになれます。
それで出来たのが
ところで、VTuberになる権限を得た僕ですが、「バーチャル空間で動かせるようになる」のが目標だったのでコンテンツもモチベーションもありません。よって微動だにしません。そこ、「グソクムシまんまじゃん」とか言うな!ダイオウグソクムシが動かないのは事実だろうけど、オオグソクムシ結構動くぞ!
試しに配信*6していますが、よく腕がすっとんでいくので、はよモーキャプしろ。ただ、使っているのが慣性系なので、おそらく誤差が出るでしょう。何らかの定期補正機能を導入したいお気持ち。
これから
- VRChatに出したい: VRCモデルには専用のフォーマットがあって、多分それに合わせたモデルを作る必要があります。多分必要なのボーン構成だけなので、うまい具合にマッピングすれば通ります。
- 脱Joycon: 現在僕が所属している学科にある通称「BDM(びっくりドッキリメカ」と呼ばれる授業で「モーションキャプチャー」を作成中です。というのも、Joycon結構誤差が出ます*7。ということで脱Joyconをしたい+前足以外も動かしたいということで頑張ってはんだ付けするぞ。
- 他の個体にも: これ書きながら&人と通話しながら21日21:00~超のんびり雑に以下のモデルを作ってました。
あくまで人間が非人間を動かす際は専用の動きのマッピングが必要になりますが、おそらく可能でしょう。体のくねりと顔の動きがあると思うんだけど、どうするんだ…
教えて、おじぎねこ!