Recorderコンポーネント
Recorderは、オーディオストリームの通信を行うコンポーネントです。 このコンポーネントを使用して、何をストリーミングするか(入力オーディオソース)、どのようにストリーミングするか(オーディオ品質)、いつ通信を開始および停止するか(通信の切り替え)、そして誰に通信するか(受信ターゲット)を選択します。 また、Recorderは初期化が必要です。
目次
入力オーディオソース
Recorderは、ストリーミングするためのさまざまなタイプの入力オーディオフィードに対応しています。 最も典型的なものは、ボイスチャットに使用されるマイクです。 ただし、Recorderは他の2つのタイプの入力ソースに対応しています。
マイク
Recorder
で転送される音声ストリーム用の入力ソースタイプとしてマイクを使用するには、Recorder.SourceType
をRecorder.InputSourceType.Microphone
に設定します。
マイクの選択
Photonには、マイクAPIが使用する2つのオプションがあります。
Recorder.MicrophoneType
を使用すると、各レコーダー固有のマイク入力デバイスの種類を設定できます。
2つの異なる値は以下のとおりです。
Unity:
デフォルトでは、すべてのプラットフォームでUnityのマイクAPIを利用しています。
UnityはMicrophone.devices
配列の文字列を使用して利用可能なすべてのオーディオ入力デバイスを公開します。
マイクデバイスは、その文字列名またはその配列内のインデックスを使用して識別することができます。
デフォルトではその配列の最初の要素が使用されています。
別のデバイスを明示的に設定したい場合は、Recorder.UnityMicrophoneDevice
を使用してください。
UnityのマイクAPIを使用するには、Recorder.MicrophoneType
をRecorder.MicType.Unity
に設定します。
Photon:
Unityは、ほぼ同じコードベースを使用して複数のプラットフォームを簡単にターゲットにするのに最適です。 しかし、場合によってはUnityのマイクAPIには制限があり、いくつかの問題があります。 そのため、弊社はオーディオ入力デバイスと直接通信して、UnityのマイクAPIをバイパスする独自の方法を導入しました。 主な理由の1つは、デバイスのハードウェアに内蔵されたエコーキャンセレーションを利用することです。 Android、iOS、Windows、macOSの4つの主要プラットフォーム用にネイティブプラグインを実装しました。
ただし、利用可能なマイクの一覧の列挙は、macOSとWindowsでのみ利用可能です。
AndroidとiOSでは、システムで使用されているデフォルトのオーディオ入力デバイスを使用します。
次のように、Recorder.PhotonMicrophoneEnumerator
を使用して、利用可能な「Photonマイク」のリストを確認できます。
var enumerator = Recorder.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));
}
}
Recorder.PhotonMicrophoneDeviceId
を使用してマイクを設定することができます。
PhotonのマイクAPIを使用するには、Recorder.MicrophoneType
をRecorder.MicType.Photon
に設定してください。
Unityエディターの検討
マイクAPIの選択(UnityもしくはPhoton)については、Unityエディターと出力ビルド間で存続しますが、実際のデバイスについては選択の余地がありません。 Unityエディターで使用できるマイクデバイスのリストは、ビルドが実行されるマシン上では同一ではない可能性があります。 ビルドは、異なるプラットフォーム上で、異なるシステム、異なる音声入力デバイスを使用して実行できます。 このため、必要に応じてデフォルトのマイクから別のマイクへの切り替えが可能です。利用できる場合には、ランタイム時にビルドクライアントから明示的にコードで切り替えをおこなうこともできます。
マイクアクセス:録音とミュート
設計上、Recorderコンポーネントは初期化されると自動的に記録を開始します。
これを無効にするには、Recorder.AutoStart
をfalse
に設定します。
マイクを「ローカル」にミュートするオプション(「セルフミュート」)を行いたい場合は、Recorder.TransmitEnabled
またはRecorder.IsRecording
を使用します。
この値は、レコーダーが初期化されると、実行時に設定できます(再生モード)。
したがって、録音を停止してマイクを「リリース」する場合は、Recorder.IsRecording
をfalse
に設定します。
記録を再開するには、true
に戻します。
設計上、録音が無効になっている場合に音声ストリームは完全に無くなります。
オーディオクリップのストリーミング
このオプションは、Photon Voiceの通信をテストするために導入されました。
ただし、他の目的で使用することもできます。
同じルームに参加している他のプレイヤーにオーディオクリップをブロードキャストするには、Unityでサポートされているオーディオメディアファイルを
Recorder.AudioClip
に割り当てる必要があります。 これは、Unity Editorからインスペクターにドラッグアンドドロップすることで実行できます。
オーディオクリップを毎回再生する場合は、Recorder.LoopAudioClip
がtrue
に設定されていることを確認するか、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.TransmitEnabled
をtrue
に設定するだけです。
停止するには、値を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.AutoStart
をfalse
に設定します。
記録を停止するには、Recorder.StopRecording()
を使用します。
再起動
記録を開始する前に必要なRecorder設定を設定する必要があります。設定しない場合は、 Recorder.RestartRecording()
を使用して再起動する必要があります。
Recorderを再起動する必要があるかどうかを把握するには、フラグRecorder.RequiresRestart
のような'IsDirty'を確認します。
以下を有効化するには、変更後に初期化が必要です:
Recorder.UserData
Recorder.AudioSourceFactory
Recorder.UnityMicrophoneDevice
Recorder.PhotonMicrophoneDeviceId
Recorder.Source
Recorder.MicrophoneType
Recorder.TypeConvert
Recorder.AudioClip
Recorder.SamplingRate
Recorder.FrameDuration
Recorder.Bitrate
以下は送信が有効の場合にすぐに有効となるため、再起動は不要です:
Recorder.TransmitEnabled
Recorder.Encrypt
Recorder.ReliableMode
Recorder.DebugEchoMode
Recorder.VoiceDetection
Recorder.VoiceDetectionThreshold
Recorder.VoiceDetectionDelayMs
Recorder.InterestGroup
Recorder.LoopAudioClip
(if conditions are met)
システム変更に対応
このオプションは、iOSおよびAndroidでは無視されます。
システム設定に入力または出力オーディオデバイスを追加または削除したり、デフォルトのデバイスを切り替えたりすると、Photon Voiceが正常に動作しなくなることがあります。
Photon Voice 2.5以降、新しいプロパティRecorder.ReactOnSystemChanges
を導入しました。これを有効にするとRecorderが自動的に再初期化され、そういったシステムの変更から回復します。
下位互換性のため、デフォルト値はfalse
です。
この値は、編集モードまたは再生モードで設定できます。
デフォルトでは、レコーダーは、使用中のデバイスが使用できないか有効でない場合にのみ録音を再開します。場合によっては、使用中のデバイスが変更されていなくても、強制的に再起動する必要があります。
これを有効にするには、 Recorder.SkipDeviceChangeChecks
をtrue
に設定します。
一時停止時に録音を停止
アプリケーションが一時停止すると(たとえば、バックグラウンドに移動したり、フォーカスが失われたりした場合)録音を停止し、アプリケーションの一時停止が解除されたときに再開するオプションがあります。
この動作を有効にするには、 Recorder.StopRecordingWhenPaused
をtrue
に設定します。
有効な場合のみ録音
レコーダーコンポーネントでUnityコンポーネントを有効化/無効化できるようにすると、Recorder.RecordOnlyWhenEnabled
をtrue
に設定し、階層で有効かつアクティブな場合にのみRecorderが機能することを確認できます。
Unityエディターのインスペクターまたはコードによってレコーダーを有効または無効にすると、録音が開始または停止することができます。