产品概述
百语语音对话Android SDK 是一款轻量级实时智能语音对话开发工具包。它封装了服务端连接、音频采集播放、对话控制等底层复杂逻辑,帮助开发者仅需 10 分钟即可为 Android 应用快速集成高质量的智能语音交互能力。
本 SDK 基于 WebRTC 技术构建,深度对接百语平台的智能硬件,支持与智能体进行端到端的实时语音对话,适用于陪伴硬件、智能客服、语音助手、智能外呼等多种业务场景。
一、接入前提
-
使用本
SDK前,需先在百语平台创建智能体(Agent,又称Robot),并通过API方式完成发布。发布成功后,可获取该智能体对应的唯一标识robotKey和访问令牌robotToken,二者是SDK与智能体建立语音通话的核心身份凭证。 - 凭证获取指引:请参考《语音通话接入准备工作》完成操作。
robotKey 和 robotToken 属于核心敏感信息,请务必妥善保管,严禁在客户端硬编码或公开泄露,避免造成信息泄露及不必要的计费损失。
二、SDK 基础信息
2.1 SDK 获取与文件说明
SDK 以 AAR 包形式分发,最新版本可从官方发布页下载。
| 名称 | 类型 |
|---|---|
| BR_AI_Voice_RTC | aar |
2.2 兼容性说明
| 项 | 说明 |
|---|---|
| Android 系统 | minSdk 版本为 24,对应 Android 7.0 及以上 |
| 开发语言 | 工程使用 Kotlin 开发;AAR 包已包含所需的 Kotlin 及协程依赖,无需额外引入 |
| ABI 架构 | 支持 arm64-v8a、armeabi-v7a 架构 |
三、SDK 快速集成
3.1 加载 SDK
将从官方发布地址下载的BR_AI_Voice_RTC_x.x.x.aar 文件放入宿主模块的 libs/ 目录下,然后在宿主工程的 build.gradle.kts 文件中添加如下依赖引用:
AAR 包内部已携带 consumer-rules.pro 消费者混淆规则,当宿主工程启用 R8 / 混淆功能时,这些规则会自动合并到宿主的混淆配置中,无需手动添加。
3.2 权限配置
说明:AAR 包的 AndroidManifest.xml 中已声明 SDK 所需的基础权限,宿主工程通常无需重复声明。但从 Android 6.0(API 23)开始,部分特殊权限需宿主工程在运行时动态申请;SDK 会对权限进行校验,若权限缺失,将通过 ChatEvent.ERROR 事件返回对应错误信息。
SDK内部会校验RECORD_AUDIO麦克风权限,宿主工程需在运行时动态申请,权限声明如下:
- 在 Android 12(
API 31)及以上版本,可根据业务需求按需申请以下可选权限(与蓝牙路由、部分机型音频场景相关,仅在需要使用蓝牙耳机或特定音频路由能力时开启):
AAR包中已内置的权限配置如下(宿主无需重复声明):
3.3 代码示例
集成顺序:先确保获取所需权限 → 构造ChatClient 实例 → 注册事件监听 → 调用 startVoiceChat() 启动语音交互;退出页面时,需调用 stopVoiceChat() 结束会话并调用 removeAll() 取消所有监听,避免内存泄漏。
四、SDK 主要方法
所有核心方法均封装在com.brgroup.voice.ai.ChatClient 类中,调用前需确保已成功构造 ChatClient 实例。
4.1 初始化语音交互管理器
通过构造函数创建ChatClient 实例,完成初始化。
-
robotKey/robotToken:用于SDK与百语平台智能体的身份验证,需从百语平台获取。 -
userName:用于标识当前用户,需为每位用户分配唯一且不重复的标识;若不同用户共用同一标识,可能导致数据错乱或非预期运行结果。
4.2 启动语音会话
RTC 连接。调用前需确保已获取麦克风权限且 ChatClient 实例初始化成功。
4.3 结束语音会话
RTC 连接及相关资源。建议在页面销毁前调用。
4.4 打断机器人回复及播报
Boolean,失败时返回 false,且可能伴随 ERROR 事件(如错误码 3011、3009 等)。
4.5 麦克风开关控制
AUDIO_MUTED(关闭)或 AUDIO_UNMUTED(开启)事件。
4.6 获取 SDK 版本号
SDK 版本号,返回值为版本号字符串,如 "1.0.0"。
五、SDK 事件回调
SDK 所有事件均通过 ChatClient.on(ChatEvent, ChatEventListener) 方法订阅,也可使用 onAny 方法监听全部事件,便于统一处理。
注意:所有事件均在主线程(Handler(Looper.getMainLooper()))派发,可直接在回调中更新 UI。
5.1 ChatEvent 枚举(核心事件)
| 事件 | data 常见类型 | 说明 |
|---|---|---|
| ERROR | ErrorMessage | 结构化错误,包含 code 和 errMsg |
| SESSION_STARTED | 通常为 null | 本端进房成功(RTC 回调) |
| SESSION_ENDED | 通常为 null | 会话结束流程完成 |
| ROBOT_MESSAGE | ChannelMessage | 机器人侧字幕 / 消息 |
| USER_MESSAGE | ChannelMessage | 用户侧字幕 / 消息 |
| AUDIO_MUTED / AUDIO_UNMUTED | 通常为 null | 麦克风关闭 / 打开结果 |
| ROBOT_JOINED / ROBOT_LEFT | 通常为 null | 远端用户进房 / 离房(业务上可视为机器人链路) |
5.2 ChannelMessage 说明
ChannelMessage 为消息数据模型,包含解析后的字段及原始 JSON 字符串 rawJson,核心字段说明如下:
-
speakerId:说话人唯一标识,用于区分发言者,在助手模式中使用,会拼接在当前语句最前方。 -
final:布尔值,用于标识当前语句是否结束,默认值为false。
5.3 用户消息与机器人消息差异说明
| 对比项 | 用户消息 | 机器人消息 |
|---|---|---|
| 内容更新方式 | 每包 text 覆盖当前一句(整句识别结果替换) | 每包 text 拼在当前一句末尾(流式累加) |
| speakerId | 非空时拼在句首,便于区分说话人 | 一般无需使用 |
| final == false | 只刷新当前句,不换行 | 只刷新当前句,不换行 |
| final == true | 将当前句写入历史并换行,清空当前句 | 将当前句写入历史并换行,清空缓冲 |
5.4 取消事件订阅
为避免内存泄漏和重复回调,建议在页面销毁时取消所有事件订阅,相关方法如下:stopVoiceChat() 结束会话,再调用 removeAll() 取消所有监听,确保资源完全释放。
六、错误码说明
所有错误均通过ChatEvent.ERROR 事件下发,事件 data 为 ErrorMessage 对象,包含 code 错误码和 errMsg 错误描述,具体错误码释义如下:
| 错误码 | 详细描述 |
|---|---|
| 3001 | 参数校验错误(如入参为空、格式非法或缺失必要字段) |
| 3002 | 当前设备无可用网络连接 |
| 3003 | SDK 内部网络请求异常(如网络中断、服务端返回非 2xx 状态码) |
| 3004 | 未获取麦克风权限(RECORD_AUDIO) |
| 3005 | 不支持的渠道或运行平台 |
| 3006 | 语音引擎初始化异常 |
| 3007 | 本端加入 RTC 频道异常 |
| 3008 | 本端离开 RTC 频道异常 |
| 3009 | 调用 interrupt() 方法时,语音交互尚未建立连接 |
| 3010 | 业务指令序列化失败 |
| 3011 | 发送指令或业务数据流失败 |
| 3012 | 语音引擎未初始化时,调用了 SDK 功能方法 |
| 3013 | 麦克风开关状态设置失败 |
| 3014 | SDK 底层未知异常 |
| 3015 | 发起语音会话过程中,底层连接异常中断 |
| 3016 | SDK 底层接收 RTC 数据流异常 |
| 3017 | 创建业务数据流通道失败 |
| 3018 | 本端加入频道后,远端智能体上线超时 |
| 3019 | 远端智能体下线且重连超时 |
| 3020 | 业务数据流 JSON 解析失败 |
| 3021 | 调用流程互斥(如重复发起未完成的语音启动请求) |