Android端最佳实践
该文档介绍Android平台SDK接入大模型互动服务的最佳实践,引导用户快速跑通流程,解答常见的问题。
基础:跑通全流程
第一步:控制台开通云服务,配置互动智能体
1.注册和登陆百度智能云账号:个人用户和企业用户均需先注册百度智能云账号。具体步骤见注册账号, 登录账号
2.开通大模型互动服务:首次使用服务需要先开通,开通步骤见开通服务
3.创建和配置智能体:
第一步:填写基本信息、选择互动类型(创建成功后不可更改)
第二步:选择模型、填写人设、选择function call模版和组件,具体内容详见 创建互动应用、 控制台快速接入
4.云上测试智能体 【互动应用】应用列表处找到要体验的应用,在【操作】点击体验Demo,进行体验
5.领取测试license和购买正式license: 新用户自动下发10个license,如要购买,在【资源列表】-【购买资源】按需配置购买。详情见领取和购买license
6.给已创建的应用绑定资源:应用创建成功后,必须绑定资源才可正常使用。绑定操作见 绑定资源
第二步:运行云对接服务示例
说明:百度智能云服务API接口,均采用AK/SK鉴权,为了增强安全性,要求在服务器上调用(不建议在设备上)。该示例代码实现一个访问中转,接收设备端连接请求,代理访问百度大模型互动API接口创建互动智能体,返回设备端侧访问云服务所需的token、agentid等信息。该代码可作为服务端对接的实现参考。
1.下载云端对接服务示例代码
本示例代码基于JDK17开发,需要先安装JDK17环境,确保可运行java -version命令等。具体安装过程可直接搜索JDK17安装,参考开源链接进行安装。
官网下载云对接服务代码示例,解压缩之后获取到rtc-aiagent-userserver-version.jar包,本JAR包可以直接用于部署启动。
[!NOTE]
本节后续操作均依赖于前一步骤所获取的参数,请在执行后续操作之前,确保之前步骤均已成功执行。
2.配置云对接服务参数
获取到用于百度智能云接口鉴权的AK/SK,如何获取AK/SK。
获取到用于执行接口调用的互动应用AppId,查看互动应用ID。
3.运行云对接服务示例
将本节步骤2获取到的AK/SK参数替换下面执行命令中的对应部分
1## 访问BCE国内节点启动命令
2BCE_APP_AK=your_ak \
3BCE_APP_SK=your_sk \
4nohup java -Djava.net.preferIPv4Stack=true -jar rtc-aiagent-userserver-version.jar \
5--server.address=0.0.0.0 > app.log 2>&1 &
1## 访问BCE香港节点启动命令
2BCE_APP_AK=your_ak \
3BCE_APP_SK=your_sk \
4BCE_ENDPOINT=http://rtc-aiagent-out.baidubce.com \
5nohup java -Djava.net.preferIPv4Stack=true -jar rtc-aiagent-userserver-version.jar \
6--server.address=0.0.0.0 > app.log 2>&1 &
[!NOTE]
启动成功之后,console/cmd/ssh界面,会打印进程ID, 日志信息会保存到当前目录的app.log中
服务启动之后,可以通过接口调用工具,或使用curl命令,测试服务是否可以正常创建token、agentId等。命令中your_app_id需要替换为本节步骤2获取到的互动应用appId。
1curl --location 'http://localhost:8936/api/v1/aiagent/generateAIAgentCall' \
2--header 'Content-Type: application/json' \
3--data '{
4 "config": "",
5 "app_id": "your_app_id"
6}'
1curl --location 'http://localhost:8936/api/v1/aiagent/stopAIAgentInstance' \
2--header 'Content-Type: application/json' \
3--data '{
4 "app_id": "your_app_id",
5 "ai_agent_instance_id": 2568137789341696
6}'
服务启动成功之后,会占据8936端口,如需停止/重启服务,可参考以下命令
1# 查看占用端口的进程Id
2lsof -i:8936
3
4kill -9 [进程id]
第三步:下载和运行设备端代码示例
1.下载设备SDK和DEMO代码
官网下载Android SDK代码示例,解压缩之后可以获取到对应的SDK和Demo代码。
Demo示例运行环境配置如下:
1). Android Studio Electric Eel | 2022.1.1 RC 1 、gradle 7.2版本
2).下载链接最新压缩包, 使用Android Studio 打开 demo_source 项目。
2.修改参数配置项
chatagent.zip解压后需要更换成客户申请的appId/licenskey以及客户搭建的服务端的locahost参数即可运行,具体如下:
1// 修改demo_source/chat_demo/src/main/res/values/strings.xml 中agent_default_app_id参数。
2 <string name="agent_default_app_id" translatable="false">"your_appId"</string>

1// 修改demo_source/chat_demo/src/main/java/com/baidu/ai/sample/HttpClient.java 中HOST字符串
2 public static final String HOST = "http://localhost:8936/";

1# 修改demo_source/chat_demo/src/main/java/com/baidu/ai/sample/AIController.java 中licenskey参数, 换成客户申请的licensekey。

完成上面的参数配置即可:
1# 编译下载运行命令
2bash ./gradlew :chat_demo:assemble
进阶:常见问题及解决办法
三种对话模式说明 语音对话集成模式介绍
海外节点接入说明
1// 欧美
2mAiAgentParams.regionServer = Constants.AgentRegionType#europeAmerica
3
4// 香港
5mAiAgentParams.regionServer = Constants.AgentRegionType#hongKong
1.音频外部采集
支持外部音频采集
1// 打开外部音频采集
2mAiAgentParams.enableExternalAudioInput = true;
3// 循环输入音频数据, 每次输入必须是10ms数据,也就是320长度;
4
5public void writeAudioLoop() {
6 final int len = 320;
7 byte[] buffer = new byte[len];
8 int i = 0;
9 while (isInputAlive) {
10 try {
11 // 音频设备采集过来数据, (这里通过本地文件模型音频设备)
12 int ret = fileInputStream.read(buffer, 0, len);
13 if (ret < len) {
14 Log.i(TAG, "fileInputStream EOF");
15 break;
16 }
17 mEngine.pushAudioFrame(buffer, System.nanoTime(), SAMPLE_RATE, 1);
18 TimeUnit.MILLISECONDS.sleep(10);
19 } catch (Exception e) {
20 e.printStackTrace();
21 }
22 }
23}
1// 打开外部音频播放
2mAiAgentParams.enableExternalAudioOutput = true;
3// 循环输出音频数据, 每次输入必须是10ms数据,也就是320长度;
4
5
6/** 音频输出接口 */
7@Override
8public void onPlaybackAudioFrame(byte[] data, int sampleRate, int channelCount) {
9 if (mAudioDevice != null) {
10 mAudioDevice.renderAudioFrame(data, sampleRate, channelCount);
11 }
12}
3.日志和调试
1// 打开详细日志
2mAiAgentParams.verbose = true;
3
4// 打开日志回调, 打开后通过回调 public void onAgentLogPrint(String msg) 日志,方便接入方收集日志
5mAiAgentParams.enableLogCallback = true;
4.回声
1// 部分安卓设备没有硬件回音消除能力情况下打开软件回音消除
2 mAiAgentParams.audioEchoCancellationType = Constants.AudioEchoCancellationType.SOFT_WARE;
3
4.关闭蓝牙监听
1 // 关闭蓝牙监听
2 mAiAgentParams.disableBluetooth = true;
3
如果本地设备回声效果不好可以尝试使用云上回声消除;
方法1:云上调优回声消除AEC
- 开启云上回声消除AEC功能,请参见云端音频3A功能最佳实践
方法2:切换到对话模式:按键说话、连续对话(唤醒词打断)
按键说话、连续对话(唤醒词打断),这两种是单工对话,不依赖回声消除功能,可解决这个问题。 可参考:语音对话集成模式介绍
在控制台上配置人设,高质量编写人设提示词
如何使用已定义的人设
创建智能体指定已定义的人设
1 - 在服务器上调用generateAIAgentCall接口,传入config参数`sceneRole:人设名称`。 人设名称就是控制台定义的人设名称。
动态切换已定义的人设及音色
在服务器上调用operation?switchSceneRole接口, 指定对应的人设名称、音色名。
-
设备未授权提示及处理办法
设备连接到服务器后,服务器会下发鉴权请求,如鉴权失败,设备有未授权提示,且服务器主动与设备断开连接。造成这个原因一般有3种情况:
Plain Text1* 设备连接服务未正确传入license、DeviceID、UserID信息,或者license无效。 注意:DeviceID可能是SDK自动获取硬件码,无需填写;Websocket对接则需显示传入。DeviceID、UserID要求appid纬度唯一。 2* 网络原因导致服务端未及时收到鉴权的响应。 建议切换到良好的网络。 3* 多台设备非法共用同一个license。 云端会检测到异常,主动断开设备连接。 -
判断对话响应延时正常与否,及优化建议
-
更多的资料从哪里找
- 集成流程完整介绍
- 声纹使用最佳实践
- 定时器使用最佳实践
- 多语言使用最佳实践
- 产品功能特性表介绍
- 更多的服务端接口
