This document is about: VOICE 2
SWITCH TO

Recorderコンポーネント

Recorderは、音声ソースを収録し、音声データを圧縮し、ルーム内にブロードキャストするコンポーネントです。 ほとんどの場合、シーンにはアクティブなRecorderが1つのみ必要です。これは、VoiceConnection.PrimaryRecorder経由か、PUN/Fusionのネットワークオブジェクトプレハブの一部としてセットアップします。

Input Source Type

エディター上のRecorder.SourceTypeフィールドまたはコードから、配信したいソースを設定します。

Microphone 音声ソース

システム上で利用可能なマイクの1つを、ソースとして使用します。

Microphone Type

エディター上のRecorder.MicrophoneTypeフィールドまたはコードから、どのマイクAPIを使用するかを設定します。

Unity:デフォルトでは、すべてのプラットフォームでRecorderはUnity Microphone APIを使用します。このAPIは様々なプラットフォームで利用可能ですが、AEC(Acoustic Echo Cancellation)などのオーディオキャプチャハードウェア機能が欠けています。

Photon:Photon Voice 2が提供するネイティブのオーディオキャプチャモジュールを使用し、主要なプラットフォーム(Windows, UWP/Hololens, macOS, iOS, Android)に対応します。AECなどの組み込みハードウェア音声処理が可能です。

Microphone Typeのフォールバック

Recorder.UseMicrophoneTypeFallbackがtrueで、MicrophoneType: Unityでの録音開始に失敗した場合、RecorderはMicrophoneType: Photonをフォールバックとして使用を試みます。逆の場合もまた同様です。

マイクの選択

システム上に複数のマイクがある場合、コードからRecorder.MicrophoneDeviceプロパティを更新し、デフォルトのマイクから切り替えることも可能です。

MicrophoneType: Unityでは、Unity APIのUnityEngine.Microphone.devicesプロパティからデバイスのリストを取得し、Recorder.MicrophoneDeviceプロパティに選択したデバイス名をnew Voice.DeviceInfo(device)にラップして設定します。UnityEngine.Microphone.devicesのラッパーとなるVoice.Unity.AudioInEnumeratorも使用可能で、これはDeviceInfoオブジェクトのリストが返されます。

MicrophoneType: Photonでは、Voice.Platform.CreateAudioInEnumerator()からデバイス列挙子を作成し、これを反復して、選択したデバイスをRecorder.MicrophoneDeviceプロパティに設定します。 マイクリストの列挙は、Windows・UWP・macOSでのみ利用可能であることに留意してください。AndroidとiOSでは、システムが選択したマイクを使用します。

Audio Clip 音声ソース

同じルームに参加している他のプレイヤーに対して、AudioClipをブロードキャストするには、Unityがサポートする音声メディアファイルをRecorder.AudioClipに割り当てる必要があります。 これは、エディター上からインスペクターにドラッグ&ドロップすることで設定可能です。

Factory 音声ソース

Recorderは、あらゆるユースケースに対応する独自のカスタム音声ソースを設定できます。 RecorderのInputFactoryプロパティに、Photon.Voice.IAudioReaderまたはPhoton.Voice.IAudioPusherインターフェースを実装したオブジェクトを返す関数を設定してください。 InputFactoryを割り当てなかった場合、トーンジェネレーターを返すファクトリーがデフォルトで使用されます。 詳細は、こちらをご覧ください。

Codec Parameters

  • Recorder.SamplingRate:ストリーミングする音声のサンプリングレートです。8, 12, 16, 24, 48kHzが選択可能な値です。スピーチには16kHzで十分ですが、高い値にしても問題はありません。デフォルトは24kHzです。
  • Recorder.FrameDuration:1つのネットワークパケットで送信される音声フラグメント長(ミリ秒)です。20, 40, 60msが選択可能な値です。値を高くすると、遅延がわずかに増加しますが、送信パケット数が減少するため、パケットオーバーヘッドによる帯域幅を削減できます。
  • Recorder.Bitrate:オーディオコーデックが生成する最大データ量(ビット/秒)です。これは送信ストリームの帯域幅を定義し、受信者側の音質に影響します。デフォルトは30000bit/sです。

その他のストリーム設定

  • Recorder.Encrypt:trueの場合、送信音声ストリームが暗号化されます。デフォルトはfalseです。暗号化については、こちらをご覧ください。
  • Recorder.ReliableMode:trueの場合、送信音声ストリームは信頼性のあるモードで送信されます。これによって、再送信のための大きな遅延が発生したり、Speakerジッターバッファが増加する可能性があります。デフォルトはfalseです。

録音と送信

音声を正常にブロードキャストするには、以下のプロパティをどちらもtrueに設定する必要があります。

  • Recorder.RecordingEnabled:Recorderが録音・音声処理・圧縮を行うかを定義します。このプロパティがtrueである間は、送信側と受信側の両方でストリーミングのリソースが割り当てられます。

  • Recorder.TransmitEnabled:Recorderが圧縮された音声データをルームへ送信するかを定義します。一時的にストリームをミュートするために使用してください。

他のプロパティによって、Recorder.RecordingEnabledを自動的に更新できます:

  • Recorder.RecordWhenJoined:trueの場合、VoiceConnectionがルームへ参加した際に録音を開始(Recorder.RecordingEnabledをtrueに設定)し、退出した際に録音を停止します。

  • Recorder.StopRecordingWhenPaused:trueの場合、アプリケーションがポーズ中(OnApplicationPauseで処理)は録音も一時停止します。

インタレストグループ

プレイヤーが互いに干渉することなく同時に複数の会話を続けさせる機能を提供することができます。 これはインタレストグループによって実現できます。 インタレストグループは、番号(byte)で識別され、複数のグループを購読/購読解除できます。 ただし、音声を一度に送信できるのは1グループのみです。

デフォルトでは、Recorderのインタレストグループは0に設定されていて、プレイヤーは誰とでも会話できます。 対象のインタレストグループはRecorder.InterestGroupから設定します。

購読するグループは複数選択できます。 デフォルトでは、すべてのVoiceクライアントはグループ0のみを購読します。 購読グループリストを更新するには、Realtime APIで以下のメソッドを使用します:

C#

VoiceConnection.Client.OpChangeGroups(byte[] groupsToRemove, byte[] groupsToAdd);

グループを変更する際は、以下の点を考慮してください:

  • Voiceルームへ参加している際のみ実行できます。
  • グループの追加/削除をしたくない場合は、パラメーターにnullを渡してください。
  • すべての既存グループを追加/削除する場合は、パラメーターに空配列(byte[0])を渡してください。
  • デフォルトのグループ(0)は購読解除できません。

Debug Echo Mode

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

Primary Recorder

大抵のケースでは、Recorderコンポーネントは1つのみ使用されるため、Primary Recorderという単一のデフォルトRecorderへのショートカットが提供されています。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を使用する必要がある場合は、必要に応じてRecorderをインスタンス化してセットアップし、VoiceConnection.AddRecorder(Recorder)メソッドで使用開始してください。

AudioChangesHandlerコンポーネント

このコンポーネントは、音声ハードウェアの変更を検知し、Recorderを自動的に再起動します。手動で追加するか、Recorderのインスペクター上のAdd Audio Changes Handler componentボタンを使用して追加できます。

モバイルプラットフォームでは、AudioChangesHandler.HandleDeviceChangeIOS/AudioChangesHandler.HandleDeviceChangeAndroidプロパティがtrueに設定されている場合に、変更が処理されます。 AudioChangesHandler.HandleDeviceChangeプロパティは、その他すべてのプラットフォームに適用されます。

WebRTCAudioDspコンポーネント

すべての主要プラットフォームで利用可能なWebRTC音声ネイティブライブラリのラッパーです。効果の多くはMicrophone Type: Unityでの使用が推奨されます。Microphone Type: Photonで収録された音声ストリームは通常、ハードウェアによって既に処理されているためです。ただし、入力信号で発声が検知されない場合に送信を一時停止するWebRTCAudioDsp.VAD(Voice Auto Detection)は、どちらのマイクソースでも役立ちます。

送信ストリームが作成されてWebRTCAudioDsp.enabledがtrueの場合のみ、コンポーネントがアクティブになります。

コンポーネントがアクティブである際に、すべての処理を一時的に無効にするにはWebRTCAudioDsp.Bypassプロパティが使用できます。

Last updated on

Back to top