Pythonを使って3Dアバターの表情を動かしてみた

スポンサーリンク

Pythonを使って、人間3Dアバター向けのフォーマットであるVRMアバターの表情を動かしてみました。 といっても、Pythonから直接VRMをゴリゴリではなく、「VMagicMirror」というVRMアバターを動かすアプリを使用しています。 このアプリは、MIDIからの入力でアバターを動かすことができます。そこで、PythonMIDIを制御して、VMagicMirrorで表情を変化させました。

あと、MIDI機材は持っていないし、Pythonから扱う必要もあったので、「loopMIDI」という仮想MIDIケーブルをインストールしてます。

構成はこんな感じです。



動作確認環境

Windows 11
Python 3.10

手順

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