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の公式ページ