VIVE XR EliteとALVRでフェイストラッキング

2025年11月24日 更新

VIVE XR EliteとフェイシャルトラッカーをVIVEストリーミングで使用するのは負荷が高く、何故だか画質も悪いのでALVRを試してみることにしました。ALVRを使っても根本的な解決には至らない事もあるので、これは一時的な逃げ道です。

しばらく試行錯誤していて全然ダメだったものの、最終的に(多分)上手く動かせるところまで漕ぎ着けることができました。触るとNGな部分がいくつかあることが分かってきたので、備忘録として残しておくことにします。VIVE Focus VisionでもALVR経由のフェイストラッキングは動かせるとは思うのですが、実機がないので分かりません。

Wi-Fi接続の安定性について(ALVRを試す前に)

そもそも使用するWi-FiルーターのSoCによってはVIVE XR Eliteと非常に相性が悪い事もある(?)ようなので、ALVRを使用してもダメなときはダメそうです。不安定さの根本的な原因はVIVE XR Eliteそのものにあるように感じられるため、以下の手段を試してみるかVIVE XR Eliteのアップデートで改善されるのを待つことになるとは思います。

何かと安定しないVIVE XR EliteのWi-Fiですが、気休め程度に行える対策として「MACアドレスをランダム化しない」という方法が取れます。設定方法は、Wi-Fiの接続設定にあるプライバシーの欄で「デバイスのMACを使用」を選択します。これで幾らかマシになるかもしれませんし、何も役に立たないかもしれません。これはSSIDごとに設定が可能です。

ランダムMACアドレスはAndroid 10以降で規定で有効となっている機能ですが、使用する機器やWi-FiルーターによってはWi-Fiが急に切断されるなどの不安定な動作の原因となる事があるようです。VIVE XR Eliteはソフトウェアバージョン1.0.999.738の時点ではAndroid 10なので、これに該当します。

Android 10では永続的ランダム化をしているはずなので、同じWi-Fi接続先を使用している限りは頻繁にMACアドレスが変更されたりはしないのですが、いくつかのAndroid端末において本機能が有効になっているとどういったわけか不安定になるという報告が多数見受けられます。

MAC アドレス ランダム化の動作  |  Android Open Source Project

VIVE XR Eliteを持ち歩いて外出先で使うのなら、ランダムMACアドレスはプライバシー保護の観点で有用だと思いますが、自宅でしか使わないなら本機能を使わない方が安定する可能性はありそうです。

ALVRでの不具合について

先に不具合について明記しておきます。

コントローラーのモーション予測がおかしい不具合がある

コントローラーのトラッキングが鈍く、物を投げたりするのが難しい問題が起きているようです。この不具合についての進展がなく、IssueがClosedになってしまったので直る見込みがなさそうです。

client regression in Focus Vision hand gestures (velocity?) since v20.12.1 · Issue #2793 · alvr-org/ALVR
Description It seems that with release v20.12.1 a velocity regression was introduced for the Vive Focus Vision, current ...

「ALVR v21.0.0-dev01+nightly.2025.01.15」まで戻せばスムーズに動くようになりますが、今度はALVRでのフェイストラッキングが対応してないバージョンとなってしまうので、なんとももどかしい状況です。(※フェイストラッキング対応のコミットが入ったのは2025年2月24日)

StableのALVR v20.13.0~20.14.1も不具合が起きているので、残念ながら回避が難しいです。VRChatで過ごした感じではそこまで酷い感じはしませんが、ダンスをしたりゲームワールドなどで使うとトラッキング速度の違和感があると思います。クライアントのデバッグビルドを用意して不具合修正に協力できる人は、協力した方が良いでしょう。自分は難しいかな……。

(Focus Vision向け情報)フェイストラッキングのマッピングが間違っている不具合もある

Android 10のVIVE XR Eliteでは問題なかったと思うのですが、Android 12(※現在はベータテスト中)にアップデート後はフェイストラッキングのマッピングがVIVE Focus Visionと同じものになっているようです。

今のところALVR側のVIVE用マッピングがSRanipal基準で制作されているので、「VIVE Focus Vision」や「Android 12アップデート後のVIVE XR Elite」ではALVRを使用すると歯を見せる動作が行えません。

VRCFTのALVR用モジュールに修正のプルリクエストは出ていますが、ほったらかしになっています。この変更を取り入れると、現行のVIVE XR Elite(Android 10)の動作に支障が出るはずなので、Android 12へのアップデートが行われるまでは迂闊に変えられないのかもしれませんね。

まだベータテスト中なので正式な提供時期は未定ですが、今後VIVE XR EliteのAndroid 12アップデートが提供された際には、ALVRのモジュールが修正されているかどうかを確認してからアップデートすることをおすすめします。

Incorrect parameter mapping for htcHMD(ex.ViveFocusVision) facial expressions · Issue #7 · alvr-org/VRCFT-ALVR
The parameter mapping for htcHMD seems to be incorrect. MouthApeShape is intended to represent a jaw opening motion with...

変更を取り入れて自前でビルドしました

待っていてもしょうがないので、VRCFT-ALVRをフォークして変更をマージした物をビルドして非公式版として公開しました。Android 12にアップデート済みのVIVE XR Eliteで動作を確認しています。VIVE Focus Visionでは試してないので動くかどうかは分かりませんが、恐らく大丈夫だと思います。

ベータテストに参加していない通常のVIVE XR Eliteではマッピングが合わないはずなので、こちらではなく公式のVRCFT-ALVRモジュールを使用してください。(VRCFTアプリ内でインストールするだけです)

module.jsonは用意しませんので、「%APPDATA%\VRCFaceTracking\CustomLibs\%25APPDATA%25\VRCFaceTracking\CustomLibs」にある「ALVRModule.dll」を上書きしてみてください。

Release VRCFT ALVR module v1.3.0-modified.1 · pikepikeid/VRCFT-ALVR
Merge HTC eye & face Tracking mapping. b0db639Updated PICO Parameters based on VRCFTPicoModule. 10b010dExperimental modi...

テスト環境

記事執筆後に、PC構成の変更とVIVE XR Eliteのベータ版OSへのアップデートがありました。QuestやPICOでの動作テストも行ってALVRの設定部分の内容を大幅に書き直していますが、VIVE XR Eliteでも基本的なところは変わりません。

  • Windows 11 Pro 25H2
  • 【メインPC】AMD Ryzen 9 7950X3D / AMD Radeon RX7900XT(25.11.1)
  • 【サブPC】AMD Ryzen 7 5800X3D / NVIDIA GeForce RTX2080(581.57 Studio)
  • VIVE XR Elite(1.0.999.738) →(2.0.999.952 beta)
  • フェイシャルトラッカー
  • ALVR v21.0.0-dev01 + nightly.2025.04.18
  • ALVR Stable v20.14.1
  • VRCFT 5.2.3.0 (ALVR Module)
  • ルーター:ASUS RT-AX3000(※ここにはWi-Fiで接続しない)
  • Wi-Fi AP:NEC Aterm AM-AX1800HP(80MHz 2×2)

VRCFTについて

期限切れによる証明書失効でインストールが出来ない状況でしたが、Steamで配信されるようになりました。

VRCFaceTracking on Steam
VRCFaceTracking creates a bridge between facial-tracking hardware, and applications compliant with the Open Sound Contro...

ALVRのインストール

PCへのインストール

GitHubから「alvr_launcher_windows.zip」をダウンロードしてZIPを展開します。「ALVR Launcher.exe」を任意のフォルダに配置して実行してください。

Release ALVR v20.14.1 · alvr-org/ALVR
ChangesFix Virtual Audio Cable microphone option. @zmerp #2889 #2897 #2911 #2918

ALVR Launcherを立ち上げて「Add version」を押すとChannelとVersionを指定できるウィンドウが出ます。

「v20.14.1」を指定して「Install」を押すとinstallationsフォルダが生成されてその中にALVR 20.14.1のインストールが行われます。「Launch」ボタンからALVRのダッシュボードを起動できます。

経験上ALVRはStableだからといって安定してるかというとそうでもない感じがしますので、色々と直ってることに期待してNightlyに突撃するのもありです。Add versionから別のバージョンを用意できますので、既存のバージョンを破壊せずに試せます。

Nightlyを試す際はコミットメッセージを見ておくと良いでしょう。

Commits · alvr-org/ALVR
Stream VR games from your PC to your headset via Wi-Fi - Commits · alvr-org/ALVR

Virtual Audio Cable(lite)かVB-Cableのインストール

ALVR Dashboardを起動するとセットアップが始まります。

現在の最新版であるALVR 20.14.1での規定は「Virtual Audio Cable(lite)」となっています。VB-Cableの代わりに「Download Virtual Audio Cable(Lite)」と表示されているはずです。ボタンを押すとブラウザが開いてZIPファイルがダウンロードされますので、展開してSetup.exeを実行してください。

はいを押すとライセンスが表示されるので、「I accept」を押して同意します。

以前のバージョンがインストールされている場合は、一度アンインストールを行ってからインストールするように注意書きが表示されています。過去にインストールしたことがなければそのまま「Install」を押して続行します。

インストールが完了すると、Windowsの規定のサウンドデバイスとして設定したというダイアログが出ます。恐らくそのままだと困るので、設定を元に戻すために「はい」を押してサウンド設定を開いてください。

サウンド設定の「再生」「録音」タブから規定のサウンドデバイスを設定します。「Line 1」などの名称でVirtual Audio Cableが規定のデバイスになっているので、普段使っているスピーカーやヘッドホンを選んで「規定値に設定」しておいてください。

録音デバイスの方も同様に変更します。他にマイクなどを使っていなければそのままでも構いません。

設定が終わったらOKを押して完了します。

ファイアウォールの許可

HMDとの接続のためにファイアウォールに接続ルールを追加します。「Add firewall rules」を押してください。管理者権限が必要です。

VIVE XR Eliteへのインストール

設定>詳細設定>開発者向けオプションから「USBデバッグ」を有効にしてください。開発者モードにしたVIVE XR EliteをPCとUSB接続しておきます。

USB デバッグを有効に

ALVR Launcherの「Install APK」を押してインストールしておけばライブラリに出てくるはずです。

Install APKから入れる

アンインストールはストレージから行える

PCとVIVE XR Eliteが同じネットワークに接続されていることを確認して、VIVE XR Elite側でALVRを起動しておきます。その状態でダッシュボードのDevicesタブで「Launch SteamVR」を押します。(左下のLaunch SteamVRボタンでも同様です)

Trustボタンが出てくるので、押すとHMDが登録されてSteamVRが再起動します。Connectionタブで「Auto trust clients」を有効にしているとTrustを押さなくても自動で登録されます。

初回起動時や設定変更時はSteamVRが1~2回程度再起動する場合があるので、しばらく待ってください。

VIVE XR Eliteが接続できるようになったら少しだけ設定を変更します。ALVRを終了して、SteamVRを閉じていてください。

ALVRの設定

Presets

 

Resolution

VIVE XR Eliteの解像度は片目1920pxなので、Medium設定の両目4288px(片目2144px)にします。High(5184px/片目2592px)にすると色々と問題が起きますので、Mediumが上限です。

Preferred framerate

リフレッシュレートは90Hzを推奨。VIVE XR Eliteは72Hzなどがサポート外なので90Hz以外では手動で75Hzにする必要がありますが、コントローラーの遅延がかなり酷くなる可能性があるのでまずは90Hzにしておきましょう。(特にトラブルがなければ75Hzの方がデコーダーの負荷が減るはずなので、一度試してみるのはありです。)

Encoder preset

「Speed」のままにしておきます。

Foveation preset

パフォーマンス向上のために視界の端が低解像度化します。Foveation presetはHighだと視界の端がかなり荒くなるので、Mediumぐらいにしておくと良さそうでした。VIVE XR Eliteの視野が狭いことや、アイトラッキングで目線を動かす事を考慮するとLightでも良いかもしれません。

Codec preset

今回は「H264」を使用します。

Headset speaker

「System Default」のままで大丈夫です。規定では「Mute desktop audio when streaming」が有効になっているので、ストリーミング中はPCのスピーカーやヘッドホンなどから音が出なくなります。音が途切れる場合はバッファリングなどを調整してみてください。

Headset microphone

「Virtual Audio Cable」を選択します。「Virtual Audio Cable」を使用しますので、予めインストールを行ってWindowsの再起動をしておいてください。

Hand tracking interaction

ハンドトラッキングを使用したい場合は、「SteamVR Input 2.0」に指定します。

Eye and face tracking

「VRCFaceTracking」に指定してください。

Video

設定が非常に多いため、変更した部分だけ記載します。VIVE XR Eliteでも動作確認はしていますが、PICO 4 Proで試したときの情報を基にして記事を更新しています。

Bitrate

「Constant」が安定しなかったため、Modeを「Adaptive」にしました。

  • Maximum bitrate:300Mbps
  • Minimum bitrate:25Mbps

25~300Mbpsで変動するように設定してあります。ネットワークの問題がある場合はもう少し下げます。

Saturation multiplierやMaximum network latency、Encoder latency limiterはお好みで。ここの項目はリアルタイムに変更できますので、様子を見つつ微調整をしてください。HEVC使用時はSnapdragon XR2 Gen1のデコーダー性能的に180Mbpsぐらいを上限にしておくのが良さそうに思えます。

Decoder latency limiterは不具合があるとの注意書きがあるため、使用しないこととします。

Adapt to framerate

これを有効にすると、フレームレートが変動しても設定したビットレートを維持するようになります。これにより、フレームレートが下がっているときに画質が悪くなるのを防ぐことができます。

  • FPS reset threshold multiplier:1.20~2.00

初期設定では2.00なので、90Hzの半分となる45FPSまで下がったときにビットレートの再設定が行われるようになっています……多分。

FPS reset threshold multiplierの値を変更することで、再設定される基準値が指定できます。例えば、90FPS設定の場合は以下のようになります。

  • 45FPS以下でビットレートを再設定→2.0
  • 50FPS以下→1.8
  • 60FPS以下→1.5
  • 75FPS以下→1.2

フレームレートが激しく変動するような状況下では1.8ぐらいで様子を見た方が良いかもしれません。

Image corruption fix(Radeon)

ビットレートが変動したときにIDRフレームを要求して、映像の破綻を防止します。Radeonでのみ機能しますので、有効にしておきましょう。

Color correction

色合いの設定などが行えます。Saturation(彩度)を0.55、Gamma(ガンマ)を0.95にしてみました。ここはお好みでどうぞ。

Maximum buffering

フレームバッファリングの最大値です。2.00 framesが初期設定ですが、遅延を犠牲にスタッターを抑えたい場合は3.00 framesぐらいに設定しても良いかと思います。

Enforce server frame pacing

デフォルトでオンになっている項目です。サーバーとクライアントのフレームレートを一致させます。

VRChatのようなフレームレートが低くて安定しないゲームにおいては、あえてオフにした方が良い場面があります。この設定はリアルタイムに変更できます。

Quality preset(Radeon)

Speedのままにしておきますが、必要に応じてBalanceやQualityに変更します。負荷や遅延が増大するので、VRストリーミングにおいてはSpeedが無難です。この設定はRadeonでのみ機能します。

Enable VBAQ/CAQ

Adaptive quantizationと呼ばれるものです。高速な動きや、複雑なディテールがあるシーンのエンコードに効果的ですので、有効にしておきます。

h264: Profile(Radeon)

Mainプロファイルを使用します。Highプロファイルで設定しようとすると負荷や遅延が増大したり映像が破綻しやすくなるので調整が難しいです。Mainプロファイルでは10-bitエンコードは使用できませんが、動作が安定します。NVIDIA GeForceのNVENCでは影響しない設定です。

Enable High-Motion Quality Boost(Radeon)

「AMF」の欄でExpandを押して詳細設定を表示して有効にします。速い動きによって生じるモーションブラーやノイズに対処するために使用します。パフォーマンス低下が生じる場合はオフに戻してください。

Enable Pre-analysis(Radeon)

High-Motion Quality Boostを使用するために必要です。パフォーマンス低下が生じる場合はオフに戻してください。

Quality presetなど(GeForce)

「NVENC」の欄でExpandを押すと詳細設定が行えます。速度を重視してP1としました。必要に応じて少しだけ上げてください。その他の設定も初期設定のままテストを行いました。

Transcoding view resolution

エンコード解像度の設定です。Medium画質の片目2144pxのままか、VIVE XR Eliteの解像度に合わせて変更しておくのが無難かと思います。

できれば解像度を上げたいところですが、高解像度な設定にすると急にビットレートが上がらなくなったため、あまり高望みができません。最大でも2500pxが限度でした。原因はよく分かりません。ビットレートの制御をAdaptiveからConstantに変えると一見安定したように見えますが、複雑なシーンでビットレートが上がりきらなくなるため上手く動作しなくなるという点は同様です。

これはVIVE XR Eliteに限らずQuestやPICOでも発生し、GeForceとRadeonのどちらも表示が乱れたり品質の低下が顕著でした。3120pxのような設定はもちろんのこと、2560pxや2592pxでもダメです。H.264ではHighプロファイルとMainプロファイルのどちらでも問題があります。何か分かれば追記しておきます。

Emulated headset view resolution

ALVRがSteamVRに報告する解像度です。Transcoding view resolutionの値と合わせておきます。

Client-side post-processing

QuestやPICO側で動作するポストプロセス設定です。見た目に変化が見られなかったので、VIVE XR Eliteでは動作しないようです。

Upscaling

Snapdragon Game Super Resolution(SGSR)を使用してアップスケールを行う機能です。低解像度に対して使用する機能なので、解像度が高い設定で使用するとVIVE XR EliteのGPUにそれなりの負荷が掛かります。

一般的な使い方であればSGSR自体は比較的低負荷なのですが、フェイストラッキングを動作させると余裕がなくなる可能性があります。

これを有効にしてしまうとPC側は90FPSきっちり出ていても、Client(VIVE XR Elite側)が45Hzになってしまって奇妙な遅延を起こすようでした。Upscalingはオンにしないでください。

Audio

マイク用にVirtual Audio Cableを設定すればOKです。バッファサイズなどは今回は変更していません。

音量設定はALVR側からは行えませんし、Windowsのサウンド設定でも何故か変化がありませんでした。VRChatなどのゲーム内設定で変更する必要があります。

ノイズキャンセリングが欲しい場合はWindows側でなんとかするか、VIVE XR Eliteのオーディオ設定で「マイクの騒音を軽減する」を使用します。

Headset

Prediction

コントローラーのトラッキングをスムーズにする為のものです。SteamVRに送信されたトラッキングデータに対応するVsyncが発生するまでの時間を、フレーム数で指定するとのこと。2フレームが理論的には正しいようですが、ネットワークと内部(SteamVRのコンポジター)の遅延を考慮すると2.1フレーム前後が丁度良いという理由で2.10framesがデフォルトになっているようです。

これは90Hzでの基準なので75Hzで使用する場合は1.75framesにすると似たような調整になるはずです。

  • 1000ms / 90フレーム =  約11.11ms
  • 1000ms / 75フレーム = 約13.33ms

(2.1フレーム x 11.11ms = 約23.3msの遅延となることから算出、23.3を1フレームの時間で割るとPredictionの目安が計算できます。)

Emulation mode

「Quest 2 Touch」のままで問題はないはずです。位置の微調整は「Left controller position offset / rotation offset」から行います。

PICO 4コントローラーなどにも偽装できますが、VIVE XR EliteのコントローラーはABXYボタンにタッチセンサーがない代わりにサムレスト(/input/parking)が動作するので、Quest 2コントローラー扱いにしておくのが無難です。

Linear Velocity cutoff / Angular velocity cutoff

コントローラーの移動速度(直線的な動き)や回転速度が設定値以下となる場合、動作していないものとして扱います。つまり手ぶれ補正のようなものです。

デフォルト値は0.050m/sと10.0°/sですので、0.05メートル/秒以下なら静止扱い、回転角度が10度/秒以下なら回転が無視されます。リアルタイムに反映されるので、必要に応じて微調整してください。

Face traking

「Eye ecpressions htc」と「Lip expressions htc」にチェックが入っていることを確認し、Sinkを「VRCFaceTraking」に指定しておいてください。

Connection

Avoid video glitching

UDPを使用する都合上、パケットロスによりブロックノイズや残像、色化けといったグリッチが頻繁に発生する場合に使用します。これは破損したフレームを破棄し続けて次のIDRフレームが到達するまで映像を停止する機能です。映像が一瞬停止するのを許容する代わりに、画面の破綻を防ぐことができます。

このIDRフレームの間隔は「Minimum IDR interval」で100msが指定されています。

各種buffer size

buffer sizeをMaximumからDefaultに変更すると映像が乱れるのを確認しました。念のため触らないでください。

Extra

ここも理由がない限り触るところはありません。

動作確認

Statisticsから各種レイテンシーなどのパフォーマンスを確認できます。

トータルのレイテンシーが80~100msぐらいですが、まぁこんなもんかなと。Motion to Photon Latencyは有線タイプのHMDで40msぐらいだそうですので、無線でそこそこ高いビットレートなら80msは妥当なレイテンシーだと思われます。100msを大きく超えるようなら設定や無線環境などを見直した方が良さそうです。

GitHub - Greendayle/VR-Motion-to-photon-latency-
Contribute to Greendayle/VR-Motion-to-photon-latency- development by creating an account on GitHub.

安定動作時

リフレッシュレート周りも少々波打ってますが、90Hz付近を維持しています。しかし、パブリックインスタンスのFUJIYAMAのような場所では45Hzぐらいになってしまい、激しく変動するため大きな遅延を感じます。

VRChatのパブリックインスタンスに居るとき

この辺りがひとりでテストしている限りではなんとも言えないので、90Hz設定か75Hzのどちらが良いか判断しにくいです。こういう状況の場合は、Video設定にあるEnforce server frame pacingをオフにしてみる手はあります。

ビットレートも設定値付近を推移しており、パケットロスもありませんでした。上記スクリーンショットでは64.5Mbpsと表示していますが、可変設定なので大体200Mbps付近を推移していました。

トラブルシューティング

再接続が何度も起きるなどして動作がおかしいときは、VIVEボタンを押してVIVEメニューを表示して一旦ALVRアプリを終了し、開き直すと改善される場合があります。PC側のALVRとSteamVRが動いている限りはVIVE XR Eliteが切断されても復帰可能です。

VIVEメニュー
VIVEメニューは、ヘッドセットの機能と設定にアクセスできるユニバーサルメニューです。

Android 10のVIVE XR Eliteであった再現性の高そうな不具合として、VIVEメニューを出したときに表示の乱れが起こる場合がありました。おかしいときはVIVE XR Eliteを再起動しておきましょう。

VIVEメニュー表示中に白いオブジェクトが目の前に激しく表示される事があります

以前の動作テスト時の動画

過去に動かしている様子を録画したのが以下の動画です。裏でOBSの録画(解像度WQHD AV1コーデック)が走ってますがエンコーダーの余裕はありそうです。録画当時に使っていたCPUがRyzen 7 5800X3Dなので、HaritoraXなどのIMU方式のトラッカーを動かす余裕があるかと言われると微妙……。

ひとりでテストしていると特に引っ掛かったりはしませんでしたが、長時間安定して動くかどうかはちょっと分からないですね。

ALVRは色々と弄れる分だけややこしいです。VIVE XR Eliteに限らずQuestやPICOでも、VRChatなどの低フレームレートで不安定になりやすいゲームでの動作が上手く行かない場面がよく見られます。VIVEストリーミングが正常に動くなら正直そっちの方が楽です。コントローラー周りの遅延も感じにくいです。

タイトルとURLをコピーしました