すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Model Studio:カスタムオーディオ再生

最終更新日:Sep 02, 2026

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;
}