通过 AOQ 协议使用 qwen3.5-omni-plus-realtime 模型实现实时通话
本文档说明如何在 Android、iOS、HarmonyOS 平台接入 AOQ Client SDK,实现 AOQ+qwen3.5-omni-plus-realtime 音视频通话功能。
AOQ Client SDK 及音频 Opus 插件请参见SDK下载。Opus 编码以独立插件形式提供,请根据您的场景按需引入。
请根据不同平台将核心 SDK 产物导入工程依赖目录,并在工程配置中声明相关权限。
将
在
其中
请按照Token鉴权的 AOQ 章节搭建获取 Token 的 AppServer。每次通话前,客户端需要向业务侧 AppServer 请求一次 Token。
调用实现
调用
由业务 AppServer 代理千问 AI 平台请求,参见Token鉴权。
设置编解码参数后调用
在
在
静音后 SDK 仍在采集音频,但只推送静音帧,
服务端通过下行数据消息推送 ASR 结果与 AI 文本回复。业务侧在
示例源码下载:
iOS:aoqdemo.zip
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()方法,主动向 Android 系统申请用户授权。
iOS(framework)
-
将
AoqClientSdk.framework与PluginOpus.framework拖入 Xcode 工程,在 Target > General > Frameworks, Libraries, and Embedded Content 中选择Embed & Sign。 -
权限声明:在 Xcode 中选中您的 Target > Info > Custom iOS Target Properties,添加以下两项权限用途描述:
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触发运行时授权。
AppServer获取Token
请按照Token鉴权的 AOQ 章节搭建获取 Token 的 AppServer。每次通话前,客户端需要向业务侧 AppServer 请求一次 Token。
实现 AI 音视频通话
创建引擎并设置回调
调用createEngine接口创建AoqClientEngine实例。
- iOS
- Android
- HarmonyOS
AoqEngineDelegate协议监听onConnectionStatusChange、onDataMsg、onError等回调。启动音视频采集与播放
调用startAudioCapture与startAudioPlayer启动本地音频采集与播放;调用startVideoCapture启动摄像头,并通过setLocalView将 SDK 渲染目标绑定到业务侧的预览控件。
- iOS
- Android
- HarmonyOS
获取连接凭证
由业务 AppServer 代理千问 AI 平台请求,参见Token鉴权。
设置编解码及建立连接
设置编解码参数后调用connect。
注意:qwen3.5-omni-plus-realtime 要求客户端在收到服务端的session.updated之后才能开始发送媒体数据。为避免connect建联成功到session.updated到达之间的空档期误推媒体,在connect之前对上行音频与视频轨道分别调用enableSendMediaStream(trackType, false),将上行推流暂时关闭。WebSocket事件说明详见客户端事件。
- iOS
- Android
- HarmonyOS
AOQ SDK 在建联后会默认发送媒体数据,此示例演示了连接模型时关闭媒体发送的能力。
配置 AI 会话
在onConnectionStatusChange(Connected)回调中通过sendDataMsg发送session.update消息(业务自定义 JSON,包含 modalities、voice、instructions、turn_detection 等会话参数),完成会话握手,WebSocket事件说明详见客户端事件。
- iOS
- Android
- HarmonyOS
收到 session.updated 后开启媒体发送
在onDataMsg回调中解析下行消息,收到模型回复session.updated的时候,对上一步禁推的每个轨道类型调用enableSendMediaStream(trackType, true)放开推流。下面为代码示例,WebSocket事件说明详见服务端事件。
- iOS
- Android
- HarmonyOS
- 模型必须在收到
session.updated后才开启媒体流发送,否则 AI 侧可能还未准备好接收数据。 - 建连时添加的音频轨道和视频轨道(即 AOQ 媒体通道)会自动将数据传输到服务端。
- 音频:通过音频轨道直接传输,无需发送
input_audio_buffer.append事件。 - 视频:通过视频轨道发送画面帧,无需发送
input_image_buffer.append事件。
- 音频:通过音频轨道直接传输,无需发送
断开连接与销毁引擎
典型场景
打断(Barge-in)
- SDK 与千问 AI 平台深度融合,支持千问 AI 平台模型的打断消息会在新一轮对话开始时打断上一轮次。
- SDK 提供本地播放器打断接口
interruptAudioPlayer,当用户主动需要停止时可以调用打断 API 实现此功能。
静音 / 取消静音
静音后 SDK 仍在采集音频,但只推送静音帧,session不会中断。
切换前后摄像头
通话字幕与ASR结果显示
服务端通过下行数据消息推送 ASR 结果与 AI 文本回复。业务侧在onDataMsg回调中根据type字段分流即可。WebSocket事件说明详见服务端事件。
注意事项
-
单例语义:
createEngine是单例,重复调用返回同一实例;destroy后才能重新创建。多页面共用建议在 Application/Ability 级管理引擎生命周期。 -
本地预览 View 类型:
- Android:
SurfaceView或TextureView;其它类型不支持。 - iOS:任意
UIView子类。 - HarmonyOS:请参考 SDK 文档。
- Android:
-
音频路由变化:耳机插拔、蓝牙连接等会触发
onAudioDeviceRouteChanged,业务侧通常无需处理;如果 UI 上显示"扬声器/听筒"开关,需要根据该回调同步状态。 -
后台续传:如需通话切到后台后继续传音频,
Info.plist必须开启UIBackgroundModes = audio,并在前台时正确激活AVAudioSession(SDK 会处理大部分情况,业务侧用setAudioSessionRestriction:可精细控制是否让 SDK 接管)。
Demo 示例下载
