忙しい人向け
OSCって?
VRChatでアバターの状態を変更できるやつ!詳しくはこの記事がおすすめ。一部のフェイトラもこれを使ってるらしい。
OSCQueryって?
OSCを複数ツールが同時に使えるようにするしくみ!OSCではできなかった、現在のアバターの状態を取得することもできる。
今BOOTHで販売されていたりするOSCツールはOSCにしか対応してないものが多くて不便…
みんなOSCQueryに対応して~!!
使えるライブラリ
- 公式C#実装: vrc-oscquery-lib
- Python: tinyoscquery
- Rust: vrchat_osc
他に使えるライブラリがあれば、ぜひコメントで教えてください!
ちなみにRustのvrchat_oscは自作です。割と頑張って実装してるのでよかったら使ってみてね。
もう少し詳しく知りたい人向け
この記事を開いたあなたは恐らく、OSCというものが気になっている、あるいは知っていて、OSCQueryは何なんだろうと思っているはずです。えぇ、間違いありません。
OSCについての説明は冒頭にも触れたこの記事にお任せするとして、この記事ではOSCQueryについて説明します。
OSCQuery、便利なのでもっと対応ツールが増えてほしいです…
OSCQueryとは?
冒頭で軽く説明しましたが、もう少し詳しく説明するなら次の2つの機能を持ったしくみです。
- VRChatにOSCイベントの送信先として任意のIP/ポート番号1を登録する。
- 現在のアバターが持っているパラメーターと、その値を取得する。
通常、VRChatは標準で9000番ポートにOSCイベントを送信しますが、同一のポートを複数のアプリケーションで聞くことができないため、OSCのみに対応したツールは基本的に同時実行ができません。
そこでOSCQueryを使うことによって、任意のIP/ポート番号1に送信先を登録できるため、同時実行が可能になります!嬉しい!
また、OSCQueryで送信先を登録することで、VRChat内にもこのように通知されます。

ツール:【自分の】耳がもがれるとVRChatが落ちるツール【みみのこ】
さらに、OSCではイベントの受け取り・送信が可能でしたが、
- 現在そのパラメーターが利用可能か?
- 現在の値は何か?
を取得することが不可能でした。
これもOSCQueryで解決することができます。現在有効なパラメーターの名前や権限属性、現在の値などが取得可能です。取得できる値には、現在のアバターIDやミュートのオンオフ状況2、カメラが出ているかどうかなども含まれるため、工夫次第で様々なことができるはずです。
どうですか?OSCQuery、対応しませんか?
もっと詳しく知りたい人向け
ここからはしっかりめな技術解説になります。
実はOSCQueryの中身は割とシンプルで、mDNSという仕組みとHTTPサーバーを組み合わせただけのものです。
mDNSとは?
マルチキャストDNSの略で、その名の通りLAN内でDNS、つまり名前解決をするためのしくみです。
といっても名前解決の方法についてはDNS-SDを参照していて、mDNSはそれをマルチキャスト通信で行う方法を定義しています。
マルチキャストについての説明は他の詳しい記事にお任せするとして、今回はざっくりローカルネットワークで動作中のVRChatクライアントを発見するためのしくみ、という理解で問題ないです。
通常同じPCでVRChatもツールも実行するのに、なぜわざわざネットワークで名前解決をするのか?という疑問については、私の勝手な予想ですが、恐らくモバイルやVR単騎にも対応するためなのではないかと思います。
しかしその割には意図したものなのかバグなのかネットワーク越しのOSCQueryはかなり制限されているため、一体なぜ…という疑問は残ります。
OSCQueryのしくみ
さて、本題です。
まず最初に、OSCQueryでどのようにVRChatがツールを認識し、OSCの送信先として登録するのかを見ていきましょう。
1. 名前解決
まずOSCQueryはmDNSを使って、ネットワーク上にある他のOSC、OSCQueryの使用者を見つけます。
具体的には、_osc._udp.local. (OSC) と_oscjson._tcp.local. (OSCQuery) という名前空間を使って解決されます。
VRChatの場合、VRChat-Client-000000._osc._udp.local.のような名前で見つかります。
2. 疎通確認・登録
名前が解決されたら、VRChatはhttp://<解決されたアドレス>/?HOST_INFOに対してGETを試みます。
?HOST_INFOはOSCQueryで定義されているエンドポイントで、サービス名やOSCを聞いているIP/ポート番号など、そのツール(サービス)に関する情報がJSONで返されます。
ただしVRChatはこの情報はサービス名以外基本無視しているようで、ここが200で通ると、mDNSで解決されたIP/ポート番号がOSCの送信先として登録されます。
この時点でVRChatの画面に通知が表示され、以降OSCイベントがツールに送信されるようになります。
現在のパラメーターを取得する
また、OSCQueryは現在有効なパラメーターとその値なども取得することができます。
この「パラメーター」はアバターのエクスプレッションパラメーターに限った話ではなく、トラッキングについてのパラメーターや前に進むといった操作、カメラの操作などOSC経由で操作できるもの全てが取得できます。
http://<解決されたアドレス>/に対してGETを行うことで全ての有効なパラメーターの情報を取得できますし、パスとしてパラメーター名を指定してやれば、そのパラメーターのみの値を取得することも可能です。
返ってくる情報は次のようなJSONで、/avatar/parameters/MyGimmick?VALUEのようにクエリパラメーターにキーを指定することで値のみを取得することもできます。
{
"DESCRIPTION": "root node",
"FULL_PATH": "/",
"ACCESS": 0,
"CONTENTS": {
"input": {
"FULL_PATH": "/input",
"ACCESS": 0,
"CONTENTS": {
"MoveForward": {
"DESCRIPTION": "Moves you forward while the input equals 1..",
"FULL_PATH": "/input/MoveForward",
"ACCESS": 2,
"TYPE": "T",
"VALUE": [
false
]
}
},
...
全体を眺めてみると、結構色々なパラメーターがあって面白いのでおすすめです。
さいごに
未だに結構「OSCツールは複数同時に使えない」みたいな話を聞くことがあります。
しかし、ツールがOSCQueryに対応していればそんなことはないです!
ツール開発者のみなさん、対応してくれ~!!
この記事はOSCQueryの知名度向上を目的に書いているので、もし分かりにくいことなどあれば、ぜひコメントで教えてください!!