本文将向您详细介绍,如何借助AICallKit SDK所提供的端侧接口,发起智能体呼叫。
场景说明
通过AICallKit SDK端侧接口发起智能体呼叫,无需调用服务端OpenAPIGenerateAIAgentCall - 生成AI智能体通话实例和StartAIAgentInstance - 启动智能体实例接口和强依赖AppServer部署,只需要在发起呼叫时传入RTC Token用来鉴权,鉴权通过后即可启动AI智能体通话。
该方式目前仅支持Android和iOS端。
ARTC SDK必须是7.1.0及以上。
实现端侧发起通话
流程说明
功能实现
步骤一:生成RTC 鉴权Token
AICallKit SDK提供的端侧接口可直接发起智能体通话,该接口需要传入一个鉴权Token。为此,您的业务服务器需要提供生成RTC鉴权Token的接口,以便您的客户端在调用前提前访问该接口获取Token。生成RTC Token之前,您需提前准备好音视频ARTC应用的AppId和AppKey:
步骤二:创建并初始化通话引擎
如何通过AICallKit SDK创建并初始化通话引擎的代码示例:
ARTCAICallEngine mARTCAICallEngine = null;
// 创建engine实例
void initEngine(Context context, String userId) {
// 初始化
// context -> Android Context
// userId -> 进入rtc频道的用户id
mARTCAICallEngine = new ARTCAICallEngineImpl(context, userId);
// 指定智能体的类型:纯语音、数字人、视觉理解
ARTCAICallEngine.ARTCAICallAgentType aiAgentType = VoiceAgent;
mARTCAICallEngine.setAiAgentType(aiAgentType);
// 如果是数字人类型,则需要配置数字人显示的视图容器
if (aiAgentType == AvatarAgent) {
ViewGroup avatarlayer;
mARTCAICallEngine.setAvatarAgentView(
avatarlayer,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT)
);
}
// 如果是视觉理解类型,则需要配置本地视频预览显示的视图容器
else if (aiAgentType == VisionAgent) {
ViewGroup previewLayer;
mARTCAICallEngine.setVisionPreviewView(previewLayer,
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT)
);
}
}
// 设置回调
void initCallback() {
mARTCAICallEngine.setEngineCallback(mCallEngineCallbackWrapper);
}
// 回调处理(仅示例部分核心的回调操作)
ARTCAICallEngine.IARTCAICallEngineCallback mCallEngineCallbackWrapper = new ARTCAICallEngine.IARTCAICallEngineCallback() {
@Override
public void onErrorOccurs(ARTCAICallEngine.AICallErrorCode errorCode) {
// 发生了错误,结束通话
mARTCAICallEngine.handup();
}
@Override
public void onCallBegin() {
// 通话开始(入会)
}
@Override
public void onCallEnd() {
// 通话结束(离会)
}
@Override
public void onAICallEngineRobotStateChanged(ARTCAICallEngine.ARTCAICallRobotState oldRobotState, ARTCAICallEngine.ARTCAICallRobotState newRobotState) {
// 机器人状态同步
}
@Override
public void onUserSpeaking(boolean isSpeaking) {
// 用户说话回调
}
@Override
public void onUserAsrSubtitleNotify(String text, boolean isSentenceEnd, int sentenceId) {
// 同步ASR识别用户的话
}
@Override
public void onAIAgentSubtitleNotify(String text, boolean end, int userAsrSentenceId) {
// 同步智能体回应的话
}
@Override
public void onNetworkStatusChanged(String uid, ARTCAICallEngine.ARTCAICallNetworkQuality quality) {
// 网络状态回调
}
@Override
public void onVoiceVolumeChanged(String uid, int volume) {
// 音量变化
}
@Override
public void onVoiceIdChanged(String voiceId) {
// 当前通话的音色发生了改变
}
@Override
public void onVoiceInterrupted(boolean enable) {
// 当前通话的语音打断设置改变
}
@Override
public void onAgentVideoAvailable(boolean available) {
// 智能体视频是否可用(推流)
}
@Override
public void onAgentAudioAvailable(boolean available) {
// 智能体音频是否可用(推流)
}
@Override
public void onAgentAvatarFirstFrameDrawn() {
// 数字人首视频帧渲染
}
@Override
public void onUserOnLine(String uid) {
// 用户上线回调
}
};
// 创建engine实例
let engine = ARTCAICallEngineFactory.createEngine()
let agentType: ARTCAICallAgentType
// 初始化engine实例
public func setup() {
// 设置回调
self.engine.delegate = self
// 如果是数字人类型,则需要配置数字人显示的视图配置
if self.agentType == .AvatarAgent {
let viewConfig = ARTCAICallViewConfig(view: self.avatarAgentView)
self.engine.setAgentViewConfig(viewConfig: viewConfig)
}
// 如果是视觉理解类型,则需要配置本地视频预览配置
else if self.agentType == .VisionAgent {
// 这里frameRate设置为5,需要根据控制台上的智能体的抽帧率(一般为2)进行调整,最大不建议超过15fps
// bitrate: frameRate超过10可以设置为512
let visionConfig = ARTCAICallVisionConfig(preview: self.visionCameraView, viewMode: .Auto, frameRate: 5, bitrate: 340)
self.engine.visionConfig = visionConfig
}
}
步骤三:创建并初始化ARTCAICallConfig
如何通过AICallKit SDK创建并初始化发起通话配置的代码示例及说明:
ARTCAICallConfig配置
参数名 | 参数类型 | 是否必填 | 参数描述 |
mAiCallAgentTemplateConfig | ARTCAICallAgentTemplateConfig | 是 | 启动通话的TemplateConfig参数 |
mAiCallChatSyncConfig | ARTCAICallChatSyncConfig | 否 | 关联的chat智能体配置,如果设置了,那么在通话过程中会把通话记录同步到chat智能体上 |
mAiCallVideoConfig | ARTCAICallVideoConfig | 否 | 视频相关配置 |
ARTCAICallAgentTemplateConfig配置
参数名 | 参数类型 | 是否必填 | 参数描述 |
aiAgentId | String | 是 | 智能体Id |
aiAgentRegion | String | 是 | 智能体服务所在的区域,必须是agentId所在的区域,否则启动智能体会报错 |
ARTCAICallEngine.ARTCAICallConfig artcaiCallConfig = new ARTCAICallEngine.ARTCAICallConfig();
//智能体ID,必填
artcaiCallConfig.mAiCallAgentTemplateConfig.aiAgentId = "XXX";
//智能体所在区域,必填
artcaiCallConfig.mAiCallAgentTemplateConfig.aiAgentRegion = aiAgentRegion;
mARTCAICallEngine.init(artcaiCallConfig);
ARTCAICallConfig配置
参数名 | 参数类型 | 是否必填 | 参数描述 |
agentId | String | 是 | 智能体Id |
agentType | ARTCAICallAgentType | 是 | 智能体类型,必须是agentId的类型,否则启动智能体会报错 |
region | String | 是 | 智能体服务所在的区域,必须是agentId所在的区域,否则启动智能体会报错 |
userId | String | 是 | 当前用户Id |
userJoinToken | String | 是 | 当前用户的入会的RTC Token,参考“生成RTCToken” 注意:AgentId必须与生成RTCToken的AppId为同一个 |
agentUserId | String | 否 | 智能体的Uid,为空时,由智能体服务分配uid |
userData | Dictionary | 否 | 用户自定义信息,该信息最终传给智能体 |
templateConfig | ARTCAICallTemplateConfig | 否 | 用于启动通话的TemplateConfig参数 |
chatSyncConfig | ARTCAICallChatSyncConfig | 否 | 关联的chat智能体配置,如果设置了,那么在通话过程中会把通话记录同步到chat智能体上 |
let callConfig = ARTCAICallConfig()
callConfig.agentId = "xxx" // 智能体Id
callConfig.agentType = self.agentType // 智能体类型
callConfig.userId = "xxx" // 推荐使用你的App登录后的用户id
callConfig.region = "xx-xxx" // 智能体服务所在的区域
callConfig.userJoinToken = "xxxxxxxxx" // RTC Token
步骤四:启动通话
如何通过AICallKit SDK启动通话的代码示例
// 启动智能体后,开始通话
void call() {
// 传入RTC鉴权Token,该Token由业务server根据规则生成下发给客户端
String token = "XXX";
mARTCAICallEngine.call(token);
}
// 结束通话
void handup() {
mARTCAICallEngine.handup();
}
// 启动智能体后,开始通话
public func start() {
let callConfig = ... // 参考上面代码生成callConfig对象
if self.engine.call(config: callConfig) {
// API被成功调用
}
}
// 如果智能体启动通话成功,会触发下面回调
func onAgentStarted() {
// 智能体实例已启动
}
// 如果当前通话接通,会触发下面回调
func onCallBegin() {
// 通话开始
}
// 如果启动通话失败,会触发下面回调
func onErrorOccurs(code: ARTCAICallErrorCode) {
// 通过过程发生了错误,进行挂断
self.engine.handup()
}
- 本页导读 (1)
- 场景说明
- 实现端侧发起通话
- 流程说明
- 功能实现