LoginSignup
13
14

More than 5 years have passed since last update.

UnityからFaceOSCを使ってVTuberっぽいのをやる(前編)

Last updated at Posted at 2018-02-22

はじめに

今回は顔の検出までです。
モデルを動かすのは次回書きます。
一応、成果物のGIFは下の方に載せます。
Unity初心者なので間違いなどがあったら教えていただけると幸いです。

なぜFaceOSCなのか

Unityで顔検出をしたいと思ったのに、
Facetrackerが有料だし、
OpenCVも有料だったので、
OSSであるFaceOSCを使いました。

そこでUnityからFaceOSCを使う際に、
Unityパッケージを作って公開したので紹介します。
OSCの受信はUnityOSCが有名なようですが、
凹みTipsさんのuOSCが使いやすかったので、
今回はこちらを使用しています。

UFaceOSC

今回作ったUnityパッケージです。
uOSCでFaceOSCから受信したOSCメッセージをパースします。
Unityは経験が少ないので、バグなどあったらプルリクいただければ幸いです。
まだ/rawの取得にバグがあるかもしれません。

環境

使い方

  1. uOSCとUFaceOSC、FaceOSCをそれぞれGitHubからダウンロード
  2. 新規Unityプロジェクトを作成
  3. [Assets] => [Import Package] => [Custom Package...]でuOSCとUFaceOSCをインポート
  4. [GameObject] => [Create Empty]でゲームオブジェクトを作成
  5. 作成したゲームオブジェクトを選択してInspectorAdd Componetから[Scripts] => [uOSC] => [uOscServer]でアタッチ
  6. Portには8338を入力
  7. Add Componetから[New Script]で新規のスクリプトを作成(今回はmainという名前で作りました)
  8. 作ったスクリプトに以下のサンプルプログラムを入力
  9. FaceOSCを起動してrawのチェックボックスをオンにする
  10. UnityのRunボタンを押す
main.cs
using System.Collections;
using UnityEngine;
using uOSC;
using UFaceOSC;

public class main : MonoBehaviour {
  private UFaceOSC.Parser faceOscParser;

  void Start()
  {
    // UFaceOSCのパーサクラスを初期化
    faceOscParser = new UFaceOSC.Parser();
    // uOscServerコンポーネントを取得して受信時のコールバック関数を設定
    var server = GetComponent <uOscServer>();
    server.onDataReceived.AddListener(OnDataReceived);
  }

  void OnDataReceived(Message message)
  {
    // パーサクラスにOSCアドレスとOSCメッセージを渡す
    faceOscParser.SetData(message.address, message.values);
    if(faceOscParser.found == 1) {
      // FaceOSCから受信した顔の頂点情報を取得
      float[] raw = faceOscParser.raw;
      // or Vector2[] rawPoints = faceOscParser.GetRawPoints();
      // FaceOSCから受信した口の高さを取得
      float mouthHeight = faceOscParser.gesture.mouth.height;
    }
  }
}

UFaceOSC詳細

UFaceOSC.Parserクラスのメンバ変数はFaceOSCの下記のOSCメッセージアドレスに基づいています。
口の高さなら/gesture/mouth/heightなのでfaceOscParser.gesture.mouth.height
右目の開き具合なら/gesture/eye/rightなのでfaceOscParser.gesture.eye.rightとなります。
また、/pose/positionVector2/pose/orientationVector3で返します。
/rawに限ってVector2[]を返すGetRawPoints()メソッドを用意しました。
rawのペアの数は66です。この定数はUFaceOSC.Parser.POINTS_LENGTHから読み込みも可能です。

  • Pose
    • center position: /pose/position
    • scale: /pose/scale
    • orientation (which direction you're facing): /pose/orientation
  • Gestures
    • mouth width: /gesture/mouth/width
    • mouth height: /gesture/mouth/height
    • left eyebrow height: /gesture/eyebrow/left
    • right eyebrow height: /gesture/eyebrow/right
    • left eye openness: /gesture/eye/left
    • right eye openness: /gesture/eye/right
    • jaw openness: /gesture/jaw
    • nostril flate: /gesture/nostrils
  • Raw
    • raw points (66 xy-pairs): /raw

成果物

mark.gif

今回の環境 + Live2Dを使ってVTuberっぽいのをやってみました。
使用したモデルはLive2Dが公開しているサンプルを使用しています。
長くなってしまったので、その辺は次回書きます。

感想

UnityでFaceOSCを使う例はあったが、オープンソースなものは見当たらなかった。
想像以上のUnity疲れ(便利なんだけどね)。
次回はマスコットキャラ的な奴を動かしたい。

13
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14