ThreeDPoseTrackerでトラッキングしたモーションを、VMCProtocolでVSeeFaceに連携する
3teneというソフトでキャラクターにアイドルモーションやリップシンクをさせていましたが、表情も加えたくなりました。しかし、3teneやVMagicMirrorは、外部コマンドから操作するためのVMCProtocolに対応していません。そこで、ThreeDPoseTrackerとVSeeFaceを試してみました。ThreeDPoseTrackerはカメラやムービーから全身をトラッキングしてくれるソフトで、VMCProtocolで送信することができます。VSeeFaceはVMCProtocolを受信して表情やリップシンクをつけるソフトです。この組み合わせで、リップシンクは音声入力、表情は外部プログラムでVMCP経由で操作、それ以外の全身はムービーから取得する環境が作れます。
起動して、LoadMovieからアイドルモーションとなる動画を追加しましょう。モデルが動画を良い感じにトラッキングして真似してくれます。
このモーションをVMCPでVSeeFaseに送ります。
Send VMC Protoclにチェックを入れます。
次にVSeeFace側の設定です。
「OSC/VMCプロトコルで受信する(トラッキングを無効)」にチェック。
その下のVSeeFaceトラッキングを有効にして、
顔のトラッキング-ブレンドシェイプのトラッキングを有効にすることでリップシンクだけはVSeeFace側でトラッキングしたものが使われます。
「二次のOSC/VMCプロトコルの受信機能」を有効にして、
こちらのポートでは、VSeeFaceからのVMCPを受け取ることにします。
全部受信で良いかと思います。
次に表情の操作ですが、これはPythonで制御します。
雑ですが、以下のようなコードで操作できます。
import argparse
import random
import sys
from pythonosc import udp_client
if __name__ == "__main__":
client = udp_client.SimpleUDPClient("127.0.0.1", 39540)
args = sys.argv
print(args)
client.send_message("/VMC/Ext/Blend/Val", ["Neutral", 0.0+float(args[1])])
client.send_message("/VMC/Ext/Blend/Val", ["Fun", 0.0+float(args[2])])
client.send_message("/VMC/Ext/Blend/Val", ["Angry", 0.0+float(args[3])])
client.send_message("/VMC/Ext/Blend/Val", ["Joy", 0.0+float(args[4])])
client.send_message("/VMC/Ext/Blend/Val", ["Sorrow", 0.0+float(args[5])])
client.send_message("/VMC/Ext/Blend/Val", ["Surprise", 0.0+float(args[6])])
client.send_message("/VMC/Ext/Blend/Apply",[1])
>Python vmcp_face.py 0 0 0 0 0 0
引数は、各表情の割合で(0.0~1.0)だと思うのですが、思ったように変わってくれませんでした。
(-1.0~1.0)でそれ以上の数値も指定できるが、顔が崩れてしまうので低い数値で良さそうです。
ブレンド速度がかなり遅いのですが、速度は変えられない(?)ようでした。
今回は、このあたりのマニュアルや情報は見つけられませんでした。