启停通话

通过阅读本文,您可以了解如何通过集成AICallKit SDK初始化引擎并启动通话以及通话结束后如何挂断。

使用说明

  • 本示例主要旨在帮助您在不含UI集成的情况下,如何利用API实现该功能。

  • 您需要提前集成AICallkit SDK。如何集成,请参见Android集成SDKiOS集成SDKWeb集成SDK

流程说明

image

在进入通话调用call()方法前,需要通过调用generateAIAgentCall接口启动一个通话实例。generateAIAgentCall接口详情,请参见GenerateAIAgentCall - 生成AI智能体通话实例

在创建及初始化引擎时,具体操作流程如下:

  1. 创建引擎实例,并作为成员变量。

  2. 设置回调。

  3. 初始化配置,包括是否要禁麦、是否要启用听筒、是否要使用前置摄像头等。

  4. 通话设置:

    1. 如果是数字人智能体,为数字人设置渲染视图。

    2. 如果是视觉理解智能体,需要设置预览画面及模式。

示例代码

Android

// 定义成员变量
ARTCAICallEngine mARTCAICallEngine = null;

// 创建及初始化engine实例
void setupEngine(Context context) {
    // 初始化
    // context -> Android Context
    // userId -> 进入rtc频道的用户id
    mARTCAICallEngine = new ARTCAICallDepositEngineImpl(context, userId); 

    // 设置回调
    mARTCAICallEngine.setEngineCallback(mCallEngineCallbackWrapper); 

    // 设置engine的启动参数
    ARTCAICallEngine.ARTCAICallConfig artcaiCallConfig = new ARTCAICallEngine.ARTCAICallConfig();
    // 如果有临时的智能体ID,可以配置
    artcaiCallConfig.aiAgentId = aiAgentId;
    mARTCAICallEngine.init(artcaiCallConfig);
    
    // 指定智能体的类型:纯语音、数字人、视觉理解
    mARTCAICallEngine.setAiAgentType(aiAgentType);

    // 如果是数字人类型,则需要配置数字人显示的视图容器
    if (aiAgentType == AvatarAgent) {
        mARTCAICallEngine.setAvatarAgentView(
            avatarlayer,
            new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                       ViewGroup.LayoutParams.MATCH_PARENT)
        );
    }
    // 如果是视觉理解类型,则需要配置本地视频预览显示的视图容器
    else if (aiAgentType == VisionAgent) {
        mARTCAICallEngine.setVisionPreviewView(previewLayer,
            new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                         ViewGroup.LayoutParams.MATCH_PARENT)
        );
    }
}

// 启动智能体后,开始通话
void start() {
    // 这里启动智能体,成功后调用call进行通话
    // 通过OpenAPI获取到:channle_id, ai_agent_user_id, agent_instance_id, rtc_auth_token

    // 开始通话
    mARTCAICallEngine.call(rtc_auth_token, agent_instance_id, 
                           ai_agent_user_id, channle_id);
}

// 结束通话,同时关闭智能体
void handup() {
    mARTCAICallEngine.handup();
}

// 回调处理(仅示例不分核心的回调操作)
ARTCAICallEngine.IARTCAICallEngineCallback mCallEngineCallbackWrapper = new ARTCAICallEngine.IARTCAICallEngineCallback() {
    @Override
    public void onErrorOccurs(ARTCAICallEngine.AICallErrorCode errorCode) {
        // 通过过程发生了错误,进行挂断
        mARTCAICallEngine.handup();
    }

    @Override
    public void onCallBegin() {
        // 通话开始(入会)
    }

    @Override
    public void onCallEnd() {
        // 通话结束(离会)
    }
};

iOS

// 引入SDK
import ARTCAICallKit


// 创建engine实例
let engine = ARTCAICallEngineFactory.createEngine()
let agentType: ARTCAICallAgentType
let userId: String

deinit {
    // 释放engine
    self.engine.destroy()
}

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
    }
}

// 启动智能体后,开始通话
public func start() {
    // 这里启动智能体,成功后调用call进行通话
    // 通过OpenAPI获取到:channle_id, ai_agent_user_id, agent_instance_id, rtc_auth_token

    // 开始通话
    let agentInfo = ARTCAICallAgentInfo(agentType: self.agentType, 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 {
            // 成功通话
        }
    }
}

// 结束通话,同时关闭智能体
public func handup() {
    // true表示智能体立即结束通话
    self.engine.handup(true)
}

// 回调处理
func onErrorOccurs(code: ARTCAICallErrorCode) {
    // 通过过程发生了错误,进行挂断
    self.engine.handup()
}

func onCallBegin() {
    // 通话开始
}

func onCallEnd() {
    // 通话结束
}

Web

import ARTCAICallEngine from 'aliyun-auikit-aicall';

let engine;

// 创建及初始化 Engine 实例
const setup = () => {
  engine = new ARTCAICallEngine();

  engine.on('errorOccurred', (errorCode) => {
    // 通过过程发生了错误,进行挂断和其他处理
    engine.handup();
    console.error('AICallErrorOccurred', errorCode);
  });

  engine.on('callBegin', () => {
    // 智能体开始通话
    console.log('AICallBegin');
  });

  engine.on('callEnd', () => {
    // 智能体通话结束
    console.log('AICallEnd');
  });
};

const start = async () => {
  // 这里启动智能体,成功后调用call进行通话

  try {
    engine.call(
      // 用户 Id
      userId,
      // 智能体信息
      // agentInfo.agentType 智能体类型, 纯语音、数字人、视觉理解
      // agentInfo.instanceId 智能体实例 Id,对应 OpenAPI 中的 agent_instance_id
      // agentInfo.channelId 智能体通道 Id,对应 OpenAPI 中的 channel_id
      // agentInfo.userId 智能体用户 Id,对应 OpenAPI 中的 ai_agent_user_id
      // agentInfo.rtcToken 智能体 RTC 鉴权 Token,对应 OpenAPI 中的 rtc_auth_token
      // agentInfo.reqId (可选)智能体请求 Id,对应 OpenAPI 中的 req_id
      agentInfo,
      // 智能体配置,可选,如果配置了,则覆盖 Engine 实例的配置
      // config.muteMicrophone 是否静音麦克风,默认 false
      // config.muteCamera 视理解模式默认是否关闭摄像头,默认 false
      // config.previewElement 视觉理解模式本地预览元素
      // config.cameraConfig 视觉理解模式本地摄像头配置 (width, height, frameRate, bitrate)
      // config.templateConfig 参考:https://help.aliyun.com/zh/ims/developer-reference/api-ice-2020-11-09-generateaiagentcall
      config
    );
    // 成功通话
  } catch (error) {
    // 处理错误
  }
};

// 结束通话,同时关闭智能体
const handup = () => {
  engine.handup();
};