如何通过AICallKit SDK端侧接口发起智能体通话

更新时间:2025-04-10 06:06:28

本文将向您详细介绍,如何借助AICallKit SDK所提供的端侧接口,发起智能体呼叫。

场景说明

通过AICallKit SDK端侧接口发起智能体呼叫,无需调用服务端OpenAPIGenerateAIAgentCall - 生成AI智能体通话实例StartAIAgentInstance - 启动智能体实例接口和强依赖AppServer部署,只需要在发起呼叫时传入RTC Token用来鉴权,鉴权通过后即可启动AI智能体通话。

说明
  • 该方式目前仅支持AndroidiOS端。

  • ARTC SDK必须是7.1.0及以上。

实现端侧发起通话

流程说明

image

功能实现

步骤一:生成RTC 鉴权Token

AICallKit SDK提供的端侧接口可直接发起智能体通话,该接口需要传入一个鉴权Token。为此,您的业务服务器需要提供生成RTC鉴权Token的接口,以便您的客户端在调用前提前访问该接口获取Token。生成RTC Token之前,您需提前准备好音视频ARTC应用的AppIdAppKey:

  1. 前往智能媒体控制台,单击您创建好的智能体,进入智能体详情页面。

    image

  2. 单击RTC AppID,前往视频直播控制台,获取AppIdAppKey。

    image

  3. 根据获取的AppIdAppKey生成RTC鉴权Token。

    服务端生成Token

    生成RTC鉴权Token,请参见ARTC场景中单参数入会的方式进行生成。

    客户端内置Token

    如果您在开发阶段无法在AppServer实现RTCToken的生成,可以在客户端本地进行签发,该方式需要在你的端侧内置RTC AppIdAppKey。您可以参考Token原理及计算方法中的方式一进行生成。

    说明

    该方法涉及内置的AppKey等敏感信息,仅适用于体验及开发阶段,不得用于线上发布,以防止AppKey被盗取而导致安全事件的发生。

步骤二:创建并初始化通话引擎

如何通过AICallKit SDK创建并初始化通话引擎的代码示例:

Android
iOS
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创建并初始化发起通话配置的代码示例及说明:

Android
iOS
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必须与生成RTCTokenAppId为同一个

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启动通话的代码示例

Android
iOS
// 启动智能体后,开始通话
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)
  • 场景说明
  • 实现端侧发起通话
  • 流程说明
  • 功能实现
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等