Recorderコンポーネント

Recorderは、オーディオストリームの通信を行うコンポーネントです。 このコンポーネントを使用して、何をストリーミングするか(入力オーディオソース)、どのようにストリーミングするか(オーディオ品質)、いつ通信を開始および停止するか(通信の切り替え)、そして誰に通信するか(受信ターゲット)を選択します。 また、Recorderは初期化が必要です。

目次

入力オーディオソース

Recorderは、ストリーミングするためのさまざまなタイプの入力オーディオフィードに対応しています。 最も典型的なものは、ボイスチャットに使用されるマイクです。 ただし、Recorderは他の2つのタイプの入力ソースに対応しています。

トップに戻る

マイク

Recorderで転送される音声ストリーム用の入力ソースタイプとしてマイクを使用するには、Recorder.SourceTypeRecorder.InputSourceType.Microphoneに設定します。

トップに戻る

マイクのタイプ

Photonには、マイクAPIが使用する2つのオプションがあります。 Recorder.MicrophoneTypeを使用すると、各レコーダー固有のマイク入力デバイスの種類を設定できます。 2つの異なる値は以下のとおりです。

Unity:

デフォルトでは、すべてのプラットフォームでUnityのマイクAPIを利用しています。 UnityはMicrophone.devices配列の文字列を使用して利用可能なすべてのオーディオ入力デバイスを公開します。 マイクデバイスは、その文字列名またはその配列内のインデックスを使用して識別することができます。 デフォルトではその配列の最初の要素が使用されています。 別のデバイスを明示的に設定したい場合はRecorder.UnityMicrophoneDeviceを使用して設定するか、またはRecorder.MicrophonesEnumeratorで収集されたRecorder.MicrophoneDeviceによる、新たに統一された汎用的な方法を使用してください。

UnityのマイクAPIを使用するには、Recorder.MicrophoneTypeRecorder.MicType.Unityに設定します。

Photon:

Unityは、ほぼ同じコードベースを使用して複数のプラットフォームを簡単にターゲットにするのに最適です。 しかし、場合によってはUnityのマイクAPIには制限があり、いくつかの問題があります。 そのため、弊社はオーディオ入力デバイスと直接通信して、UnityのマイクAPIをバイパスする独自の方法を導入しました。 主な理由の1つは、デバイスのハードウェアに内蔵されたエコーキャンセレーションを利用することです。 Android、iOS、Windows、UWP、macOSの4つの主要プラットフォーム用にネイティブプラグインを実装しました。

ただし、利用可能なマイクの一覧の列挙は、macOSとWindowsでのみ利用可能です。 AndroidとiOSでは、システムで使用されているデフォルトのオーディオ入力デバイスを使用します。

マイクを設定するには、Recorder.PhotonMicrophoneDeviceId (または UWP向けのRecorder.PhotonMicrophoneDeviceIdString)を使用するか、またはRecorder.MicrophonesEnumeratorで収集されたRecorder.MicrophoneDeviceによる、新たに統一された汎用的な方法を使用します。

PhotonのマイクAPIを使用するには、Recorder.MicrophoneTypeRecorder.MicType.Photonに設定します。

トップに戻る

マイクの選択

これでデバイスの種類に関わらず、利用可能なマイクをすべて列挙する統一された汎用的な方法が完成しました。

var enumerator = recorder.MicrophonesEnumerator;
if (enumerator.IsSupported)
{
  Debug.LogFormat("Enumerating available microphone devices of type {0}", recorder.MicrophoneType);
  foreach(var device in enumerator)
  {
    Debug.LogFormat("Microphone device={0}", device);
  }
}

どのデバイスを使用するかは、Recorder.MicrophoneDeviceで設定します。

トップに戻る

考慮事項

デフォルトでは、レコーダーはシステムで設定されたマイクを使用します(マイクの種類(Unity|Photon)とは関係ありません)。 UnityMicrophoneDeviceNamePhotonMicrophoneDeviceId でデバイスを変更した場合、有効で利用可能であれば、そのデバイスを使用しようとします。 選択されたマイクデバイスが有効でないか、利用できない場合、レコーダーはデフォルトのものがあればそれに切り替えます。

録音中(Recorder.IsRecordingtrue)にデバイスやマイクの種類を変更した場合は、Recorder.RestartRecording()を必ず呼び出して、これを有効にしてください。 詳しくは「Restart」をご覧ください。

マイクデバイスの変更が検出された場合、レコーダーはそのマイクデバイスがまだ使用可能で有効かどうかを確認します。 選択したマイクデバイスが有効でない、または利用できない場合、レコーダーはデフォルトのものがあればそれに切り替えます。 詳しくは「React On System Changes」をご覧ください。

マイクのAPI(UnityまたはPhoton)の選択は、Unity Editorと出力ビルドの間で継続されますが、実際のデバイスの選択は継続されません。 Unity Editorで利用可能なマイクデバイスのリストは、ビルドが実行されるマシンでは同じではありません。 ビルドが実行されるのは、異なるプラットフォームで、異なるシステムで、異なるオーディオ入力デバイスを使用する可能性があります。 そのため、必要に応じて、ビルドクライアントからの実行時にコードを介して明示的に、デフォルトのマイクから別のマイクがあればそれに切り替えることができるようになっています。

トップに戻る

マイクアクセス:録音とミュート

設計上、Recorderコンポーネントは初期化されると自動的に記録を開始します。 これを無効にするには、Recorder.AutoStartfalseに設定します。

マイクを「ローカル」にミュートするオプション(「セルフミュート」)を行いたい場合は、Recorder.TransmitEnabledまたはRecorder.IsRecordingを使用します。

この値は、レコーダーが初期化されると、実行時に設定できます(再生モード)。

したがって、録音を停止してマイクを「リリース」する場合は、Recorder.IsRecordingfalseに設定します。 記録を再開するには、trueに戻します。

設計上、録音が無効になっている場合に音声ストリームは完全に無くなります。

トップに戻る

マイクタイプフォールバック

trueに設定すると、Unityマイクタイプでの録音開始に失敗した場合、Photonマイクタイプが利用可能であればそれが予備として使用されます。その逆も同様です。

トップに戻る

オーディオクリップのストリーミング

このオプションは、Photon Voiceの通信をテストするために導入されました。 ただし、他の目的で使用することもできます。 同じルームに参加している他のプレイヤーにオーディオクリップをブロードキャストするには、Unityでサポートされているオーディオメディアファイルを Recorder.AudioClipに割り当てる必要があります。 これは、Unity Editorからインスペクターにドラッグアンドドロップすることで実行できます。 オーディオクリップを毎回再生する場合は、Recorder.LoopAudioCliptrueに設定されていることを確認するか、RecorderのインスペクターのUnityエディターから「Loop」にチェックマークを付けます。

トップに戻る

カスタムファクトリー

Photon Recorderを使用すると、どのようなユースケースでも、独自のカスタムオーディオソースを使用できます。 詳細はこちらをご確認ください:「カスタムの音声ソースを使用する方法は?

トップに戻る

オーディオ品質

コーデックパラメータが主な要因です:

  • SamplingRate: オーディオが1秒間に何回測定されるかの頻度。 基本的に、これは希望するオーディオ品質を定義します。 設定可能な値は、8、12、16、24、および48 kHzです。デフォルトは24 kHzです。
  • FrameDuration: ミリ秒単位の発信オーディオストリームエンコーダーの遅延(時間単位のバッファサイズ)。設定可能な値は5、10、20、40、80、および120ミリ秒です。 デフォルトは20ミリ秒です。
  • Bitrate: 一定時間(秒)にわたって処理されたデータ量(ビット数)。基本的に、これは圧縮品質を定義します。 デフォルト値は30000 b/秒です。

トップに戻る

その他のストリーム設定

  • Encrypt: trueの場合、すべての発信ボイスストリームは暗号化されます。 デフォルトはfalseです。 詳細は暗号化を参照してください。
  • ReliableMode: trueの場合、すべての発信ボイスストリームは信頼できるモードになります。 デフォルトはfalseです。

トップに戻る

通信の切り替え

Recorder.TransmitEnabledを使用して通信を切り替えることができます。 無用なバックグラウンドノイズの送信を防ぐために使用できるVoiceDetectionもあります。

トップに戻る

Push-to-Talk

Photon Voiceを使ってpush-to-talk機能を使うのは簡単です。 ボイスの録音と通信を手動で切り替える必要があります。 マイクのミュートをオン/オフするようなものです。 push-to-talkを開始するには、Recorder.TransmitEnabledtrueに設定するだけです。 停止するには、値をfalseに戻します。 これを実現するには、プロパティをユーザー入力(UIボタンまたはキーボードショートカット)にバインドします。

トップに戻る

ボイスの検出

ボイス検出は、録音された音声をフィルタリングし、事前定義された信号レベルのしきい値を超えた場合にのみ通信を行う任意の機能です。 つまり、発話を停止するとボイス通信は自動的に一時停止され、通話を開始するとボイス通信は再開されます。 無駄なノイズの送信を防ぎ、トラフィックを減らすのにも役立ちます。

VoiceDetectionThresholdのデフォルト値は0,01です。 これは、ボイス検出キャリブレーションとノイズレベル測定を使った実験の結果として、一般的な環境に推奨される値です。

トップに戻る

ボイスキャリブレーション

ボイス検出がオンになっていても音声を録音するときに問題が解決しない場合は、ボイスキャリブレーションが必要かもしれません。 Photon Voiceには、時間が限られている自動キャリブレーションモードがあります。 キャリブレーションモードを開始するには、 Recorder.VoiceDetectorCalibrate(period)を呼び出す必要があります。 デフォルトのキャリブレーション期間は2000ミリ秒ですが、も変更可能です。 キャリブレーションを使用して、Photon Voiceは無音とラウドネスのしきい値を自動的に調整します。

トップに戻る

受信ターゲット

これはオーディオグルー​​プを介して行われます。 DebugEchoModeが有効になっていれば、必要に応じて独自のストリームを受け取ることができます。

トップに戻る

インタレストグループ

Photon Voiceはブロードキャスト専用ではありません。 お互いに干渉することなく同時に複数の会話を続けさせる機能をプレイヤーに提供することができます。 これは「インタレストグループ」を使用することで実現できます。 「インタエレストグループ」は番号によって識別されます (byte)。 複数のグループから購読および購読解除することができます。 しかしながら、一度に1つのグループにしかオーディオを通信できません。

デフォルトでは、レコーダーのインタレストグループは0に設定されています。各プレイヤーは他の全員と会話できます。 ターゲットのインタレストグループを設定するには、Recorder.InterestGroupを設定します。

リッスンしたいグループを複数選択できます。 デフォルトでは、すべての音声クライアントはグループ0のみにサブスクライブされます。 登録しているグループのリストを更新するには、次の方法を使用できます。

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

オーディオグルー​​プを変更する際は、次の点に注意してください。

  • 「ボイスルーム」に参加したときにのみ行うことができます。
  • グループを追加または削除しない場合は、それぞれのパラメータにnullを渡します。
  • 既存のすべてのグループを追加または削除する場合は、それぞれのパラメータに空の配列(byte[0])を渡します。
  • デフォルトのオーディオグルー​​プ(0)からは購読解除することはできません。

オーディオグルー​​プとPush-to-Talk を組み合わせることにより、ゲームに素晴らしい機能を追加することができます。

トップに戻る

デバッグエコーモード

このモードを有効にすると、ローカルのRecorderによって通信されたオーディオストリームを同じボイスクライアントで受信することができます。 これはデバッグ目的のいくつかのユースケースに役立ちます:

  • ルームに一人のアクターのみが参加している状態でオーディオの品質、遅延、設定のテストを行う場合(特に開発の初期段階で)。
  • 自分のマイクやスピーカーのテストを行う場合。
  • 独自のエコーまたは実際のブロードキャストが必要なその他のケース。

デバッグエコーモードは、インタレストグループ0でのみ機能します。

トップに戻る

Primary Recorder

ほとんどの場合、単一のRecorderコンポーネントが使用されるため、VoiceConnection.PrimaryRecorder (or PhotonVoiceNetwork.PrimaryRecorder)からアクセスできる「Primary Recorder」という単一のデフォルトRecorderのショートカットを提供しています。 Unity Editorまたはコードを使用して設定できます。

トップに戻る

初期化

作動させるには、Recorderを初期化する必要があります。 PrimaryRecorderは自動的に初期化されます。 PUNインテグレーションでは、レコーダーはPhotonVoiceViewを使用して自動的に初期化されます。 その他の使用例、または自動初期化が何らかの原因で失敗した場合には、以下の2つの方法のいずれかを使用して手動でRecorderを初期化することができます:

  • VoiceConnection.InitRecorder(Recorder) (または PhotonVoiceNetwork.InitRecorder(Recorder))
  • Recorder.Init(VoiceConnection)

デフォルトでは、初期化されるとRecorderは自動的に記録を開始します。 この挙動を無効化するには、初期化の後にRecorder.StartRecording()を使用して手動で記録を開始し、Recorder.AutoStartfalseに設定します。 記録を停止するには、Recorder.StopRecording()を使用します。

トップに戻る

再起動

記録を開始する前に必要なRecorder設定を設定する必要があります。設定しない場合は、 Recorder.RestartRecording()を使用して再起動する必要があります。

Recorderを再起動する必要があるかどうかを把握するには、フラグRecorder.RequiresRestartのような'IsDirty'を確認します。

以下を有効化するには、変更後に初期化が必要です:

  • Recorder.UserData
  • Recorder.AudioSourceFactory
  • Recorder.UnityMicrophoneDevice
  • Recorder.MicrophoneDevice
  • Recorder.PhotonMicrophoneDeviceId
  • Recorder.PhotonMicrophoneDeviceIdString
  • Recorder.Source
  • Recorder.MicrophoneType
  • Recorder.AudioClip
  • Recorder.SamplingRate
  • Recorder.FrameDuration
  • Recorder.Bitrate
  • Recorder.TrySamplingRateMatch
  • Recorder.UseOnAudioFilterRead
  • Recorder.InputFactory

以下は送信が有効の場合にすぐに有効となるため、再起動は不要です:

  • Recorder.TransmitEnabled
  • Recorder.Encrypt
  • Recorder.ReliableMode
  • Recorder.DebugEchoMode
  • Recorder.VoiceDetection
  • Recorder.VoiceDetectionThreshold
  • Recorder.VoiceDetectionDelayMs
  • Recorder.InterestGroup
  • Recorder.LoopAudioClip
  • Recorder.UseMicrophoneTypeFallback
  • Recorder.StopRecordingWhenPaused
  • Recorder.SkipDeviceChangeChecks
  • Recorder.RecordOnlyWhenEnabled
  • Recorder.RecordOnlyWhenJoined
  • Recorder.AutoStart
  • Recorder.ReactOnSystemChanges

トップに戻る

システム変更に対応

このオプションは、iOSおよびAndroidにおいて、レコーダーの入力ソースがマイクで、マイクタイプがPhotonの場合、ネイティブプラグインで処理されるため、無視されます。

システム設定に入力または出力オーディオデバイスを追加または削除したり、デフォルトのデバイスを切り替えたりすると、Photon Voiceが正常に動作しなくなることがあります。 Photon Voice 2.5以降、新しいプロパティRecorder.ReactOnSystemChangesを導入しました。これを有効にするとRecorderが自動的に再初期化され、そういったシステムの変更から回復します。 下位互換性のため、デフォルト値はfalseです。 この値は、編集モードまたは再生モードで設定できます。

これは、Photon Voice 2がサポートしているプラットフォーム(iOSを除く)では、UnityのOnAudioConfigurationChangedコールバックに依存しています。 iOSでは、OnAudioConfigurationChangedが動作しないことがテストでわかっているので、iOS用に別のネイティブ実装を用意しています。

デフォルトでは、レコーダーは、使用中のデバイスが使用できないか有効でない場合にのみ録音を再開します。場合によっては、使用中のデバイスが変更されていなくても、強制的に再起動する必要があります。 これを有効にするには、 Recorder.SkipDeviceChangeCheckstrueに設定します。

トップに戻る

一時停止時に録音を停止

アプリケーションが一時停止すると(たとえば、バックグラウンドに移動したり、フォーカスが失われたりした場合)録音を停止し、アプリケーションの一時停止が解除されたときに再開するオプションがあります。 この動作を有効にするには、 Recorder.StopRecordingWhenPausedtrueに設定します。

トップに戻る

有効な場合のみ録音

レコーダーコンポーネントでUnityコンポーネントを有効化/無効化できるようにすると、Recorder.RecordOnlyWhenEnabledtrueに設定し、階層で有効かつアクティブな場合にのみRecorderが機能することを確認できます。 Unityエディターのインスペクターまたはコードによってレコーダーを有効または無効にすると、録音が開始または停止することができます。

トップに戻る

参加した場合のみ録音

これは主にマイクの許可が与えられるまで、またはレコーダー側でPUN統合が正しく設定されるまで(録音開始前にrecorder.UserDataを設定する)まで、録音の自動開始を遅らせるために導入されました。 また、これはまだ送信ができない場合にマイクへのアクセス(特に、どのアプリケーションがマイクを使用しているか、最近はほとんどのオペレーションシステムが通知します)を避けるためにも有効です。 デフォルトはtrueなので、このままにしておくことを推奨します。

ドキュメントのトップへ戻る