Android、iOS、および HarmonyOS で AOQ Client SDK を統合し、AOQ と qwen3.5-omni-plus-realtime を使用してオーディオ/ビデオ通話を実装する方法を説明します。
SDK の取得
AOQ Client SDK および Opus オーディオプラグインについては、「SDK ダウンロード」をご参照ください。Opus コーデックは独立したプラグインとして提供されています。ユースケースに応じて組み込んでください。
SDK のインポート
コア SDK ファイルをプロジェクトの依存関係ディレクトリにコピーし、プロジェクト設定で必要な権限を宣言します。
Android
AoqClientSdk-release.aar をプロジェクトの app/libs/ ディレクトリに配置します。libPluginOpus.so を ABI ごとに app/libs/armeabi-v7a/ および app/libs/arm64-v8a/ に配置します。app/build.gradle で次のように設定します。
AndroidManifest.xml で権限を宣言します。
RECORD_AUDIO および CAMERA はランタイム権限です。アプリケーションは実行時に Android の ActivityCompat.requestPermissions() を呼び出してユーザーに承認を要求する必要があります。
iOS (フレームワーク)
-
AoqClientSdk.frameworkおよびPluginOpus.frameworkを Xcode プロジェクトにドラッグします。Target > General > Frameworks, Libraries, and Embedded Content で、[埋め込みと署名] を選択します。 -
権限の宣言:Xcode で Target > Info > Custom iOS Target Properties を選択し、次の 2 つの権限使用目的説明を追加します。
Key
Value
NSMicrophoneUsageDescriptionリアルタイム音声通話のため
NSCameraUsageDescriptionリアルタイムビデオ通話のため
-
Swift プロジェクトでは
import AoqClientSdk、Objective-C プロジェクトでは#import <AoqClientSdk/AoqClientSdk.h>を使用します。
HarmonyOS (har)
aoq-client-sdk.harをプロジェクトのlibs/ディレクトリに配置します。libPluginOpus.soを ABI ごとにentry/libs/armeabi-v7a/およびentry/libs/arm64-v8a/に配置します。entry/oh-package.json5で依存関係を宣言します。entry/src/main/module.json5で権限を追加します。
EntryAbilityで、abilityAccessCtrl.createAtManager().requestPermissionsFromUserを使用してランタイム認証をトリガーします。
デモの試用
Alibaba Cloud Model Studio の Android デモを使用して、AOQ の接続性を迅速に検証できます。APK をダウンロードし、API キーと workspaceId を設定して、選択したモデルを試してください。
次の QR コードをスキャンして Android デモをダウンロードし、インストールします。

AppServer からのトークン取得
Qwen-Omni-Realtime の AOQ 認証手順に従って AppServer を構築します。通話のたびに、クライアントは AppServer に新しい接続認証情報を要求します。
AI オーディオ/ビデオ通話の実装
エンジンの作成とコールバックの設定
createEngine API を呼び出して、AoqClientEngine インスタンスを作成します。
iOS:
AoqEngineDelegate プロトコルを実装して、onConnectionStatusChange、onDataMsg、onError などのコールバックをリッスンします。
Android:
オーディオ/ビデオのキャプチャと再生の開始
startAudioCapture と startAudioPlayer を呼び出して、ローカルオーディオのキャプチャと再生を開始します。startVideoCapture を呼び出してカメラを起動し、setLocalView を使用して SDK のレンダリングターゲットをプレビューコントロールにバインドします。
以下の例では、SDK が音声を自動再生します。再生前に内容を確認するには、startAudioPlayer に渡す再生設定の isExternal を true にして SDK の自動再生を無効にし、再生音声フレームのコールバックを有効にします。アプリケーション側でコールバックの PCM 音声をコピーしてバッファリングし、確認後に再生または破棄できます。設定方法はカスタム音声再生をご参照ください。
iOS:
スピーカーフォンで通話する場合は、録音と再生を開始する前に、両方の isVoipMode を true に設定してハードウェアエコーキャンセルを有効にします。モデルの応答を再生している間もマイク入力を有効にしておくと、VAD がユーザーの発話を検出して再生を中断できます。
接続認証情報の取得
クライアントは AppServer に接続認証情報を要求します。
コーデックの設定と接続の確立
コーデックパラメータを設定し、connect を呼び出します。
注:qwen3.5-omni-plus-realtime では、クライアントはサーバーから session.updated を受信した後にのみメディアデータの送信を開始する必要があります。connect が成功してから session.updated が到着するまでの間に誤ってメディアを送信しないようにするため、connect を呼び出す前に、各アップストリームトラックに対して enableSendMediaStream(trackType, false) を呼び出してください。WebSocket イベントの詳細については、「クライアントイベント」をご参照ください。
iOS:
AI セッションの設定
onConnectionStatusChange(Connected) コールバックで、sendDataMsg を介して session.update メッセージを送信します。このメッセージには、モダリティ、音声、指示、turn_detection などのセッションパラメータが含まれ、セッションハンドシェイクを完了します。WebSocket イベントの詳細については、「クライアントイベント」をご参照ください。
iOS:
session.updated 受信後のメディア送信の有効化
onDataMsg コールバックで、受信メッセージを解析します。モデルから session.updated を受信したら、以前に無効化した各トラックタイプに対して enableSendMediaStream(trackType, true) を呼び出します。WebSocket イベントの詳細については、「サーバーイベント」をご参照ください。
iOS:
-
session.updatedを受信した後にのみメディアストリームの送信を開始してください。このイベントの前に AI はデータを受信する準備ができていない可能性があります。 -
接続時に追加されたオーディオおよびビデオトラック (AOQ メディアチャネル) は、自動的にサーバーにデータを配信します。
- オーディオ:オーディオトラックを介して直接送信されます。—
input_audio_buffer.appendイベントを送信する必要はありません。 - ビデオ:フレームはビデオトラックを介して送信されます。—
input_image_buffer.appendイベントを送信する必要はありません。
- オーディオ:オーディオトラックを介して直接送信されます。—
接続の切断とエンジンの破棄
一般的なシナリオ
割り込み発話
- SDK は Alibaba Cloud Model Studio と深く統合されています。新しいターンが開始されると、モデルからの割り込み発話メッセージが前のターンを中断します。
- SDK は、ローカル再生を中断するための
interruptAudioPlayerインターフェイスを提供します。ユーザーが再生を停止したい場合は、この API を呼び出してください。
ミュート / ミュート解除
ミュート後、SDK はオーディオのキャプチャを続けますが、無音フレームのみを送信します。session は中断されません。
フロントカメラとリアカメラの切り替え
通話字幕と ASR 結果
サーバーは、ダウンストリームデータメッセージを介して ASR 結果と AI テキスト応答をプッシュします。アプリケーションでは、onDataMsg コールバックの type フィールドを元にルーティングしてください。WebSocket イベントの詳細については、「サーバーイベント」をご参照ください。
注意事項
-
シングルトンセマンティクス:
createEngineはシングルトンです — 繰り返し呼び出すと同じインスタンスが返されます。エンジンはdestroyが呼び出された後にのみ再作成できます。複数ページで使用する場合は、Application または Ability レベルでエンジンライフサイクルを管理してください。 -
ローカルプレビュー用ビューのタイプ:
- Android:
SurfaceViewまたはTextureView。その他のタイプはサポートされていません。 - iOS:任意の
UIViewサブクラス。 - HarmonyOS:SDK ドキュメントをご参照ください。
- Android:
-
オーディオルートの変更:ヘッドフォンの挿入/取り外しや Bluetooth 接続などのイベントは、
onAudioDeviceRouteChangedをトリガーします。通常、アプリケーション側での対応は必要ありません。UI にスピーカー/イヤピースの切り替えが含まれている場合は、このコールバックに基づいて状態を同期してください。 -
バックグラウンドでの音声継続:アプリがバックグラウンドに移行したときにオーディオを継続するには、
Info.plistでUIBackgroundModes = audioを有効にし、AVAudioSessionをフォアグラウンドで正しくアクティブにする必要があります。SDK はほとんどのケースを処理します。きめ細かい制御にはsetAudioSessionRestriction:を使用してください。
iOS デモのソースコード

関連ドキュメント
- AOQ Client SDK API の詳細:「SDK 概要」
- qwen3.5-omni-plus-realtime モデルのクライアントイベント:「クライアントイベント」
- qwen3.5-omni-plus-realtime モデルのサーバーイベント:「サーバーイベント」