Pythonを使って、人間3Dアバター向けのフォーマットであるVRMのアバターの表情を動かしてみました。 といっても、Pythonから直接VRMをゴリゴリではなく、「VMagicMirror」というVRMアバターを動かすアプリを使用しています。 このアプリは、MIDIからの入力でアバターを動かすことができます。そこで、PythonでMIDIを制御して、VMagicMirrorで表情を変化させました。
あと、MIDI機材は持っていないし、Pythonから扱う必要もあったので、「loopMIDI」という仮想MIDIケーブルをインストールしてます。
構成はこんな感じです。
動作確認環境
手順
loopMIDIのインストール
loopMIDIのインストール方法はこちらが詳しかったです。
VMagicMirrorの設定
MIDIを使ってVMagicMirrorを制御する方法は、こちらで公式が説明してくれています。
MIDIのノートと表情の割当は次のようにしました。
プログラム
プログラムを使用するために必要な準備は、次の通りです。
pip install mido python-rtmidi
プログラムは、以下のようになります。
import random import time import mido from mido import Message while True: # noinspection PyUnresolvedReferences port_name_list = mido.get_output_names() print(port_name_list) # "loopMIDI"を含む最初の要素を取得する loop_midi_port = next((s for s in port_name_list if 'loopMIDI' in s), None) if loop_midi_port is None: print("loopMIDI not found") break # noinspection PyUnresolvedReferences with mido.open_output(loop_midi_port) as outport: random_note = random.randint(60, 64) msg = Message('note_on', note=random_note, velocity=127, time=0) print("Sending message: {}".format(msg)) outport.send(msg) time.sleep(1)
試行錯誤とメモ
当初は、キーイベントをVMagicMirrorに直接送って制御しようとしましたが、うまくいきませんでした。 VMagicMirrorのソースを軽く読んだ感じだとネイティブのキーイベントを直接扱っているようだったので。
VRMを扱う記事の多くはUnityを使っていて、Unityを使うのがベストなんだろうけど、もっともっと手軽に扱いたかったのでMIDIです。あと、Unityわからないし。
細かい制御がしたくなったら、VMCProtocol(=VirtualMotionCaptureProtocol)を使って、VMC(=VirtualMotionCapture)やプロトコル対応アプリを制御するのが真っ当な気がします。
参考リンク
VirtualMotionCaptureProtocolの公式ページ
VirtualMotionCaptureの公式ページ