Photon Voice For PUN
入門
現在、Photon VoiceはAsset Storeから直接ダウンロードできるUnityパッケージとしてのみ入手できます。ダウンロードはこちら。
PUNでVoiceチャットと音声ストリーミングを可能にするアドオンです。
Photon Voiceが代わりに接続ワークフローを処理してくれるので、オーディオの送信機能に集中することができます。
Photon VoiceはPUNに依存して拡張していますが、独自のAppIdが必要です。AppIdはこちらから入手できます。
Photon Voice Unityパッケージ(またはPUNVoice)には、PUNが含まれています(PUNデモファイルとPhoton Chat APIを除く)。
両方のパッケージを使用する場合は、Photon Voiceのみをダウンロードしてインポートしてください。
すでにPUNを使用していてVoiceを追加したい場合は、PUNをクリーンアップしてPhoton Voiceのみをインポートすることをお勧めします。
PUNとPUNVoiceパッケージは個別に更新されるので、こうすることで互換性が保証されます。
設定
プロジェクトにPhoton Voiceをインポートしたら、PUN設定のすぐ下のPhotonServerSettingsに「Photon Voice Settings」セクションが表示されます。
ここでPhoton VoiceアプリケーションのAppId
をできます。
次の手順に従って、UnityインスペクタでPhotonServerSettingsを再度開くことができます:「Window」 - >「Photon Unity Networking」 - > 「PhotonServerSettings」
高度なオーディオおよび音声に関する設定を微調整するには、シーン内のオブジェクトにPhotonVoiceSettingsスクリプトが添付されていることを確認してください。
使用可能な設定は次の通りです:
PUN関連の設定:
AutoConnect
: PUNクライアントが「PUNルーム」に参加しているときに、自動でPhoton Voiceクライアントを「Voiceルーム」に参加させる。AutoDisconnect
: PUNクライアントが切断されたときに自動でPhoton Voiceクライアントを切断。AutoTransmit
: Photon Voiceクライアントが「Voiceルーム」に参加すると同時に、音声の送信を開始。WorkInOfflineMode
: iftrue
,AutoConnect
andAutoDisconnect
will work even during PUN's offline mode. Default isfalse
.
作成されるすべての「レコーダ」インスタンスに適用される、マイクと「ローカル」のオーディオ録音設定:
SamplingRate
: 1秒あたりのオーディオの測定回数。基本的に、これがオーディオの品質を定義します。
可能な値は次のとおりです:8、12、16、24および48 kHz。デフォルトは24 kHz。Delay
: ミリ秒単位の発信オーディオストリームエンコーダの遅延(時間によるバッファサイズ)。可能な値は5、10、20、40、80、120ミリ秒。デフォルトは20ミリ秒。Bitrate
: 一定の時間(秒)で処理されるデータ量(ビット数)。基本的に、これが圧縮品質を定義します。デフォルト値は30000のb/s。Encrypt
: iftrue
, all outgoing voice streams will be encrypted. Default isfalse
. Read more about "Encryption" here.MicrophoneType
: sets the default or global audio input device type to be used by any PhotonVoiceRecorder if the latter has itsPhotonVoiceRecorder.MicrophoneType
set toPhotonVoiceRecorder.MicAudioSourceType.Settings
.
Default isPhotonVoiceSettings.MicAudioSourceType.Unity
.
Read more about this in the "Microphone Selection" section.
作成されるすべての「スピーカー」インスタンスに適用される「リモート」のオーディオストリーミングの設定:
PlayDelayMs
: ミリ秒単位での再生遅延。着信パケットの遅延の変動を補うために使用。
音声検出機能(作成されるすべての「レコーダ」インスタンスに適用される):
VoiceDetection
: 音声検出 機能の切り替え。VoiceDetectionThreshold
: 音声検出が有効になっている場合、送信を開始するために最小限必要な信号レベル。0.01がデフォルトおよび推奨値。
その他:
DebugInfo
: 情報レベルでUnityコンソールのPhoton Voiceデバッグログを切り替える。DebugLostPercent
: 無くなったフレームのシミュレーション比率。
実行時にカテゴリ2、4、5の設定を更新し、現在送信中のPhotonVoiceRecorderに適用したい場合は、新しい値を設定した後にPhotonVoiceRecorder.UpdateAudioSource を呼び出してください。
「オーディオソース」プレハブ
Photon Voice for PUNでは、各「オーディオソース」オブジェクトがプレハブに代表されるべきです。
必要最低限のプレハブには、同じGameObjectに2つのスクリプトコンポーネントをアタッチする必要があります。
- PhotonView
- PhotonVoiceRecorder
AudioSource
は、Photon Voiceのvoiceチャット専用です。
プレイヤーごとに他のサウンドを使用する場合は、別のGameObject
に接続された別のAudioSource
を使用します。
PhotonVoiceRecorderスクリプトを追加した後、AudioClipコンポーネントとPhotonVoiceSpeaker スクリプトが追加されます。
どちらも、同じルームに参加している他のクライアントから受信したリモートオーディオを再生するために不可欠です。
プレハブは、実行時、及びPUNを使用してルームに参加した後のみにインスタンス化してください。
シーンオブジェクトのインスタンスは対応されていません。そのため、シーン内にPhotonVoiceRecorderインスタンスを持たせないようにしてください。
オーディオソースプレハブは、次の2つの目的で使われます。
- 「ローカル」サウンドを録音および送信:
これはPhotonVoiceRecorderによって処理されます。
記録されたオーディオが送信されているかどうかを確認するには、同じコンポーネントのIsTransmittingプロパティを確認します。 - 受信した「リモート」サウンドを再現および再生:
これはPhotonVoiceSpeakerによって管理されます。
IsPlayingプロパティを使用して、リモートで受信したオーディオが再生されているかどうかを確認します。
このオーディオソースプレハブは、2つの異なる方法で使用できます。
- ボイスチャット:
PhotonVoiceRecorder にオーディオクリップが割り当てられていない状態で、マイクデバイスが検出された場合、オーディオは録音され他の全ての参加プレイヤーに送信されるます。
複数の録音デバイスが利用可能な場合、PhotonVoiceRecorder.MicrophoneDevice
プロパティで使用するデバイスを設定する必要があります。 - オーディオクリップのストリーミング:
このオプションは、Photon Voiceの送信をテストするために導入されたものですが、
他の目的のために使用することもできます。
同じルームに参加している他のプレイヤーにオーディオクリップを放送するためには、Unityが対応しているオーディオメディアファイルをPhotonVoiceRecorder.AudioClip
に割り当てる必要があります。
これはUnityエディタからインスペクタにドラッグ&ドロップして行うことができます。
オーディオクリップを毎回再生したい場合は、PhotonVoiceRecorder.Loop
をtrue
に設定してください。
マイクの選択
PhotonVoiceRecorder.Source
がPhotonVoiceRecorder.AudioSource.Microphone
に設定されている場合、使用するマイクAPIのタイプを決定する別のオプションがあります。
PhotonVoiceRecorderには、PhotonVoiceRecorder.MicrophoneType
を使用して設定できる独自のマイク入力デバイスを持たせることができます。
3つの値は以下です:
Unity
デフォルトで、すべてのプラットフォームでUnityのマイクAPIを使用しています。
Unityは、文字列の配列 Microphone.devices
を使用して、利用可能なすべてのオーディオ入力デバイスを公開します。
マイクデバイスはその文字列の名前か配列内のインデックスを使用して識別できます。
デフォルトでは、その配列の最初の要素が使用されます。
別のデバイスを明示的に設定する場合は、PhotonVoiceRecorder.MicrophoneDevice
を使用するか、グローバルにPhotonVoiceNetwork.MicrophoneDevice
を使用します。
PhotonVoiceRecorder.MicrophoneDevice
がnullの場合、グローバルなもの(PhotonVoiceNetwork.MicrophoneDevice
)が使用されます。
UnityのMicrophone APIを使用するには、PhotonVoiceRecorder.MicrophoneType
をUnity
に設定するだけです。
または、PhotonVoiceSettings.MicrophoneType
からPhotonVoiceRecorderのすべてのインスタンスに対してこれを行うことができます。
Photon
Unityを使用すればほとんど同じコードベースで複数のプラットフォームを対象にできます。
しかし、UnityのMicrophone APIにはいくつかの制限があり、問題が発生することがあります。
そのため、直接音声入力デバイスとインタレストして、UnityのMicrophone APIをバイパスする独自の方法を導入しました。
主な理由は、デバイスに組み込まれているエコーキャンセル機能を利用するためです。
Android、iOS、Windows、macOSの4つの主要なプラットフォームにネイティブプラグインを実装しました。
ただし、使用可能なマイクのリストの列挙は、macOSかWindowsでしか使用できません。
AndroidとiOSでは、システムで使用されるデフォルトの音声入力デバイスを使用します。
以下のようにPhotonVoiceNetwork.PhotonMicrophoneEnumerator
を使用して、利用可能な「Photonマイク」のリストを確認できます。
C#
var enumerator = PhotonVoiceNetwork.PhotonMicrophoneEnumerator;
if (enumerator.IsSupported)
{
for (int i = 0; i < enumerator.Count; i++)
{
Debug.LogFormat("PhotonMicrophone Index={0} ID={1} Name={2}", i, enumerator.IDAtIndex(i),
enumerator.NameAtIndex(i));
}
}
マイクは、PhotonVoiceRecorder.PhotonMicrophoneDeviceID
を使用して設定するか、PhotonVoiceNetwork.PhotonMicrophoneDeviceID
を使用してグローバルに設定できます。
PhotonVoiceRecorder.PhotonMicrophoneDeviceID
が-1の場合,グローバルのPhotonVoiceNetwork.PhotonMicrophoneDeviceID
が使用されます。
PhotonマイクIDが有効であることを確認するには、 PhotonVoiceNetwork.PhotonMicrophoneEnumerator.IDIsValid(id)
を使用できます。
PhotonのMicrophone APIを使用するには、PhotonVoiceRecorder.MicrophoneType
をPhoton
に設定するだけです.
または、PhotonVoiceSettings.MicrophoneType
のPhotonVoiceRecorder
のすべてのインスタンスに対してこれを行うこともできます。
設定
PhotonVoiceRecorder.MicrophoneType
をPhotonVoiceRecorder.MicAudioSourceType.Settings
に設定すると、レコーダーはPhotonVoiceSettings.MicrophoneType
で設定されたグローバルマイクタイプを使用します。
音声検出
音声検出は、録音された音をフィルタリングし、信号レベルが所定のしきい値を超えた場合にのみ送信するオプション機能です。
つまり、話すのをやめると声の送信は自動的に一時停止し、再び話し始めると再開されます。
必要のないノイズの送信を防ぎ、帯域幅の消費量を減らすのに役立ちます。
VoiceDetectionThreshold
のデフォルト値は0.01です。
音声検出キャリブレーションとノイズレベルの測定値を用いた実験の結果、これが一般的な環境での推奨値です。
音声キャリブレーション
音声検出がオンになっていても声の録音に問題が発生した場合は、音声キャリブレーションが必要かも知れません。
Photon Voiceには時間を制限する自動キャリブレーションモードがあります。
キャリブレーションモードを開始するには、`PhotonVoiceRecorder.VoiceDetectorCalibrate(period)``を呼びます。
デフォルトのキャリブレーション期間は2000ミリ秒ですが、いつでも変更することができます。
キャリブレーションを使用して、Photon Voiceは自動的に音量のしきい値を調整します。
オーディオグループ
Photon Voiceは放送専用ではありません。
プレイヤーは互いに干渉することなく同時に複数の会話を行うこともできます。
これは、Photonのインタレストグループ機能を利用した「オーディオグループ」で行うことができます。
「オーディオグループ」は番号(byte
)で識別されます。
複数のグループを購読および購読解除できます。
しかし、一度に音声を送信できるグループは一つだけです。
デフォルトでは、すべてのvoiceクライアントはグループ「0」に購読します。各プレイヤーが全員の声を聞くことができ、全員と会話することができます。
このデフォルトの動作を置き換える場合は、PhotonVoiceNetwork.Client.GlobalAudioGroup
という同じ名前のプロパティを使用して「Global Audio Group」を変更します。
このグループに購読をしているプレイヤーだけが、送信された音声を聞くことができます。
一方で、複数のグループを選択して音声を聞くことはできます。
購読しているグループのリストを更新するには、次のメソッドを使用できます:
C#
PhotonVoiceNetwork.Client.ChangeAudioGroups(byte[] groupsToRemove, byte[] groupsToAdd);
オーディオグループを変更するときは、以下の点に注意してください。
- 「voiceルーム」に参加していないと変更できません。
- グループを追加または削除したくない場合は、それぞれのパラメーターに
null
を渡します。 - すべての既存のグループを追加または削除する場合は、それぞれのパラメーターで空の配列(
byte [0]
)を渡します。 - デフォルトのオーディオグループ(0)から退会することはできません。
オーディオグループをPush-to-Talkと組み合わせて利用することもできます。
使用例1: プライベートな会話
簡単にプライベートボイスチャットを追加できます:
- n をプレイヤー数として、 n * (n - 1) のオーディオグループを作成してmそれぞれを数人のプレイヤーにバインドします。
例: プレイヤー1とプレイヤー2はグループ「12」または「21」に購読できます。 - プレイヤーは、他のプレイヤーと共有しているすべてのオーディオグループに一度に購読するか、必要に応じて購読して「電話のような」機能を利用することができます。
- プレイヤーは、
GlobalAudioGroup
を対応する共有の「バイナリオーディオグループ」番号に設定することで、1人のプレーヤーと会話できます。
使用例2: チームチャット
ゲームにチームを実装している場合は、以下のように簡単に「チームチャット」を追加できます:
- チームごとにグループ番号を割り当てます。
- プレイヤーは、所属するチームのオーディオグループに購読する必要があります。
- 同じチームのプレイヤーは、
GlobalAudioGroup
をチームのオーディオグループ番号に設定すれば、互いに会話できます。
Push-to-Talk
Photon Voiceにプッシュ・ツー・トーク機能を持たせるのは簡単です。
手動で音声録音と送信をトグルする必要があります。
これは、マイクのミュートをオン・オフに切り替えるようなものです。
プッシュ・ツー・トークを開始するには、PhotonVoiceRecorder.Transmit
をtrue
に設定します。
停止するには、値をfalse
に設定します。
ユーザ入力(UIボタンまたはキーボードショートカット)にプロパティを結合することによって使用できます。