AOQ Client SDK は、カスタムオーディオ再生をサポートしています。オーディオフレームコールバックの仕組みにより、デコードされた PCM データがアプリケーション層に渡されるため、独自のオーディオレンダリングロジックを実装できます。
概要
デフォルトでは、AOQ Client SDK は受信したリモートオーディオデータをシステムスピーカーまたはイヤピースから再生します。シナリオによっては、SDK の内蔵オーディオ再生モジュールが要件を満たさない場合があります。カスタムオーディオ再生は、次のような場合に役立ちます。
- 受信したオーディオデータを、カスタムの再生デバイスまたはオーディオ処理パイプラインに出力する。
- 受信したオーディオデータを後処理する (AI 音声認識やオーディオエフェクトなど)。
- オーディオ再生デバイスの競合を回避する。
AOQ Client SDK は、柔軟なカスタム再生機能を提供します。オーディオフレームコールバックの仕組みにより、デコードされた PCM データがアプリケーション層に渡されるため、アプリケーション側でレンダリングして再生できます。
サンプルコード
近日公開予定です。
前提条件
createEngineを呼び出して、エンジンインスタンスが作成されていること。- サーバーへの接続が確立されていること (
onConnectionStatusChangeコールバックでAoqConnectionStatusConnectedが報告されていること)。
実装
1. 外部モードでのオーディオ再生開始
startAudioPlayer を呼び出す際に isExternal=true を設定して、SDK の内部オーディオレンダリングデバイスを無効化します。以降、オーディオの再生はアプリケーション層が担当します。
AoqClientEngine.AoqAudioPlaybackConfig config = new AoqClientEngine.AoqAudioPlaybackConfig();
config.isExternal = true; // SDK 内部再生を無効化し、アプリケーション層でオーディオをレンダリングします
config.channel = 1; // チャンネル数
engine.startAudioPlayer(config);
パラメーター:
パラメーター | タイプ | デフォルト | 説明 |
|---|---|---|---|
isVoipMode | boolean | false | VoIP モード (ハードウェア AEC) を有効にするかどうか。モバイル端末で有効です。 |
isDefaultSpeaker | boolean | true | デフォルトでスピーカーを使用するかどうか。モバイル端末で有効です。 |
isExternal | boolean | false | 外部再生モードを使用するかどうか。true の場合、SDK は再生デバイスを開きません。 |
channel | int | 1 | チャンネル数 |
2. オーディオフレームコールバックリスナーの設定
setAudioFrameObserver を呼び出して、オーディオフレームデータのコールバックリスナーを登録します。onPlaybackAudioFrame コールバックメソッドを実装し、再生用の PCM データを受信します。
engine.setAudioFrameObserver(new AoqClientListener.AoqAudioFrameListener() {
@Override
public void onPlaybackAudioFrame(@NonNull AoqClientEngine.AoqAudioFrameData frame) {
// ここで受信した再生オーディオデータを処理します
// frame.dataPtr: PCM データ
// frame.dataSize: データサイズ (バイト単位)
// frame.numOfSamples: サンプル数
// frame.numOfChannels: チャンネル数
// frame.samplesPerSec: サンプルレート
// frame.bytesPerSample: サンプルあたりのバイト数
playPcmData(frame);
}
});
3. 再生データコールバックの有効化
enableAudioFrameObserver を呼び出して、再生側のオーディオフレームコールバックを有効化します。データソースとして AoqAudioSourcePlayback を指定します。
AoqClientEngine.AoqAudioObserverConfig observerConfig = new AoqClientEngine.AoqAudioObserverConfig();
observerConfig.sampleRate = 48000; // コールバックのオーディオサンプルレート
observerConfig.channels = 1; // コールバックのオーディオチャンネル数
observerConfig.mode = AoqClientEngine.AoqAudioObserverMode.AoqAudioObserverModeReadOnly; // 読み取り専用モード
engine.enableAudioFrameObserver(
true, // コールバックを有効化
AoqClientEngine.AoqAudioSource.AoqAudioSourcePlayback, // 再生データソース
observerConfig
);
パラメーター:
パラメーター | タイプ | デフォルト | 説明 |
|---|---|---|---|
sampleRate | int | 48000 | コールバックのオーディオサンプルレート (Hz) |
channels | int | 1 | コールバックのオーディオチャンネル数 |
mode | AoqAudioObserverMode | AoqAudioObserverModeReadOnly | 読み取り/書き込みモード |
4. カスタムオーディオレンダリングの実装
onPlaybackAudioFrame コールバックで PCM データを受信したら、アプリケーション層でレンダリングと再生を行います。一般的な方法は次のとおりです。
- Android AudioTrack:AudioTrack を使用して PCM データをシステムオーディオデバイスに書き込みます。
- AI 音声認識:PCM データを ASR エンジンに渡して音声認識を行います。
- オーディオエフェクト:再生前に PCM データにオーディオエフェクトを適用します。
- ファイルストレージ:受信したオーディオデータをローカルファイルに保存します。
// 例:Android AudioTrack を使用した再生
private AudioTrack mAudioTrack;
private volatile boolean mPlayRunning = false;
private void initAudioTrack(int sampleRate, int channels) {
int channelConfig = (channels == 2)
? AudioFormat.CHANNEL_OUT_STEREO
: AudioFormat.CHANNEL_OUT_MONO;
int bufferSize = AudioTrack.getMinBufferSize(
sampleRate, channelConfig, AudioFormat.ENCODING_PCM_16BIT);
mAudioTrack = new AudioTrack(
AudioManager.STREAM_VOICE_CALL,
sampleRate,
channelConfig,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize,
AudioTrack.MODE_STREAM);
mAudioTrack.play();
mPlayRunning = true;
}
private void playPcmData(AoqClientEngine.AoqAudioFrameData frame) {
if (!mPlayRunning || mAudioTrack == null) {
return;
}
if (frame.dataPtr != null && frame.dataSize > 0) {
mAudioTrack.write(frame.dataPtr, 0, frame.dataSize);
}
}
重要な注意事項:
onPlaybackAudioFrameコールバックは SDK の内部スレッドで実行されます。frame.dataPtrはコールバックの実行中のみ有効です。非同期でデータを使用する必要がある場合は、先にコピーしてください。AudioTrack.writeはブロッキング操作です。SDK は一定のレートでコールバックを呼び出すため、コールバック内で直接書き込んでも問題ありません。- エンジンの終了時や再生停止時に処理を停止できるよう、
mPlayRunningフラグを管理してください。
5. カスタム再生の停止
カスタム再生が不要になったら、先にオーディオフレームコールバックを無効化し、その後に再生デバイスを停止して AudioTrack リソースを解放します。
// 1. 再生側のオーディオフレームコールバックを無効化します
AoqClientEngine.AoqAudioObserverConfig observerConfig = new AoqClientEngine.AoqAudioObserverConfig();
engine.enableAudioFrameObserver(
false, // コールバックを無効化
AoqClientEngine.AoqAudioSource.AoqAudioSourcePlayback,
observerConfig
);
// 2. オーディオフレームコールバックリスナーを削除します
engine.setAudioFrameObserver(null);
// 3. SDK のオーディオ再生を停止します
engine.stopAudioPlayer();
// 4. AudioTrack リソースを解放します
mPlayRunning = false;
if (mAudioTrack != null) {
mAudioTrack.stop();
mAudioTrack.release();
mAudioTrack = null;
}