You need to enable JavaScript to run this app.
导航
打断智能体
最近更新时间:2025.12.04 10:55:53首次发布时间:2025.04.01 17:09:09
复制全文
我的收藏
有用
有用
无用
无用

你可以通过语音自动打断或手动打断两种方式来中断智能体讲话,以开启新一轮对话,从而提升交互的流畅度和自然度。

  • 自动打断:系统根据用户的语音输入,自动判断并打断智能体。支持三种策略:发声即打断、按说话时长打断、按关键词打断。
  • 手动打断:用户主动发起中断请求(如点击按钮或发送命令等)。该操作可在客户端或服务端实现。

应用场景

应用场景

描述

智能客服

使用较短的自动打断时长,并配合手动打断,以实现快速响应和精准控制。

在线教育

使用较长的自动打断时长,避免误打断学生发言。教师可使用手动打断进行必要干预。

多人会议

结合使用自动打断和手动打断,灵活管理发言权。

默认打断策略

若你未进行任何打断相关配置,或保留相关参数为默认值,系统将采用发声即打断策略。

自动打断

系统根据用户的音频输入,自动判断是否需要中止智能体的输出。

发声即打断

一旦检测到用户发出声音,智能体立刻停止讲话。

  • 关键配置
    调用 StartVoiceChat 时,Config 对象中的以下参数保持默认值:
    • InterruptMode0(默认)。
    • InterruptConfig:保持默认值。
    • VADConfig.SilenceTime:建议保持默认值(600 ms)或根据具体场景适当调整(例如 800 ms - 1200 ms),以确保用户在触发打断后,有足够的时间完整表达其意图,避免因 VAD(语音检测)过早结束而导致语音输入不完整。确保用户在打断后有足够的时间完整表达,避免因VAD(语音活动检测)过早结束而导致输入不完整。
  • 请求示例
    "Config": {
        // InterruptMode 默认值为 0, 即开启此策略
        "ASRConfig": {
            // ... 其他 ASR 必要配置 ...
            "VADConfig": {
                "SilenceTime": 600 // 可按需调整
            }
            // InterruptConfig 保持默认值
        }
        // ... 其他 TTSConfig, LLMConfig 等配置 ...
    }
    

按用户说话时长打断

仅当检测到用户持续说话的时长达到预设阈值后,智能体才会停止讲话。适用于希望避免因短暂的语气词(如“嗯”、“好的”)或背景人声而产生的意外打断。

  • 关键配置
    调用 StartVoiceChat 时,在 Config 对象中配置以下参数:
    • InterruptSpeechDuration:设置为一个合适的毫秒数。取值范围为[200, 3000],单位为 ms。
    • SilenceTime:确保此值显著大于 InterruptSpeechDuration,以便用户在触发打断后有足够时间说完话。
  • 请求示例
    "Config": {
        "ASRConfig": {
            // ... 其他 ASR 必要配置 ...
            "InterruptConfig": {
                "InterruptSpeechDuration": 300 // 用户连续说满300毫秒后打断
            },
            "VADConfig": {
                "SilenceTime": 800 // 必须大于 InterruptSpeechDuration
            }
        }
        // ... 其他配置 ...
    }
    

通过关键词打断

当用户说出预设的关键词时,智能体才会停止讲话。适用于需要用户明确表达意图才能打断的场景,如多人会议。

  • 关键配置
    调用 StartVoiceChat 时,在 Config 对象中配置:

    • InterruptMode:保持为默认值 0

    • InterruptKeywords:关键词列表,如 ["停止", "下一个"]

      说明

      启用关键词打断时,请勿同时设置 InterruptSpeechDuration。时长判断的优先级高于关键词,若用户说话时长未达到 InterruptSpeechDuration,即使用户说出关键词也不会触发打断。

    • 配置热词/替换词 (可选):通过热词或替换词功能,提高关键词的识别准确率。仅火山流式语音识别大模型支持

      功能

      配置说明

      热词

      如果关键词识别率较低(如为专有名词、特定术语等),可将其作为热词传入 ASR 模型,提高这些词汇的识别准确度。可通过以下方式传入:

      • 直接传入(适用临时或少量关键词场景):
        通过 ASRConfig.ProviderParams.context,直接将多个热词作为 JSON 字符串传入。
      • 通过热词词表 ID/名称传入(适用于大量、常用或需要长期维护的热词):
        1. 在火山引擎大模型的自学习平台预先创建热词词表。如何创建?
        2. 调用 StartVoiceChat 时,设置参数 boosting_table_idboosting_table_name

      优先级:热词直传优先热词词表。

      替换词

      将关键词替换为你期望的词汇。可通过以下步骤传入:

      1. 在豆包语音控制台创建替换词词表。如何创建?
      2. 调用 StartVoiceChat 时,设置参数 correct_table_idcorrect_table_name

      优先级:替换词优先于热词。即如果一个词同时是热词和替换词的源词,替换词生效。例如,热词里有“苹果”,替换词要求“苹果→Apple”,那最后结果为 “Apple”。

  • 请求示例

    "Config": {
        "ASRConfig": {
            "Provider": "volcano",
            "ProviderParams": {
                "Mode": "bigmodel", // 若使用热词/替换词,必须指定为大模型模式
                "AppId": "YOUR_ASR_APPID",
                "AccessToken": "YOUR_ASR_TOKEN",
                "context": "{\"hotwords\": [{\"word\":\"停止\"},{\"word\":\"下一个\"}]}" // 直接传入热词示例
            },
            "InterruptConfig": {
                "InterruptKeywords": ["停止", "下一个"]
            },
            "VADConfig": {
                "SilenceTime": 600
            }
        }
        // ... 其他配置 ...
    }
    

关闭自动打断

如需确保智能体播报不被用户语音打断,可在调用 StartVoiceChat 时,将 Config.InterruptMode 设置为 1

手动打断

用户通过点击按钮等交互方式,主动发起请求来中断智能体的讲话。

通过服务端实现

调用 UpdateVoiceChat 接口,并将 Command 参数固定设置为 interrupt

其他参数说明请参见 UpdateVoiceChat

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

通过客户端实现

在客户端调用 ByteRTC SDKsendUserBinaryMessage 接口发送一个特定格式的二进制消息来实现打断。

  • userId:填入智能体 ID(即 StartVoiceChat 配置的 AgentConfig.UserId)。
  • buffer:需要传入特定格式的内容。

Image

参数名

类型

描述

magic_number

binary

消息格式标识符,当前场景消息格式固定为 ctrl,用于标识该消息为控制消息。

length

binary

打断消息长度,单位为字节,采用大端序(Big-endian)存储方式,用于说明 control_message 字段的字节长度。

control_message

binary

打断行为配置信息,采用 JSON 格式。如下所示:

{
    "Command": "interrupt"
}

你可以请参考以下代码示例来构建并发送该二进制消息:

// 发送打断指令
void sendInterruptMessage(const std::string &uid) {
    nlohmann::json json_data;
    json_data["Command"] = "interrupt";
    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;

接收打断通知

您可以通过业务服务器或客户端,订阅状态回调来实时获取智能体被打断的通知。具体操作,请参见接收智能体状态

FAQ

如何降低背景噪音导致的误打断?

您可以尝试以下一种或多种方法:

  • 方法 1:开启降噪
    通过调整音量增益、开启 AI 降噪或声纹降噪,去除背景噪音,减少因噪音被误识别为语音而触发的无效打断。具体操作,可参见语音降噪

  • 方法 2:使用关键词打断
    设置只有在检测到指定关键词时才会打断智能体。如何设置关键词打断?

  • 方法 3:降低打断阈值组合策略

    • 设置打断持续时长InterruptSpeechDuration):设置为一个大于 0 的值(例如 2000 ms),只有当声音持续达到该时长后才会触发打断,有效过滤短暂噪音。
    • 调整音量增益VolumeGain):适当降低 VolumeGain 的值,从而降低送入 ASR 的整体音量,使得较小的背景音可能不被识别为语音活动。需要注意,过度降低可能影响正常语音识别。
      请求示例
    POST https://rtc.volcengineapi.com?Action=StartVoiceChat&Version=2024-12-01
    {
        "Config": {
            "ASRConfig": {
                // Provider, ProviderParams 等其他 ASR 必要配置需填写
                "InterruptConfig": {
                    "InterruptSpeechDuration": 2000 // 设置用户持续说话2000ms后打断
                },
                "VADConfig": {
                    "SilenceTime": 2500 // 示例,可按需调整,确保大于 InterruptSpeechDuration
                },
                "VolumeGain": 0.3 
            }
            // 其他 TTSConfig, LLMConfig 等配置也需按实际情况填写
        }
        // 其他请求参数...
    }
    
  • 方法 4:关闭语音自动打断,采用手动打断
    关闭语音自动打断功能,让用户根据自己的需求和判断主动发起打断。具体操作,请参看关闭语音自动打断手动打断

VAD 对语音打断持续时长有影响吗?

SilenceTime 不会直接改变 InterruptSpeechDuration的阈值,但如果设置得太短,它会在用户说到一半时就判定语音结束,导致用户的说话时长无法达到 InterruptSpeechDuration 的阈值,从而使打断失败。请务必确保 SilenceTime 大于 InterruptSpeechDuration

如智能体说话时被打断,已经输出的内容会存入上下文吗?

不会。被打断的部分会被丢弃,不会进入 LLM 的对话历史。