ブラウザで動く、いじれる VTuber レンダラ。 顔(iFacialMocap)と手/腕(Ultraleap Gemini)の トラッキングを取り込み、three-vrm で VRM アバターをブラウザ上に 描画する。VMC 互換。出力は OBS のブラウザソース(背景透過)でそのまま取り込める。
Askr(アスク) — 北欧神話で、神々が浜辺の命の無い流木に息・動き・姿を与えて作った最初の人間。 静的な VRM(=木)に、トラッキングで動きを、レンダリングで姿を与えて生かす——このソフトの比喩そのもの。
- フルオープンで全部いじれる軽量レンダラが欲しかった。ブラウザ完結・生データ直結・スタックを丸ごと自分で握れる——そういう構成が手元に無かった
- 現行 Leap(Gemini / LeapC)を自作パイプラインに取り込む手順自体が希少。世の情報は廃止済みの旧 WebSocket API ばかりで皆詰む → docs/leap-gemini-bringup.md に手順をまとめた
- 全ての調整がブラウザ上のパネルで完結し、
config.jsonに永続化される。改造前提の素直な構成
┌─────────── 撮影PC ───────────┐ ┌──────────────── レンダーホスト ────────────────┐
│ iFacialMocap ─┐ │ │ raw_ifm_ws_bridge.py :49985 → WS :8201 │
│ ├ ifm_forward.py ──UDP─┼─▶ │
│ │ :49984 │ │ leap_raw_ws_bridge.py :49986 → WS :8202 │
│ Leap(LeapC) ─ leap_send.py ──UDP──────┼─▶ │
│ │ │ config_server.py :8199 (index.html + /config) │
└──────────────────────────────┘ │ │ │
│ ▼ ブラウザ (three-vrm renderer) │
│ http://<host>:8199 WS:8201(顔)/8202(手)受信 │
└───────────────────────┬────────────────────────┘
▼
OBS ブラウザソース (?clean=1, 背景透過α) ──▶ 配信/合成
顔と手は独立した経路。撮影PC で VRM の rest pose を持たないため、Leap のリターゲット(関節 → VRM 指/腕 ボーンのローカル回転)は VRM を持つ renderer(JS) 側で行う。撮影PC 側は「読んで投げるだけ」。
| ポート | 役割 |
|---|---|
| 8199 | renderer 配信 + 設定 API(config_server.py。GET/POST /config) |
| 8201 | 顔(生 iFM)WebSocket(raw_ifm_ws_bridge.py) |
| 8202 | 手/腕(Leap JSON)WebSocket(leap_raw_ws_bridge.py) |
| 49984 | 撮影PC の iFacialMocap 受信(ifm_forward.py) |
| 49985 | レンダーホストの生 iFM 受信 |
| 49986 | レンダーホストの生 Leap 受信 |
| 8200 / 39540 | (任意)VMC 入力の WebSocket 中継(vmc_ws_bridge.py) |
cd renderer
python3 -m venv .venv && . .venv/bin/activate
pip install websockets python-osc # python-osc は VMC 中継を使う場合のみ
# サンプル VRM 同梱済み(assets/model.vrm)=clone してそのまま動く
# 自分の VRoid 等に差し替えるなら:
# cp /path/to/your.vrm assets/model.vrm # または URL の ?vrm=... で指定
python config_server.py # :8199
python raw_ifm_ws_bridge.py # :8201 (顔を使うなら)
python leap_raw_ws_bridge.py # :8202 (手を使うなら)ブラウザで http://<レンダーホスト>:8199 を開く。調整用は素の URL(診断表示あり)。
同梱サンプル VRM
renderer/assets/model.vrmは © handesen。再配布可・要クレジット・非商用・改変不可(コードの MIT とは別ライセンス)。詳細はrenderer/assets/MODEL_LICENSE.txt。
Leap は現行 Gemini(LeapC)を隔離 Python 3.12 から叩く。手順は docs/leap-gemini-bringup.md を参照(ここが要)。
# 疎通確認
<leap312>\python.exe sender\leap_probe.py
# 送出(--host にレンダーホストを指定)
<leap312>\python.exe sender\leap_send.py --host <レンダーホスト>
# 顔(iFacialMocap を撮影PC:49984 へ送る設定にした上で)
python sender\ifm_forward.py --host <レンダーホスト>- OBS のブラウザソースに
http://<レンダーホスト>:8199/?clean=1を指定?clean=1で HUD・診断ドット・Leap デバッグ球を全消し(=アバターだけのクリーン映像)- 背景透過は renderer が α 対応。OBS ブラウザソースのアルファでそのまま抜ける(クロマキー不要)
- これで OBS に取り込めた=あとは普段どおり配信・録画・合成すればいい(NDI 等の配信手段は各自の環境次第。Askr は OBS のブラウザソースまでで完結)
- 全調整は右上のパネル(目線・表情・体駆動・Leap の腕/手/指・カメラ・背景)。変更は
config.jsonに保存 - キー 1–4:カメラ視点スロットの呼び出し(パネルで保存、起動時はスロット 1 を復元)
- Space:診断表示(HUD/ドット)のトグル
- 前腕のねじれ(ソーセージ):VRoid 由来の VRM はツイスト骨を持たないため、前腕の回内/回外が 単一の骨に集中してメッシュが巻きつく。Askr ではひねりを前腕/手へ配分+肘下げバイアスで軽減して いるが、完全な解消には Blender 等でツイスト骨を追加する必要がある
- Leap の肘推定はデバイス FOV 外だと甘い。単眼 Leap なので可動範囲にも限界がある
- 顔は iFacialMocap(iPhone 等)前提
MIT. See LICENSE.

