本文将介绍如何通过AICallKit SDK集成音视频智能体到您的iOS应用中。
环境要求
- Xcode 16.0 及以上版本,推荐使用最新正式版本 
- CocoaPods 1.9.3 及以上版本 
- 准备 iOS 10.0 及以上版本的真机 
集成SDK
target '你的Target' do
  # 依赖实时音视频能力,引入AliVCSDK_ARTC或AliVCSDK_Standard或AliVCSDK_InteractiveLive
  pod 'AliVCSDK_ARTC', '~> x.x.x'
  # 引入AICallKit SDK
  pod 'ARTCAICallKit', '~> 2.1.0'
  
  ...
endARTC SDK版本请到官网获取最新适配版本号。
工程配置
- 添加麦克风与摄像头权限,打开工程info.Plist,添加NSMicrophoneUsageDescription和NSCameraUsageDescription权限。 
- 打开工程设置,在Signing & Capabilities中开启Background Modes,强烈推荐开启后台模式,否则在进入后台后无法继续通话,这时候在您的APP中需要调用结束通话接口。 
SDK使用示例
// 引入SDK
import ARTCAICallKit
// 创建engine实例
var engine: ARTCAICallEngineInterface = {
    return ARTCAICallEngineFactory.createEngine()
}()
// 设置回调
self.engine.delegate = self
// 启动智能体后,开始通话
let agentInfo = ARTCAICallAgentInfo(agentType: workflow_type, channelId: channel_id, uid: ai_agent_user_id, instanceId: agent_instance_id)
self.engine.call(userId: self.userId, token: rtc_auth_token, agentInfo: agentInfo) { [weak self] error in
    if let error = error {
        // 处理错误
    }
    else {
        // 成功通话
    }
}
// 结束通话
self.engine.handup()
// 其他功能调用示例,请参考API说明
// 回调处理(仅示例不分核心的回调操作)
public func onErrorOccurs(code: ARTCAICallErrorCode) {
    // 发生了错误
    self.engine.handup()
}
public func onCallBegin() {
    // 通话开始
}
public func onCallEnd() {
    // 通话结束
}
public func onAgentStateChanged(state: ARTCAICallAgentState) {
    // 智能体状态改变
}
public func onUserSubtitleNotify(text: String, isSentenceEnd: Bool, sentenceId: Int) {
    // 用户提问被智能体识别结果的通知
}
public func onVoiceAgentSubtitleNotify(text: String, isSentenceEnd: Bool, userAsrSentenceId: Int) {
    // 智能体回答结果通知
}
public func onVoiceIdChanged(voiceId: String) {
    // 当前通话的音色发生了改变
}
public func onVoiceInterrupted(enable: Bool) {
    // 当前通话的语音打断是否启用
}API说明
API概览
| 类/协议 | API | 说明 | 
| ARTCAICallEngineInterface 引擎接口定义 | 获取当前通话的UserId | |
| 是否通话中 | ||
| 获取当前智能体信息 | ||
| 获取当前智能体状态 | ||
| 设置和获取回调事件 | ||
| 开始通话 | ||
| 挂断 | ||
| 设置智能体渲染视图配置,当智能体有画面渲染时需要设置(当前仅针对数字人有效) | ||
| 打断智能体讲话 | ||
| 开启/关闭智能打断 | ||
| 切换音色 | ||
| 开启/关闭扬声器 | ||
| 开启/关闭对讲机模式 | ||
| 对讲机模式下,开始讲话 | ||
| 对讲机模式下,结束讲话 | ||
| 对讲机模式下,取消这次讲话 | ||
| 静音/取消禁音麦克风 | ||
| 视觉理解通话参数配置 | ||
| 关闭/取消关闭摄像头。 | ||
| 切换前后摄像头 | ||
| 解析一个分享的智能体信息 | ||
| 启动一个分享的智能体通话 | ||
| 获取RTC引擎 | ||
| 给智能体发送文本消息 | ||
| 给Server发送自定义消息,需要在接通后调用 | ||
| 更新llm的系统提示词,需要在接通后调用 | ||
| 视觉理解智能体,开始启动自定义截帧,启动后,无法通过语音与智能体通话,需要在接通后调用 | ||
| 视觉理解智能体,结束自定义截帧,需要在接通后调用 | ||
| 释放资源 | ||
| ARTCAICallEngineDelegate 引擎回调事件 | 发生了错误 | |
| 通话开始 | ||
| 通话结束 | ||
| 智能体视频是否可用 | ||
| 智能体音频是否可用 | ||
| 当前通话的对讲机模式是否启用 | ||
| 当前智能体即将离开(结束当前通话) | ||
| 收到当前智能体发过来的自定义消息 | ||
| 智能体状态改变 | ||
| 网络状态改变 | ||
| 音量变化 | ||
| 用户提问被智能体识别结果的通知 | ||
| 智能体回答结果通知 | ||
| 当前通话的音色发生了改变 | ||
| 当前通话的语音打断是否启用 | ||
| 智能体当前讲话被打断 | ||
| 当前视觉理解通话是否启用了自定义截帧模式 | ||
| 智能体数字人首帧渲染 | ||
| 当真人即将接管当前智能体 | ||
| 当真人接管已经接通 | ||
| 智能体情绪结果通知 | ||
| ARTCAICallEngineFactory 引擎创建工厂 | 创建默认的引擎实例 | 
ARTCAICallEngineInterface详情
userId
获取当前通话的UserId
var userId: String? {get}isOnCall
是否通话中, 从接通后到挂断或出错前为true,其他为false
var isOnCall: Bool { get }agentInfo
获取当前智能体信息,包括:类型、频道Id、智能体在频道中的uid、智能体运行实例ID
var agentInfo: ARTCAICallAgentInfo? { get }agentState
获取当前智能体状态,包括:聆听中\思考中\讲话中
var agentState: ARTCAICallAgentState { get }delegate
设置和获取回调事件
weak var delegate: ARTCAICallEngineDelegate? { get set }call
开始通话
func call(userId: String, token: String, agentInfo: ARTCAICallAgentInfo, completed:((_ error: NSError?) -> Void)?)参数详情:
| 参数 | 类型 | 含义 | 
| userId | String | 当前用户uid | 
| token | String | 入会Token | 
| agentInfo | ARTCAICallAgentInfo | 智能体信息 | 
| completed | ((_ error: NSError?) -> Void)? | 完成回调 | 
handup
退出通话
 func handup(_ stopAIAgent: Bool)参数详情:
| 参数 | 类型 | 含义 | 
| stopAIAgent | Bool | 是否同事结束当前智能体任务 | 
setAgentViewConfig
设置智能体渲染视图配置,当智能体有画面渲染时需要设置(当前仅针对数字人有效)
func setAgentViewConfig(viewConfig: ARTCAICallViewConfig?)参数详情:
| 参数 | 类型 | 含义 | 
| viewConfig | ARTCAICallViewConfig? | 渲染视图配置,包括渲染视图、渲染模式、镜像模式、旋转模式等 | 
interruptSpeaking
打断智能体讲话
func interruptSpeaking() -> BoolenableVoiceInterrupt
开启/关闭智能打断
func enableVoiceInterrupt(enable: Bool) -> Bool参数详情:
| 参数 | 类型 | 含义 | 
| enable | Bool | 开启/关闭 | 
switchVoiceId
切换音色
func switchVoiceId(voiceId: String) -> Bool参数详情:
| 参数 | 类型 | 含义 | 
| voiceId | String | 音色id | 
enableSpeaker
开启/关闭扬声器
func enableSpeaker(enable: Bool) -> Bool参数详情:
| 参数 | 类型 | 含义 | 
| enable | Bool | 开启/关闭 | 
enablePushToTalk
开启/关闭对讲机模式,对讲机模式下,只有在finishPushToTalk被调用后,智能体才会播报结果
func enablePushToTalk(enable: Bool) -> Bool参数详情:
| 参数 | 类型 | 含义 | 
| enable | Bool | 关闭或启用 | 
startPushToTalk
对讲机模式下,开始讲话
func startPushToTalk() -> BoolfinishPushToTalk
对讲机模式下,结束讲话
func finishPushToTalk() -> BoolcancelPushToTalk
对讲机模式下,取消这次讲话
func cancelPushToTalk() -> BoolmuteMicrophone
静音/取消禁音麦克风
func muteMicrophone(mute: Bool) -> Bool参数详情:
| 参数 | 类型 | 含义 | 
| mute | Bool | 静音/取消禁音 | 
visionConfig
视觉配置,包括分辨率、帧率等,参考ARTCAICallVisionConfig的定义。使用视觉智能体时需要设置,且在通话前设置才能生效。
var visionConfig: ARTCAICallVisionConfig { set get }muteLocalCamera
关闭/取消关闭摄像头。
func muteLocalCamera(mute: Bool) -> Bool参数详情:
| 参数 | 类型 | 含义 | 
| mute | Bool | 关闭或启用 | 
switchCamera
切换前后摄像头
func switchCamera() -> BoolparseShareAgentCall
解析一个分享的智能体信息,解析成功则返回一个ARTCAICallAgentShareConfig类型的实例,可以通过该实例启动一个分享出来的智能体通话
func parseShareAgentCall(shareInfo: String) -> ARTCAICallAgentShareConfig?参数详情:
| 参数 | 类型 | 含义 | 
| shareInfo | String | 分享出来的智能体信息,可以在控制台上生成 | 
generateShareAgentCall
启动一个分享的智能体通话
func generateShareAgentCall(shareConfig: ARTCAICallAgentShareConfig, userId: String, completed: ((_ rsp: ARTCAICallAgentInfo?, _ token: String?, _ error: NSError?, _ reqId: String) -> Void)?)参数详情:
| 参数 | 类型 | 含义 | 
| shareConfig | ARTCAICallAgentShareConfig | 分享智能体配置信息,包括分享id、智能体类型、过期时间、模板配置、区域等,可以到SDK查看定义 | 
| userId | String | 当前登录的用户Id | 
| completed | ((_ rsp: ARTCAICallAgentInfo?, _ token: String?, _ error: NSError?, _ reqId: String) -> Void)? | 操作完成事件 | 
getRTCInstance
获取RTC引擎
func getRTCInstance() -> AnyObject?sendTextToAgent
给智能体发送文本消息
func sendTextToAgent(req: ARTCAICallSendTextToAgentRequest) -> Bool参数详情:
| 参数 | 类型 | 含义 | 
| req | ARTCAICallSendTextToAgentRequest | 发送的消息结构体 | 
sendCustomMessageToServer
给Server发送自定义消息,需要在接通后调用
func sendCustomMessageToServer(msg: String) -> Bool参数详情:
| 参数 | 类型 | 含义 | 
| msg | String | 发送内容 | 
updateLlmSystemPrompt
更新LLM的系统提示词,需要在接通后调用。
func updateLlmSystemPrompt(prompt: String) -> Bool参数详情:
| 参数 | 类型 | 含义 | 
| prompt | String | 提示词 | 
startVisionCustomCapture
视觉理解智能体,开始启动自定义截帧,启动后,无法通过语音与智能体通话,需要在接通后调用
func startVisionCustomCapture(req: ARTCAICallVisionCustomCaptureRequest) -> Bool参数详情:
| 参数 | 类型 | 含义 | 
| req | ARTCAICallVisionCustomCaptureRequest | 配置信息 | 
stopVisionCustomCapture
视觉理解智能体,结束自定义截帧,需要在接通后调用
func stopVisionCustomCapture() -> Booldestroy
释放资源
func destroy()ARTCAICallEngineDelegate详情
onErrorOccurs
当前通话时发生了错误
@objc optional func onErrorOccurs(code: ARTCAICallErrorCode)参数详情:
| 参数 | 类型 | 含义 | 
| code | ARTCAICallErrorCode | 错误类型 | 
onCallBegin
通话开始
@objc optional func onCallBegin()onCallEnd
通话结束
@objc optional func onCallEnd()onAgentVideoAvailable
智能体视频是否可用
@objc optional func onAgentVideoAvailable(available: Bool)参数详情:
| 参数 | 类型 | 含义 | 
| available | Bool | 是否可用 | 
onAgentAudioAvailable
智能体音频是否可用
@objc optional func onAgentAudioAvailable(available: Bool)参数详情:
| 参数 | 类型 | 含义 | 
| available | Bool | 是否可用 | 
onPushToTalk
当前通话的对讲机模式是否启用
@objc optional func onPushToTalk(enable: Bool)参数详情:
| 参数 | 类型 | 含义 | 
| enable | Bool | 是否启用 | 
onAgentWillLeave
当前智能体即将离开(结束当前通话)
@objc optional func onAgentWillLeave(reason: Int32, message: String)参数详情:
| 参数 | 类型 | 含义 | 
| reason | Int32 | 离开原因:2001(闲时退出) 0(其他) | 
| message | String | 离开原因的描述 | 
onReceivedAgentCustomMessage
收到当前智能体发过来的自定义消息
@objc optional func onReceivedAgentCustomMessage(data: [String: Any]?)参数详情:
| 参数 | 类型 | 含义 | 
| data | [String: Any]? | 消息内容 | 
onAgentStateChanged
智能体状态改变
@objc optional func onAgentStateChanged(state: ARTCAICallAgentState)参数详情:
| 参数 | 类型 | 含义 | 
| state | ARTCAICallAgentState | 当前智能体状态:聆听中\思考中\讲话中 | 
onNetworkStatusChanged
网络状态改变
@objc optional func onNetworkStatusChanged(uid: String, quality: ARTCAICallNetworkQuality)参数详情:
| 参数 | 类型 | 含义 | 
| uid | String | 当前讲话人的Id | 
| quality | ARTCAICallNetworkQuality | 网络质量,包括:极好/好/有点差/差/极差/中断/未知 | 
onVoiceVolumeChanged
音量变化通知
@objc optional func onVoiceVolumeChanged(uid: String, volume: Int32)参数详情:
| 参数 | 类型 | 含义 | 
| uid | String | 当前讲话人的uid | 
| volume | Int32 | 音量[0-255] | 
onUserSubtitleNotify
用户提问被智能体识别结果的通知
@objc optional func onUserSubtitleNotify(text: String, isSentenceEnd: Bool, sentenceId: Int)参数详情:
| 参数 | 类型 | 含义 | 
| text | String | 被智能体识别出的提问文本 | 
| isSentenceEnd | Bool | 当前文本是否为这句话的最终结果 | 
| sentenceId | Int | 当前文本属于的句子ID | 
onVoiceAgentSubtitleNotify
智能体回答结果通知
@objc optional func onVoiceAgentSubtitleNotify(text: String, isSentenceEnd: Bool, userAsrSentenceId: Int)参数详情:
| 参数 | 类型 | 含义 | 
| text | String | 智能体回答的文本 | 
| isSentenceEnd | Bool | 当前文本是否为此次回答的最后一句 | 
| userAsrSentenceId | Int | 回答用户问题的句子ID | 
onVoiceIdChanged
当前通话的音色发生了改变
@objc optional func onVoiceIdChanged(voiceId: String)参数详情:
| 参数 | 类型 | 含义 | 
| voiceId | String | 当前音色Id | 
onVoiceInterrupted
当前通话的语音打断是否启用
@objc optional func onVoiceInterrupted(enable: Bool)参数详情:
| 参数 | 类型 | 含义 | 
| enable | Bool | 是否启用 | 
onSpeakingInterrupted
智能体当前讲话被打断
@objc optional func onSpeakingInterrupted(reason: ARTCAICallSpeakingInterruptedReason)参数详情:
| 参数 | 类型 | 含义 | 
| reason | ARTCAICallSpeakingInterruptedReason | 原因,例如:特定词打断 | 
onVisionCustomCapture
当前视觉理解通话是否启用了自定义截帧模式
@objc optional func onVisionCustomCapture(enable: Bool)参数详情:
| 参数 | 类型 | 含义 | 
| enable | Bool | 是否启用 | 
onAgentAvatarFirstFrameDrawn
智能体数字人首帧渲染
@objc optional func onAgentAvatarFirstFrameDrawn()onHumanTakeoverWillStart
当真人即将接管当前智能体
@objc optional func onHumanTakeoverWillStart(takeoverUid: String, takeoverMode: Int)参数详情:
| 参数 | 类型 | 含义 | 
| takeoverUid | String | 真人uid | 
| takeoverMode | Int | 1:表示使用真人音色输出;0:表示使用智能体音色输出 | 
onHumanTakeoverConnected
当真人接管已经接通
@objc optional func onHumanTakeoverConnected(takeoverUid: String)参数详情:
| 参数 | 类型 | 含义 | 
| takeoverUid | String | 真人uid | 
onAgentEmotionNotify
智能体情绪结果通知
@objc optional func onAgentEmotionNotify(emotion: String, userAsrSentenceId: Int)参数详情:
| 参数 | 类型 | 含义 | 
| emotion | String | 情绪标签,例如:neutral\happy\angry\sad 等 | 
| userAsrSentenceId | Int | 回答用户问题的句子ID | 
ARTCAICallEngineFactory详情
createEngine
创建默认的引擎实例
public static func createEngine() -> ARTCAICallEngineInterface