Recorderコンポーネント
Recorderは、オーディオソースを取得し、オーディオデータを圧縮してルームでブロードキャストするコンポーネントです。
ほとんどの場合、シーンにはVoiceConnection.PrimaryRecorder
によって、またはPUNかFusionのネットワークオブジェクトプレハブの一部としてセットアップされるアクティブなRecorderが1つのみ必要です。
入力オーディオソース
ストリーミングしたいソースを、EditorのRecorder.SourceType
フィールドに設定するか、またはコードから設定します。
マイクオーディオソース
システムで利用可能なマイクの1つを、ソースとして使用します。
マイクタイプ
どちらのマイクAPIを使用するか、EditorのRecorder.MicrophoneType
フィールドで設定するか、またはコードから設定します。
Unity: デフォルトで、レコーダーはすべてのプラットフォームでUnity Microphone APIを使用します。このAPIは様々なプラットフォームで利用可能ですが、音声キャプチャーのハードウェア機能の制御はできません。たとえば、顕著な例としてはAcoustic Echo Cancellation (AEC)です。
Photon: Photon Voice 2が提供するネイティブの音声キャプチャーモジュールを使用し、主要なプラットフォームに対応しています:Windows, UWP/Hololens, macOS, iOS, Android。AECなどの組み込みハードウェア音声処理が可能です。
マイクタイプのフォールバック
Recorder.UseMicrophoneTypeFallback
がtrueでUnityマイクタイプで録音開始に失敗した場合、レコーダーはPhotonマイクタイプをフォールバックとして使用するよう試みます。逆もまた同様です。
マイクの選択
システムに複数のマイクがある際に、コードでRecorder.MicrophoneDevice
プロパティを更新し、デフォルトのマイクから切り替えたい場合があるかもしれません。
Unityマイクタイプでは、UnityEngine.Microphone.devices
Unity APIプロパティを使用してデバイスのリストを取得し、Recorder.MicrophoneDevice
プロパティをnew Voice.DeviceInfo(device)
にラップされた選択済みデバイスの名前に設定します。UnityEngine.Microphone.devices
については、Voice.Unity.AudioInEnumerator
ラッパーの使用も可能です。DeviceInfoオブジェクトのリストが返されます。
Photonマイクタイプでは、Voice.Platform.CreateAudioInEnumerator()
コールでデバイス列挙子を作成し反復して、選択済みデバイスにRecorder.MicrophoneDevice
プロパティを設定します。
利用可能なマイクの列挙はWindows、UWPおよびmacOSでのみ可能である点に留意してください。AndroidとiOSでは、Photonマイクタイプはシステムが選択したマイクを使用します。
オーディオクリップ・オーディオソース
同じルームに参加した他のプレイヤーにオーディオクリップをブロードキャストするには、Unityがサポートする音声メディアファイルをRecorder.AudioClip
に割り当てる必要があります。
This can be done by a drag and drop to the Inspector from Unity Editor.
これは、Unity EditorからInspectorにドラッグアンドドロップすることでおこなえます。
ファクトリー・オーディオソース
Photonレコーダーを使用すれば、どのような用途でも独自のカスタムオーディオソースを設定できます。
レコーダーの'InputFactory'プロパティを、Photon.Voice.IAudioReader
またはPhoton.Voice.IAudioPusher
インターフェースを実装するオブジェクトを返す関数に設定します。
'InputFactory'を割当てない場合、トーンジェネレーターを返すファクトリーがデフォルトで使用されます。
詳細は、こちら"を参照してください。
オーディオコーデックパラメータ
Recorder.SamplingRate
: ストリーミング音声のサンプリングレートです。
可能な値は:8、12、16、24および48 kHzです。スピーチには16 Hzで十分ですが、高い数値にしても問題ありません。
デフォルトは24 kHzです。Recorder.FrameDuration
: 1つのネットワークパケットで送信される音声フラグメントの長さをms単位で示しています。可能な値は20、40および60msです。数値を高くすると送信パケットが減少し、またパケットオーバーヘッドによる帯域幅も減少しますが、レイテンシーがわずかに増加します。
デフォルトは20msです。Recorder.Bitrate
: オーディオコーデックが生成する最大データ量をビット/秒で表しています。これは出力ストリームの帯域幅を定義し、受信側の温室に影響します。デフォルトは30000 b/sです。
その他のストリーム設定
Recorder.Encrypt
: trueの場合には、送信音声ストリームが暗号化されます。デフォルトはfalseです。「暗号化」についてはこちらを参照ください。Recorder.ReliableMode
: trueの場合には、送信音声ストリームは高信頼モードで送信されます。これによって、再送信のための大幅な遅延が発生したり、スピーカージッターバッファーが増加する可能性があります。
デフォルトはfalseです。録音と送信
オーディオを正常にブロードキャストするには、以下のプロパティをどちらもtrueに設定する必要があります。
Recorder.RecordingEnabled
プロパティは、Recorderが録音、音声処理、圧縮をおこなうかを定義します。
このプロパティがtrueである限り、送信側と受信側の両方でストリーミングのためのリソースが割り当てられます。Recorder.TransmitEnabled
プロパティは、Recorderが圧縮されたオーディオデータをルームに送信するかどうかを定義します。一時的にストリームをミュートするために使用します。
他のプロパティは
Recorder.RecordingEnabled
を自動的に更新できます:Recorder.RecordWhenJoined
がtrueの場合、RecorderはVoiceConnectionがルームに参加したときに録音を開始し (Recorder.RecordingEnabled
をtrueに設定)、退出したときに録音を停止します。Recorder.StopRecordingWhenPaused
がtrueの場合、アプリケーションが一時停止している間、Recorderは録音を一時停止します(OnApplicationPauseで処理)。
インタレストグループ
お互いに干渉することなく同時に複数の会話を続けさせる機能をプレイヤーに提供することができます。
これは「インタレストグループ」を使用することで実現できます。
インタエレストグループは番号(バイト)で識別されます。
複数のグループに加入登録および登録解除することができます。
しかしながら、一度に1つのグループにしかオーディオを送信できません。
デフォルトでは、レコーダーのインタレストグループは0に設定されています。各プレイヤーは他の全員と会話できます。
ターゲットのインタレストグループを設定するには、Recorder.InterestGroup
を設定します。
リッスンしたいグループを複数選択できます。
デフォルトでは、すべての音声クライアントはグループ0のみに加入登録されます。
登録しているグループのリストを更新するには、Realtimne APIから以下の方法を使用します:
C#
VoiceConnection.Client.OpChangeGroups(byte[] groupsToRemove, byte[] groupsToAdd);
オーディオグループを変更する際は、次の点に注意してください:
- Voiceルームに参加したときにのみ行うことができます。
- グループを追加または削除しない場合は、それぞれのパラメータに
null
を渡します。 - 既存のすべてのグループを追加または削除する場合は、各パラメータに空の配列(
byte[0]
)を渡します。 - デフォルトのオーディオグループ(0)からは登録解除することはできません。
デバッグエコーモード
Recorder.DebugEchoMode
プロパティでこのモードを有効にすると、クライアントによって送信されたオーディオストリームを同じクライアントで受信することができます。
これはルームに1人のクライアントのみが参加しているアプリケーションを、すばやくテストしたい場合に役立ちます。
デバッグエコーモードは、インタレストグループ0でのみ機能します。
閾値にもとづく音声検出
Recorder.VoiceDetection
プロパティが有効化する音声検出は、音声信号レベルがあらかじめ定義した閾値を下回った場合に送信を一時停止します。通常、これは話すのを止めたときに発生し、無駄なノイズを送信しないようにしトラフィックを減らすのに役立ちます。
閾値はRecorder.VoiceDetectionThreshold
プロパティで制御され、デフォルト値は0,01です。
閾値を実際のバックグラウンドノイズレベルに自動的に調整するには、Recorder.VoiceDetectorCalibrate(period)
を呼び出してください(period
は音声信号が分析される時間)。
自動再起動
録音中にRecorderの特定のプロパティを変更すると、録音の再起動を引き起こします(次のフレームでレコーダーを停止して再起動させることになります)。以下は、変更すると再起動を引き起こすパブリックフィールドまたはプロパティのリストです:
Recorder.UserData
Recorder.InputFactory
Recorder.SourceType
Recorder.MicrophoneType
Recorder.MicrophoneDevice
Recorder.AudioClip
Recorder.SamplingRate
Recorder.FrameDuration
Recorder.Bitrate
Recorder.UseOnAudioFilterRead
Recorder.IsRecording
プライマリーレコーダー
ほとんどの場合に単一のRecorderコンポーネントが使用されるため、単独のデフォルトRecorderへのショートカットを提供しています。これはPrimary Recorder
という名前で、Unity EditorのVoiceConnection.PrimaryRecorder
から、またはコードでアクセスできます。
プロパティが設定されると、UnityVoiceClientが常に対応します:Recorder設定に応じて、初期化や録音開始をおこないます。
一方、PunVoiceClient と FusionVoiceClient は VoiceConnection.UsePrimaryRecorder
がtrueの場合のみPrimary Recorder
を直接使用するので、ネットワークオブジェクトに依存しない単一の発信ストリームでPUNやFusionをフォローしたい場合に役立ちます。
PUNのPhotonVoiceView
やFusionのVoiceNetworkObject
がシーンにインスタンス化され、そのプレハブにRecorderがない場合、Primary Recorder
は自動的にネットワークオブジェクトに依存して使用されます。Primary Recorder
を共有しないように、クライアントごとに1つのネットワークオブジェクトをインスタンス化するようにしてください。
複数のレコーダー
何らかの理由で複数のRecorderを使用する必要がある場合には、必要に応じてRecorderのインスタンス化、セットアップをおこない、VoiceConnection.AddRecorder(Recorder)
メソッドで利用を開始します。
AudioChangesHandlerコンポーネント
このコンポーネントはオーディオハードウェア内の変更を検知し、オブジェクトをシェアするRecorderを自動的に再起動します。手動あるいはRecorder InspectorのAdd Audio Changes Handler component
ボタンを使用して、このコンポーネントを追加します。
モバイルプラットフォームでは、AudioChangesHandler.HandleDeviceChangeIOS
またはAudioChangesHandler.HandleDeviceChangeAndroid
プロパティがtrueに設定されている場合に変更が処理されます。AudioChangesHandler.HandleDeviceChange
プロパティはその他すべてのプラットフォームに適用されます。
WebRTCAudioDspコンポーネント
WebRTC Audioネイティブライブラリに関するラッパーは、すべての主要なプラットフォームで利用できます。その効果の多くはUnity Microphone Typeでの使用が推奨されています。これは、Photon Microphone Typeで取得した音声ストリームは通常、ハードウェアによってすでに処理されているためです。WebRTCAudioDsp.VAD
(Voice Auto Detection)は入力信号に発話が検出されない場合に送信を一時停止しますが、すべてのマイクソースに役立ちます。
コンポーネントは発信ストリームが作成されて、WebRTCAudioDsp.enabled
がtrueの場合のみアクティブとなります。
コンポーネントがアクティブな際に、すべての処理を一時的に無効にするにはWebRTCAudioDsp.Bypass
プロパティを使用できます。