You need to enable JavaScript to run this app.
导航
配置对话触发模式
最近更新时间:2025.04.23 12:58:05首次发布时间:2025.04.23 12:58:05
我的收藏
有用
有用
无用
无用

在用户与智能体互动的过程中,你可能需要灵活配置新一轮对话的触发时机,实现更精细的交互体验。RTC 提供手动触发和自动触发两种触发方式,你可根据场景自由选择使用,提升对话的流畅度和自然度。

应用场景

场景描述
咨询陪练
  • 自动触发:用户语音输入后自动触发新一轮对话。
  • 手动触发:用户按住按钮开始说话,结束松开,手动触发新一轮对话。
在线教育
  • 自动触发:学生自由询问自动触发新一轮对话。
  • 手动触发:学生通过点击按钮控制开始和结束说话,结束说话按钮点击后手动触发新一轮会话。

前提条件

你已参考场景搭建 了解 AI 应用的整体构建流程。

自动触发新一轮对话

若开启自动触发新一轮对话功能,RTC 检测到用户输入完整的一句话后自动触发新一轮会话,反应迅速,实现和用户快速流畅交流。
你需要调用StartVoiceChat接口,将ASRConfig.InterruptConfig.TurnDetectionMode 设置为 0,即可开启自动触发新一轮对话功能。

手动触发新一轮对话

若开启手动触发新一轮对话功能,用户输入完整的一句话后,需要你根据收到的输入结束信令或字幕结果决定是否手动触发新一轮会话。精准控制,实现和用户安全交流。

步骤 1:编写触发时机逻辑

  • 如果你选择使用输入结束信令进行触发时机判断,你需要根据业务逻辑自行编写。
  • 如果你选择使用字幕结果进行触发时机判断,你可参看实时对话式 AI 字幕实现。

步骤 2:设置手动触发新一轮对话模式

调用StartVoiceChat接口,ASRConfig.InterruptConfig.TurnDetectionMode 设置为 1

步骤 3:手动触发新一轮对话

收到输入结束信令或字幕结果后,你可通过服务端或客户端手动触发新一轮对话,具体方式取决于业务需求。例如,在 AI 应用开发中,若采用服务端响应请求,建议使用服务端触发新一轮对话,以降低请求延迟。

通过服务端触发新一轮对话

调用 UpdateVoiceChat接口,设置以下参数手动触发新一轮对话:

参数类型描述
AppIdString你的音视频应用的唯一标志,参看创建 RTC 应用获取或创建 AppId。
RoomIdStringAI 通话房间的 ID,需与房间内客户端 SDK 进房时的使用的 RoomId 保持一致。
TaskIdString智能体任务 ID。你需要对每个智能体任务自行定义 TaskId,且在后续进行任务更新和结束时也须使用该 TaskId。
CommandString填入FinishSpeechRecognition,表示触发新一轮对话。

你可参看以下示例通过服务端实现触发新一轮对话操作:

POST https://rtc.volcengineapi.com?Action=UpdateVoiceChat&Version=2024-12-01
{
    "AppId": "661e****543cf", 
    "RoomId": "Room1", 
    "TaskId": "task1", 
    "Command": "FinishSpeechRecognition"
}

通过客户端触发新一轮对话

使用 SendUserBinaryMessage 接口触发新一轮对话。

SendUserBinaryMessage 传入参数:

参数名类型说明
userIdString智能体名称,需与 StartVoiceChat 接口中传入的 UserId 一致。
bufferbyte[]发送的二进制消息内容。消息不超过 46KB。
configMessageConfig消息发送的可靠/有序类型,参看 MessageConfig

该接口的 buffer 参数需要传入特定格式的内容,下图展示了 buffer 参数的格式:

alt

参数名类型描述
magic_numberbinary消息格式标识符,当前场景消息格式固定为 ctrl,用于标识该消息为控制消息。
lengthbinary触发新一轮对话消息长度,单位为字节,采用大端序(Big-endian)存储方式,用于说明 control_message 字段的字节长度。
control_messagebinary触发新一轮对话行为配置信息,采用 JSON 格式,具体内容格式参看 control_message 格式

control_message

参数名类型描述
CommandString控制命令,此处填入 FinishSpeechRecognition,表示触发新一轮对话。

你可参看以下示例从客户端实现触发新一轮对话操作:

// 发送触发新一轮对话指令
void sendFinishRecognitionMessage(const std::string &uid) {
    nlohmann::json json_data;
    json_data["Command"] = "FinishSpeechRecognition";
    sendUserBinaryMessage(uid, json_data.dump());
}
void buildBinaryMessage(const std::string& magic_number, const std::string& message, size_t& binary_message_length, std::shared_ptr<uint8_t[]>& binary_message) { //将字符串包装成 TLV
    auto magic_number_length = magic_number.size();
    auto message_length = message.size();

    binary_message_length = magic_number_length + 4 + message_length;
    binary_message = std::shared_ptr<uint8_t[]>(new uint8_t[binary_message_length]);
    std::memcpy(binary_message.get(), magic_number.data(), magic_number_length);
    binary_message[magic_number_length] = static_cast<uint8_t>((message_length >> 24) & 0xFF);
    binary_message[magic_number_length+1] = static_cast<uint8_t>((message_length >> 16) & 0xFF);
    binary_message[magic_number_length+2] = static_cast<uint8_t>((message_length >> 8) & 0xFF);
    binary_message[magic_number_length+3] = static_cast<uint8_t>(message_length & 0xFF);
    std::memcpy(binary_message.get()+magic_number_length+4, message.data(), message_length);
}

int sendUserBinaryMessage(const std::string &uid, const std::string& message) {
    if (rtcRoom_ != nullptr)
    {
        size_t length = 0;
        std::shared_ptr<uint8_t[]> binary_message = nullptr;
        buildBinaryMessage("ctrl", message, length, binary_message);
        return rtcRoom_->sendUserBinaryMessage(uid.c_str(), static_cast<int>(length), binary_message.get());
    }
    return -1;