You need to enable JavaScript to run this app.
文档中心
实时音视频

实时音视频

复制全文
下载 pdf
开发指南
打断 AI(终止并开启新对话)
复制全文
下载 pdf
打断 AI(终止并开启新对话)
你可以通过语音自动打断或手动打断两种方式来终止 AI 讲话,以开启新一轮对话,从而提升交互的流畅度和自然度。​
  • 自动打断:系统根据用户的语音输入,自动判断并打断 AI。支持三种策略:发声即打断、按说话时长打断、按关键词打断。​
  • 手动打断:用户主动发起中断请求(如点击按钮或发送命令等)。该操作可在客户端或服务端实现。​
说明​
如果您仅希望临时暂停或恢复 AI 的语音播报,可参见暂停或恢复 AI 播报。​
应用场景​
​
应用场景​
描述​
智能客服​
使用较短的自动打断时长并配合手动打断,以实现快速响应和精准控制。​
在线教育​
使用较长的自动打断时长,避免误打断学生发言。教师可使用手动打断进行必要干预。​
多人会议​
结合使用自动打断和手动打断,灵活管理发言权。​
​
默认打断策略​
若你未进行任何打断相关配置,或保留相关参数为默认值,系统将采用发声即打断策略。​
自动打断​
系统根据用户的音频输入,自动判断是否需要中止 AI 的输出。​
发声即打断​
一旦检测到用户发出声音,AI 立刻停止讲话。​
  • 关键配置:​
  • 调用 StartVoiceChat 时,Config 对象中的以下参数保持默认值:​
  • InterruptMode:保持为默认值 0。​
  • InterruptConfig:保持为默认值。​
  • VADConfig.SilenceTime:建议保持默认值(600 ms)或根据具体场景适当调整(例如 800 ms - 1200 ms),以确保用户在触发打断后,有足够的时间完整表达其意图,避免因 VAD(语音活动检测)过早结束而导致语音输入不完整。​
  • 请求示例:​
  • ​
    "Config": {​
    // InterruptMode 默认值为 0, 即开启此策略​
    "ASRConfig": {​
    // ... 其他 ASR 必要配置 ...​
    "VADConfig": {​
    "SilenceTime": 600 // 可按需调整​
    }​
    // InterruptConfig 保持默认值​
    }​
    // ... 其他 TTSConfig, LLMConfig 等配置 ...​
    }​
    ​
按用户说话时长打断​
仅当检测到用户持续说话的时长达到预设阈值后,AI 才会停止讲话。适用于希望避免因短暂的语气词(如“嗯”、“好的”)或背景人声而产生的意外打断。​
  • InterruptMode:保持为默认值 0。​
  • InterruptSpeechDuration:根据用户语速来设置为一个合适值​
  • SilenceTime:显著大于 InterruptSpeechDuration,以便用户在触发打断后有足够时间说完话​
​
"ASRConfig": {​
// ... 其他 ASR 必要配置 ...​
"InterruptConfig": {​
"InterruptSpeechDuration": 300​
},​
"VADConfig": {​
"SilenceTime": 800​
}​
}​
​
通过关键词打断​
当用户说出预设的关键词时,AI 才会停止讲话。适用于需要用户明确表达意图才能打断的场景,如多人会议。​
  • 关键配置:​
  • 调用 StartVoiceChat 时,在 Config.ASRConfig 对象中配置:​
  • InterruptMode:保持为默认值 0。​
  • InterruptKeywords:关键词列表,如 ["停止", "下一个"]。​
说明​
启用关键词打断时,请勿同时设置 InterruptSpeechDuration。时长判断的优先级高于关键词,若用户说话时长未达到 InterruptSpeechDuration,即使用户说出关键词也不会触发打断。​
  • 配置热词/替换词 (可选):通过热词或替换词功能,提高关键词的识别准确率。仅火山流式语音识别大模型支持。​
  • ​
    功能​
    配置说明​
    热词​
    如果关键词识别率较低(如为专有名词、特定术语等),可将其作为热词传入 ASR 模型,提高这些词汇的识别准确度。可通过以下方式传入:​
    • 直接传入(适用临时或少量关键词场景):​
    • 通过 ASRConfig.ProviderParams.context,直接将多个热词作为 JSON 字符串传入。​
    • 通过热词词表 ID/名称传入(适用于大量、常用或需要长期维护的热词):​
    1. 在豆包语音控制台的预先创建热词词表。如何创建?​
    1. 调用 StartVoiceChat 时,设置参数 boosting_table_id 或 boosting_table_name。​
    优先级:热词直传优先热词词表。​
    替换词​
    将关键词替换为你期望的词汇。可通过以下步骤传入:​
    1. 在豆包语音控制台创建替换词词表。如何创建?​
    1. 调用 StartVoiceChat 时,设置参数 correct_table_id 或 correct_table_name。​
    优先级:替换词优先于热词。即如果一个词同时是热词和替换词的源词,替换词生效。例如,热词里有“苹果”,替换词要求“苹果→Apple”,那最后结果为 “Apple”。​
    ​
  • 请求示例​
  • ​
    "ASRConfig": {​
    "Provider": "volcano",​
    "ProviderParams": {​
    "Mode": "bigmodel", // 若使用热词/替换词,必须指定为大模型模式​
    // ... 其他配置 ...​
    "context": "{\"hotwords\": [{\"word\":\"停止\"},{\"word\":\"下一个\"}]}" // 直接传入热词示例​
    },​
    "InterruptConfig": {​
    "InterruptKeywords": ["停止", "下一个"]​
    },​
    "VADConfig": {​
    "SilenceTime": 600​
    }​
    }​
    ​
关闭自动打断​
如需确保 AI 播报不被用户语音打断,可将 Config.InterruptMode 设置为 1。​
对话时更新打断策略​
支持在对话进行中,通过调用 UpdateVoiceChat 接口开启或关闭自动打断功能,无需重新发起任务。新配置将在下一次对话时生效。​
​
{​
"AppId": "YOUR_AppId",​
"RoomId": "YOUR_RoomId",​
"TaskId": "YOUR_TaskId",​
"Command": "UpdateParameters", // 固定值​
"Parameters": {​
"Config": {​
"InterruptMode": 1 // 0: Enable, 1: Disable​
}​
}​
}​
​
手动打断​
用户通过点击按钮等交互方式,主动发起请求来中断 AI 的讲话。​
通过服务端实现​
调用 UpdateVoiceChat 接口,并将 Command 参数固定设置为 interrupt。​
​
{​
"AppId": "YOUR_AppId", // 与 StartVoiceChat 的一致​
"RoomId": "YOUR_RoomId", // 与 StartVoiceChat 的一致​
"TaskId": "YOUR_TaskId", // 与 StartVoiceChat 的一致​
"Command": "interrupt" // 必须为 interrupt​
}​
​
通过客户端实现​
在客户端调用 ByteRTC SDK 的 sendUserBinaryMessage 接口发送一个特定格式的二进制消息来实现打断。​
  • userId:填入 AI 的 ID(即 StartVoiceChat 配置的 AgentConfig.UserId)。​
  • buffer:需要传入特定格式的内容。​
​图片​​
​
参数名​
类型​
描述​
magic_number​
binary​
消息格式标识符,当前场景消息格式固定为 ctrl,用于标识该消息为控制消息。​
length​
binary​
打断消息长度,单位为字节,采用大端序(Big-endian)存储方式,用于说明 control_message 字段的字节长度。​
control_message​
binary​
打断行为配置信息,采用 JSON 格式。如下所示:​
​
{​
"Command": "interrupt"​
}​
​
​
请参考以下代码示例来构建并发送该二进制消息:​
​
C++
Java
TypeScript
​
​
// 发送打断指令​
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<const void*>(binary_message.get()), length);​
}​
return -1;​
​
​
接收打断通知​
您可以通过业务服务器或客户端,订阅状态回调来实时获取 AI 被打断的通知。具体操作,请参见获取 AI 状态。​
FAQ​
如何降低背景噪音导致的误打断?​
您可以尝试以下一种或多种方法:​
  • 方法 1:开启降噪​
  • 通过调整音量增益、开启 AI 降噪或声纹降噪,去除背景噪音,减少因噪音被误识别为语音而触发的无效打断。具体操作,可参见语音降噪。​
  • 方法 2:使用关键词打断​
  • 设置只有在检测到指定关键词时才会打断 AI 。具体操作,参见通过关键词打断。​
  • 方法 3:降低打断阈值组合策略​
  • 设置打断持续时长(InterruptSpeechDuration):设置为一个大于 0 的值(例如 2000 ms),只有当声音持续达到该时长后才会触发打断,有效过滤短暂噪音。​
  • 调整音量增益(VolumeGain):适当降低 VolumeGain 的值,从而降低送入 ASR 的整体音量,使得较小的背景音可能不被识别为语音活动。需要注意,过度降低可能影响正常语音识别。​
  • 请求示例:​
  • ​
    "ASRConfig": {​
    // Provider, ProviderParams 等其他 ASR 必要配置需填写​
    "InterruptConfig": {​
    "InterruptSpeechDuration": 2000 // 设置用户持续说话 2000ms 后打断​
    },​
    "VADConfig": { "SilenceTime": 2500 }, // 可按需调整,确保大于 InterruptSpeechDuration​
    "VolumeGain": 0.3​
    }​
    ​
  • 方法 4:关闭语音自动打断,采用手动打断​
VAD 对语音打断持续时长有影响吗?​
SilenceTime 不会直接改变 InterruptSpeechDuration的阈值,但如果设置得太短,它会在用户说到一半时就判定语音结束,导致用户的说话时长无法达到 InterruptSpeechDuration 的阈值,从而使打断失败。请务必确保 SilenceTime 大于 InterruptSpeechDuration。​
如 AI 说话时被打断,已经输出的内容会存入上下文吗?​
不会。被打断的部分会被丢弃,不会进入 LLM 的对话历史。​
​
最近更新时间:2026.09.21 16:24:31
这个页面对您有帮助吗?
有用
有用
无用
无用