9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pythonとOSCでVRChatのアバターを操作する

Last updated at Posted at 2022-02-22

概要

この記事はVRChatとOSCを使って、とりあえず何か動くものを作りたい!と思ってる人向けの記事です。pythonのスクリプトを実行することにより、OSCを通してVRChatのアバターにアニメーションさせたり移動をさせることが出来ます。

手元に必要なのは VRChatpython だけです・・・!

OSCとは

Open Sound Controlというプロトコルなのですが・・・プロトコルって何?ってなりますよね。プロトコルは何かと通信するためのルールや決まりごとみたいなものです。データをVRChatに送信する場合、OSCが指定するフォーマットで送る必要があります。プログラム内にライブラリを導入すれば、送信したいデータを割とらくにOSCのフォーマットに変換してくれます。

もうちょっと簡単に説明してくれ

python単体だとVRChatと会話が難しいから、OSC用のライブラリとタッグを組んで、ライブラリに色々と通訳してもらいます。通訳のアウトプットはVRChatが理解出来るようなフォーマット(OSC)です。下記がそのイメージ図。

dbz_image.png

VRChatをOSCで操作するのにpythonが必要なの?

pythonで動かせるというのは一例です。どんな言語でもほぼ大丈夫だと思われます。確認したところ、python, Unity, JavaScriptそれぞれにOSCのライブラリが存在します。ライブラリが存在するということは、実行したプログラムからVRChatを操作することが可能です。

では実際に準備していきましょう。

pythonスクリプトを作成する

python-osc のインストール

まずVRChatと通信が出来るライブラリが必要です。pythonが使用出来る環境でpython-oscをインストールします。

pip install python-osc

VRChat用のスクリプトを作成

python-oscのドキュメントを参考にスクリプトを作成します。Port番号はVRChatのドキュメントで案内されている通り、9000に設定しましょう。

send_to_vrchat.py
import argparse
from pythonosc import udp_client

if __name__ == "__main__":
  parser = argparse.ArgumentParser()
  parser.add_argument("--ip", default="127.0.0.1",
      help="The ip of the OSC server")
  parser.add_argument("--port", type=int, default=9000,
      help="The port the OSC server is listening on")
  args = parser.parse_args()

  client = udp_client.SimpleUDPClient(args.ip, args.port)

  while True:
   key_input = input("数字を入れてください: ")
   key_input = int(key_input)
   client.send_message("/avatar/parameters/VRCEmote", key_input)

VRChatへの通信を確認する

VRChatのOSCの設定をオンにする

VRChatの起動後、Action Menuを開きOSCの設定を開きます。トグルスイッチをEnabaledにしましょう。
turnonOSC.png

同時に、VRChatのディレクトリにOSCのディレクトリが作成されます。

C:\Users\{ユーザ名}\AppData\LocalLow\VRChat\VRChat\OSC\{ユーザID}\Avatars\{アバターID}.json

中にはアバターのパラメータがリストされたjsonファイルがあります。デフォルトのアニメーション設定が入っているアバターであれば、パラメータの一つに/avatar/parameters/VRCEmoteというアドレスが存在します。デフォルトのエモートのアニメーションを操作出来るアドレスで、今回のスクリプトで使用します。

client.send_message("/avatar/parameters/VRCEmote", key_input)

pythonスクリプトを実行(アニメーション)

アバターを鏡の前に移動させましょう。VRChatは起動したままで、pythonのコードをパソコンのコマンドラインから実行します。

python send_to_vrchat.py

コマンドラインがユーザからのインプットを待つようになります。1から8の整数を一つ入力してエンターを押すと、アバターがその整数に関連するアニメーションの動きをします。0を入力すると。その動きが止まります。ここの動きはアバターに設定されてるアニメーションの設定によって開始や停止の方法が違ってきます。

send_to_vrchat.gif

pythonのスクリプト自体を止めたい時は ctrl + c で終了させてください。

別のpythonスクリプトを実行(移動)

アバター自体を別の場所に移動させたい場合、OSC as Input Controllerのページを参照してアドレスと値を設定します。今のスクリプトを編集して、前後に動くための /input/Vertical アドレスを入れましょう(最後の二行をコメントアウトし、コードを二行追加しました)。

import argparse
from pythonosc import udp_client

if __name__ == "__main__":
  parser = argparse.ArgumentParser()
  parser.add_argument("--ip", default="127.0.0.1",
      help="The ip of the OSC server")
  parser.add_argument("--port", type=int, default=9000,
      help="The port the OSC server is listening on")
  args = parser.parse_args()

  client = udp_client.SimpleUDPClient(args.ip, args.port)

  while True:
   key_input = input("数字を入れてください: ")
   # key_input = int(key_input)
   # client.send_message("/avatar/parameters/VRCEmote", key_input)
   key_input = float(key_input)
   client.send_message("/input/Vertical", key_input)

コマンドラインでスクリプトを実行しましょう。そのままコマンドラインに1から-1の数字を入れることによって前後の移動が出来るようになります。1でアバターが前に、-1でアバターが後ろに、そして0でアバターが停止するようになります。

osc_vertical.gif

他にも色々と移動用のアドレスが準備されてるので、試してみましょう。

デバッグ

VRChatのメニュー内にOSC Debugという名のオプションがあります。
osc_debug_menu.png

こちらを起動させてOSCを通してVRChatにデータを送ると、VRChat側で正しく受け取られたかどうかの確認が出来ます。
osc_debug.gif

通信が失敗してる場合は左上の図は出てこないはずです。

最後に

動かすことが出来ましたでしょうか?
OSCの導入で私もしばらく『うわー、なにこれー、どうすればいいのー??』という状態だったので、その気持が少しでも解消されてると嬉しいです。ここから少しずつ、自分の作りたいものを作っていきましょう(っ・ω・)っ

9
10
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
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?