スマホには2つの音声システムが存在します。
Agora.ioではアプリの利用用途に対して上記の音声システムを切り替える事が可能です。
setAudioProfile APIを通じて6種類の異なるオーディオシナリオ (CHATROOM_ENTERTAINMENT, EDUCATION, GAME_STREAMING, SHOWROOM, CHATROOM_GAMING, DEFAULT) を提供します。
選択されたシナリオに応じて、各ユーザーが使用する音量/音質が決定されます。
ボイスチャットアプリとゲーム/音楽アプリを同時に起動する場合は、音声システムが干渉する場合があります。その場合はボイスチャットアプリでGAME_STREAMINGを選択してメディアシステムを利用する事で解消される場合もあります。
又、iOS13ではバックグラウンドに移行すると音声通話システムが利用できなくなるようです。この場合もGAME_STREAMINGを利用して解消されます。
Googleが発表したPixelシリーズは、音声システムが独特で様々な不具合が発生しているようです。
アプリ側での実装やSDK側で対応できない問題が発生する場合もあります。
このようなケースではマイク付きイヤフォンの利用で解決する事が多いです。
格安SIMや、帯域制限がかかった月末、電波が弱いなど潤沢な回線でない場合での通話もあります。
agora.ioは低遅延の目的でUDPを採用していますが、UDPの弱点であるパケットロスに強い仕組みになっております。実際に50%のパケロスでも補正をかけることで快適な通話が実現できます。
匿名での配信や通話が要求されるアプリにはボイスチェンジャー機能が有効です。エンターテイメント性を求める場合にも有効です。
agora.ioではボイスチェンジャーAPIがあります。
R&B風やカラオケ風にチューニングされたプリセットを選ぶパターンとピッチやDry/Wet設定など細かくチューニングするパターンがあります。
// Sets the preset reverberation effect to pop music.
mRtcEngine.setLocalVoiceReverbPreset(AUDIO_REVERB_POPULAR);
// Turns off reverberation.
mRtcEngine.setLocalVoiceReverbPreset(AUDIO_REVERB_OFF);
// Sets the pitch. The value ranges between 0.5 and 2.0. The lower the value, the lower the pitch. The default value is 1.0, which is the original pitch.
double pitch = 0.5;
rtcEngine.setLocalVoicePitch(pitch);
// Sets the local voice equalization.
// The first parameter sets the band frequency. The value ranges between 0 and 9. Each value represents the center frequency of the band: 31, 62, 125, 250, 500, 1k, 2k, 4k, 8k, and 16k Hz
// The second parameter sets the gain of each band. The value ranges between -15 and 15 dB. The default value is 0.
rtcEngine.setLocalVoiceEqualization(0, -15);
rtcEngine.setLocalVoiceEqualization(1, 3);
rtcEngine.setLocalVoiceEqualization(2, -9);
rtcEngine.setLocalVoiceEqualization(3, -8);
rtcEngine.setLocalVoiceEqualization(4, -6);
rtcEngine.setLocalVoiceEqualization(5, -4);
rtcEngine.setLocalVoiceEqualization(6, -3);
rtcEngine.setLocalVoiceEqualization(7, -2);
rtcEngine.setLocalVoiceEqualization(8, -1);
rtcEngine.setLocalVoiceEqualization(9, 1);
// The level of the dry signal in dB. The value ranges between -20 and 10.
rtcEngine.setLocalVoiceReverb(Constants.AUDIO_REVERB_DRY_LEVEL, 10);
// The level of the early reflection signal (wet signal) in dB. The value ranges between -20 and 10.
rtcEngine.setLocalVoiceReverb(Constants.AUDIO_REVERB_WET_LEVEL, 7);
// The room size of the reverberation. A larger room size means a stronger reverberation. The value ranges between 0 and 100.
rtcEngine.setLocalVoiceReverb(Constants.AUDIO_REVERB_ROOM_SIZE, 6);
// The length of the initial delay of the wet signal (ms). The value ranges between 0 and 200.
rtcEngine.setLocalVoiceReverb(Constants.AUDIO_REVERB_WET_DELAY, 124);
// The reverberation strength. The value ranges between 0 and 100. The higher the value, the stronger the reverberation.
rtcEngine.setLocalVoiceReverb(Constants.AUDIO_REVERB_STRENGTH, 78);
サンプルコードもこちらにあります。
複数名参加の音声通話の場合、Aさんの音量を下げて、Bさんの音量を上げたいというようなニーズも出てきます。
デバイスや環境によって聞き手側で調整をする必要があります。又、Aさんの音は左耳、Bさんの音は右耳から聞こえるという設定も可能です。
こちらのAPIで実現可能です。
WebRTCでのライブ配信、ビデオ通話ではカメラ映像の配信がスタンダードのように思えます。
ですが、音声だけの配信や視聴も可能です。ストリーム作成時にvideoをfalseとすることで音声のみでの配信が可能です。
var stream = AgoraRTC.createStream({
streamID: uid,
audio:true,
video:false,
screen:false
});
WebSDK(WebRTC)での音声コーデックはOPUSになります。
Agora.ioでの音声に対するエンコードはブラウザ側の実装になりますので、配信側で音声コーデックを選択する事はできません。(おそらく他のSDKやライブラリでも不可だと思います)
デコード(視聴側)ではWebAssemblyを活用してOPUS以外のコーデックを再生する事も可能です。
Agora.ioではWebAssemblyに対応したSDKがこちらに公開されています。
配信側がNativeアプリで、aacコーデックや独自コーデックで配信をし、視聴側はブラウザで視聴というケースが考えられます。
ASMR対応のデバイスがあります。
Agora.io のSDKでは音声の生データにアクセスして加工する事ができます。この仕組みを用いて臨場感のある音声の配信をする事が可能になります。
サンプルはこちらにあります。