UnityでHoloToolkitのSharing機能を使ってボイスチャットする方法


概要

MicrosoftがHoloLens用に提供しているUnityツール「HoloToolkit」を使ってボイスチャットを作ってみます。
情報が少なくハマったのでポイントを整理しておきます。

全体構成

ローカルネットワーク内でボイスチャットを実現します。
それぞれ以下のIPアドレスが割り振られているとします。

動作確認環境

  • Windows 10
  • Unity 2017.4.17f
  • HoloToolkit 2017.4.3.0

Unityの設定

以下URLのHoloToolkitのHoloToolkit-Unity-2017.4.3.0.unitypackageをダウンロードします。
https://github.com/Microsoft/MixedRealityToolkit-Unity/releases

これをUnityのプロジェクトにImport Assetしてください。

Sharingの設定

HolotoolkitのAssetからSharingプレハブを探してシーンに追加します。
また、AutoJoinSessionAndRoomスクリプトをアタッチしてください。

次にSharingStageスクリプトのServer Addressをサーバを起動するIPアドレス(192.168.0.10または.20)に設定します。
ただし、サーバを起動しているPC上で動かすのであればlocalhostでも大丈夫です。

IsAudioEndpointにチェックが入っているかも確認しておきましょう。

MicrophoneTransmitterとMicrophoneReceiverの設定

ここで一番ハマりました。
HolotoolkitのボイスチャットライブラリであるMicrophoneTransmitterとMicrophoneReceiverをCameraにアタッチすればOK!
と思ったのですが、これだと自分の声が聞こえてくるだけで相手の声が聞こえません。

この問題は各所で議論されていますが解決法が見つかりませんでした。
https://github.com/Microsoft/MixedRealityToolkit/issues/72

*branchbark * commented on 10 Mar 2017
Can we do voice commands if we are streaming audio?
I'm having trouble transmitting/receiving any voice at all. I can only hear myself when I speak however I am unable to hear others who have joined the app and they cannot hear me. Other users during the shared experience report the same experience.

WANGJUN ✭ September 2017
I also have problems by using two scripts(MircrophoneTransmitter.cs,MicrophoneReceiver.cs). My Problem is that I can hear my own voice,also others voice

結論としては非常に簡単で、MicrophoneTransmitterとMicrophoneReceiverを別々のGameObjectにアタッチすればよいだけでした。
それぞれがAudio Sourceにアクセスするので、同じGameObjectだと競合してしまうためだと思われます。

そこでCameraの下に2つ空のGameObjectを作成して、それぞれに上記スクリプトをアタッチしましょう。

SharingServerの起動

この手順はどちらか一方のPCで行ってください。
以下URLのHoloToolkitのSource Codeをダウンロードします。
https://github.com/Microsoft/MixedRealityToolkit-Unity/releases

解凍してコマンドプロンプトで以下を実行してください。

cd [解凍フォルダ]\External\HoloToolkit\Sharing\Server
SharingService.exe -local

※フォルダ構成はバージョンにより異なります。

これで音声を中継するサーバが起動できました。
コマンドプロンプトにサーバアドレスが表示されれば起動に成功しています。

Unityアプリの起動

それぞれのUnityアプリを起動すると自動でボイスチャットが開始されます。
SharingServerの画面に以下のようなメッセージが表示されていれば、サーバへの接続が成功しています。

SharingService: Created Session "DefaultSession" with ID 1 on port 20600
SharingService: User XXX at address 192.168.0.10 joined session DefaultSession

以上の手順で、それぞれのPCのマイクから入力した音声がもう一方のPCのスピーカから再生されます。

トラブルシューティング

サーバへの接続ができない場合などは、アンチウイルスソフトが通信を遮断していないか確認してみましょう。
わからなければソフトを無効にして試してみてください。

Future work

とりあえずUnityプレイヤーでの動作を確認しました。
今後はHoloLensやその他プラットフォームで利用できるか確認する予定です。
また、ローカルネットワークではなくWANで使えるかも検証したいです。

→(追記)HoloLensでの動作を確認しました。
ただしScripting Backendが.NETじゃないとだめみたいです。
https://github.com/Microsoft/MixedRealityToolkit-Unity/issues/2531