你可以通过语音自动打断或手动打断两种方式来中断智能体讲话,以开启新一轮对话,从而提升交互的流畅度和自然度。
应用场景 | 描述 |
|---|---|
智能客服 | 使用较短的自动打断时长,并配合手动打断,以实现快速响应和精准控制。 |
在线教育 | 使用较长的自动打断时长,避免误打断学生发言。教师可使用手动打断进行必要干预。 |
多人会议 | 结合使用自动打断和手动打断,灵活管理发言权。 |
若你未进行任何打断相关配置,或保留相关参数为默认值,系统将采用发声即打断策略。
系统根据用户的音频输入,自动判断是否需要中止智能体的输出。
一旦检测到用户发出声音,智能体立刻停止讲话。
Config 对象中的以下参数保持默认值:
InterruptMode:0(默认)。InterruptConfig:保持默认值。VADConfig.SilenceTime:建议保持默认值(600 ms)或根据具体场景适当调整(例如 800 ms - 1200 ms),以确保用户在触发打断后,有足够的时间完整表达其意图,避免因 VAD(语音检测)过早结束而导致语音输入不完整。确保用户在打断后有足够的时间完整表达,避免因VAD(语音活动检测)过早结束而导致输入不完整。"Config": { // InterruptMode 默认值为 0, 即开启此策略 "ASRConfig": { // ... 其他 ASR 必要配置 ... "VADConfig": { "SilenceTime": 600 // 可按需调整 } // InterruptConfig 保持默认值 } // ... 其他 TTSConfig, LLMConfig 等配置 ... }
仅当检测到用户持续说话的时长达到预设阈值后,智能体才会停止讲话。适用于希望避免因短暂的语气词(如“嗯”、“好的”)或背景人声而产生的意外打断。
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 模型,提高这些词汇的识别准确度。可通过以下方式传入:
优先级:热词直传优先热词词表。 |
替换词 | 将关键词替换为你期望的词汇。可通过以下步骤传入:
优先级:替换词优先于热词。即如果一个词同时是热词和替换词的源词,替换词生效。例如,热词里有“苹果”,替换词要求“苹果→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 SDK 的 sendUserBinaryMessage 接口发送一个特定格式的二进制消息来实现打断。
userId:填入智能体 ID(即 StartVoiceChat 配置的 AgentConfig.UserId)。buffer:需要传入特定格式的内容。
参数名 | 类型 | 描述 |
|---|---|---|
magic_number | binary | 消息格式标识符,当前场景消息格式固定为 |
length | binary | 打断消息长度,单位为字节,采用大端序(Big-endian)存储方式,用于说明 |
control_message | binary | 打断行为配置信息,采用 JSON 格式。如下所示:
|
你可以请参考以下代码示例来构建并发送该二进制消息:
// 发送打断指令 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;
您可以通过业务服务器或客户端,订阅状态回调来实时获取智能体被打断的通知。具体操作,请参见接收智能体状态。
您可以尝试以下一种或多种方法:
方法 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:关闭语音自动打断,采用手动打断
关闭语音自动打断功能,让用户根据自己的需求和判断主动发起打断。具体操作,请参看关闭语音自动打断和手动打断。
SilenceTime 不会直接改变 InterruptSpeechDuration的阈值,但如果设置得太短,它会在用户说到一半时就判定语音结束,导致用户的说话时长无法达到 InterruptSpeechDuration 的阈值,从而使打断失败。请务必确保 SilenceTime 大于 InterruptSpeechDuration。
不会。被打断的部分会被丢弃,不会进入 LLM 的对话历史。