本文将介绍设备如何在 Android 平台接入 AI 语音对话 能力,实现与云端智能体的实时语音交互、文本消息收发、对话打断以及语义触发联系人呼叫,帮助您快速了解 AI 语音对话的功能。
前提条件
在开始之前,请您先完成以下步骤,若您已经完成对应的步骤,可跳过:
2. 购买了 腾讯云物联网开发平台 相关实例,开通并激活了 智能语音增值服务。
3. 在 物联网开发平台控制台 拿到了本 Demo 所需要的设备三元组(已经激活过了)。
4. 完成 登录与注册 文档中的跑通登录功能。
说明:
AI 对话服务属于增值服务,必须开通此增值服务后激活设备 license 才可以正常使用。
AI 语音对话依赖麦克风采集与扬声器播放,请确保已在
AndroidManifest.xml 中声明 android.permission.RECORD_AUDIO 权限,并在运行时向用户申请授权,同时请确认该设备所属产品已在控制台开通 AI 对话服务,否则将返回 TXIoTError.AITALK_NOT_ACTIVATED。接入步骤
步骤 1:注册回调
登录成功后,通过
TXIoTAITalkSession.getInstance().addListener 注册 TXIoTAITalkSession.Listener,AI 语音对话相关的回调如下:回调 | 说明 |
onReceiveAsrText | 收到用户语音的 ASR 识别结果文本时触发,可用于在屏幕上展示用户说话内容。 |
onReceiveBotText | 收到智能体回复的文本时触发,可用于在屏幕上展示机器人的应答内容。 |
onBotStateChanged | 智能体状态发生变化时触发,携带 oldState 与 newState(详见 BotState),可用于驱动设备指示灯、屏幕动效等交互状态。 |
onLaunchCall | |
onError |
TXIoTAITalkSession.Listener listener = new TXIoTAITalkSession.Listener() {@Overridepublic void onReceiveAsrText(String text) {// 用户语音的识别结果,可显示到屏幕}@Overridepublic void onReceiveBotText(String text) {// 智能体回复的文本,可显示到屏幕}@Overridepublic void onBotStateChanged(TXIoTAITalkSession.BotState oldState,TXIoTAITalkSession.BotState newState) {// 根据 newState 更新设备指示灯、屏幕或其他交互状态}@Overridepublic void onLaunchCall(TXIoTAITalkSession.Contact contact) {// 智能体语义触发联系人呼叫,可据此发起音视频通话}@Overridepublic void onError(int errorCode, String errorMsg) {// 记录 errorCode 和 errorMsg,并停止或重试业务流程}};TXIoTAITalkSession.getInstance().addListener(listener);
步骤 2:参数准备
开始对话前,可通过
TXIoTAITalkSession.Params 指定使用的智能体及自定义提示词变量,可通过 List<TXIoTAITalkSession.Contact>注册联系人让智能体根据语义触发联系人呼叫,最多可注册 10 位联系人。TXIoTAITalkSession.Params params = new TXIoTAITalkSession.Params();params.botId = ""; // 为空则使用平台默认智能体params.promptVariablesJson = ""; // 自定义提示词变量,可为空// 可选:注册联系人,供智能体语义触发呼叫,最多可注册 10 位联系人List<TXIoTAITalkSession.Contact> contacts = new ArrayList<>();TXIoTAITalkSession.Contact contact = new TXIoTAITalkSession.Contact();contact.userId = "USER_ID";contact.userName = "USER_NAME";contacts.add(contact);
步骤 3:开始对话
调用
startSpeak 开始 AI 语音对话,该接口为异步调用,开始成功后即可进入语音交互。相关接口如下:aiTalkSession.startSpeak(params, contacts, new TXIoTCallback() {@Overridepublic void onSuccess() {// 对话已就绪,可开始语音交互Log.i(TAG, "startSpeak success");}@Overridepublic void onError(int code, String desc) {Log.e(TAG, "startSpeak failed: " + code + ", " + desc);}});
步骤 4:发送文本与打断(可选)
对话过程中,除语音交互外,还可通过以下接口进行文本输入与打断控制。以下接口返回
0(TXIoTError.SUCCESS)表示调用成功。// 发送文本消息int ret = aiTalkSession.sendText("今天天气怎么样?");if (ret != TXIoTError.SUCCESS) {Log.e(TAG, "sendText failed: " + ret);}// 打断智能体当前播报aiTalkSession.interrupt();
步骤 5:停止对话
结束对话时,调用
stopSpeak 停止 AI 语音对话,并在页面销毁时移除监听器释放资源:aiTalkSession.stopSpeak();aiTalkSession.removeListener(listener);
示例代码
package com.example.iotdemo;import android.os.Bundle;import android.util.Log;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import com.tencent.liteav.iot.TXIoTAITalkSession;import com.tencent.liteav.iot.TXIoTCallback;import com.tencent.liteav.iot.TXIoTError;import java.util.ArrayList;import java.util.List;public class AITalkActivity extends AppCompatActivity {private static final String TAG = "AITalkActivity";private TXIoTAITalkSession mAITalkSession;private final TXIoTAITalkSession.Listener mListener = new TXIoTAITalkSession.Listener() {@Overridepublic void onReceiveAsrText(String text) {Log.i(TAG, "asr text: " + text);// 将用户语音识别结果显示到屏幕}@Overridepublic void onReceiveBotText(String text) {Log.i(TAG, "bot text: " + text);// 将智能体回复文本显示到屏幕}@Overridepublic void onBotStateChanged(TXIoTAITalkSession.BotState oldState,TXIoTAITalkSession.BotState newState) {Log.i(TAG, "bot state: " + oldState + " -> " + newState);// 根据 newState 更新交互状态}@Overridepublic void onLaunchCall(TXIoTAITalkSession.Contact contact) {Log.i(TAG, "launch call to: " + contact.userName);// 智能体语义触发呼叫,可据此发起音视频通话}@Overridepublic void onError(int errorCode, String errorMsg) {Log.e(TAG, "aitalk error: " + errorCode + ", " + errorMsg);}};@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_aitalk);// 前提:SDK 已完成初始化并登录成功(参见「登录与注册」)mAITalkSession = TXIoTAITalkSession.getInstance();mAITalkSession.addListener(mListener);startAITalk();}private void startAITalk() {// 组装对话参数TXIoTAITalkSession.Params params = new TXIoTAITalkSession.Params();params.botId = ""; // 为空则使用平台默认智能体params.promptVariablesJson = null;// 可选:注册联系人,供智能体语义触发呼叫List<TXIoTAITalkSession.Contact> contacts = new ArrayList<>();TXIoTAITalkSession.Contact contact = new TXIoTAITalkSession.Contact();contact.userId = "USER_ID";contact.userName = "爸爸";contacts.add(contact);// 异步开始对话mAITalkSession.startSpeak(params, contacts, new TXIoTCallback() {@Overridepublic void onSuccess() {Log.i(TAG, "startSpeak success");// 对话已就绪,可开始语音交互;也可直接发送文本int ret = mAITalkSession.sendText("你好");if (ret != TXIoTError.SUCCESS) {Log.e(TAG, "sendText failed: " + ret);}}@Overridepublic void onError(int code, String desc) {Log.e(TAG, "startSpeak failed: " + code + ", " + desc);}});}@Overrideprotected void onDestroy() {// 释放资源mAITalkSession.stopSpeak();mAITalkSession.removeListener(mListener);super.onDestroy();}}
常见问题
现象 | 排查建议 |
启动 AI 对话返回 AITALK_NOT_ACTIVATED(-204) | 设备的 TWeTalk license 未激活,请确认已开通服务并完成设备 license 激活。 |
未收到机器人音频 | 确认 startSpeak 是否回调成功。 |
收不到 onLaunchCall 回调 | 确认在 startSpeak 时传入了有效的联系人列表;确认用户语音中提及的联系人名称与注册的 userName 能够匹配。 |
接口调用返回 NOT_LOGGED_IN(-15) |