- 作者
-
-
- 姓名
- Amit Shekhar
- 发布于
-
语音 AI Agent 中的话轮转换,是指判断用户何时说完、Agent 何时应该开始说话、以及何时应该因为用户想再次发言而停止说话的能力。
在这篇博客中,我们将学习语音 AI Agent 中的话轮转换。我们还将了解人类在对话中如何轮流发言、为什么这对机器来说很难、语音 AI Agent 如何通过静音和语义来检测话轮的结束、它如何处理打断以及“嗯哼”之类的短促声音,以及全双工模型如何走一条不同的路径。
我们将涵盖以下内容:
- 什么是话轮转换?
- 人类如何轮流发言
- 语音 AI Agent 的工作原理
- 为什么话轮转换对机器来说很难
- 话轮转换的两项任务
- 方法一:等待静音
- 方法二:理解语义
- 处理打断
- 并非每个声音都是新的话轮
- 半双工与全双工 Agent
- 完整的演练
我是 Amit Shekhar,Outcome School 的创始人。我曾指导和培养过许多开发者,他们的努力为他们赢得了高薪的技术工作,帮助许多科技公司解决了他们的独特问题,并创建了许多被顶级公司使用的开源库。我热衷于通过开源、博客和视频分享知识。
我在 Outcome School 教授 AI 和机器学习。
让我们开始吧。
什么是话轮转换?
话轮转换是两个说话者决定谁在何时说话的方式,这样他们就不会互相抢话,也不会留下长时间尴尬的沉默。
一个话轮是指一个说话者的一段发言。当我们说“今天天气怎么样?”时,这整句话就是一个话轮。当对方回答“天气晴朗”时,那就是下一个话轮。
因此,对话就是一连串的话轮:
User: What is the weather today? (turn 1) Agent: It is sunny and 28 degrees. (turn 2) User: Should I carry an umbrella? (turn 3) Agent: No, you will not need one. (turn 4)
语音 AI Agent 是一种通过语音与我们交流的系统。我们说话,它倾听、思考,然后回应。客服电话机器人、语音助手和 AI 前台都是语音 AI Agent。
对于语音 AI Agent 来说,话轮转换意味着反复回答三个问题:
- 用户说完了吗?
- 现在轮到我说话了吗?
- 在我说话时,用户是否又开始说话了?
如果 Agent 能正确回答这些问题,对话就会显得自然。
人类如何轮流发言
在深入探讨机器端之前,我们必须先了解我们人类是如何做到的。
我们人类非常擅长话轮转换。一项针对十种语言对话的研究发现,一个人说完到另一个人开始之间最常见的间隔在 0 到 200 毫秒之间。
这个间隙太短,不足以听完整句话、想好回答再开口说话。也就是说,在对方还在讲话时,我们就已经开始准备回复了。我们会预测对方什么时候快说完。
我们会利用许多信号来判断:
- 词语本身:“我想订一张……的桌子”显然还没说完。
- 语调:陈述句结尾时我们的声音通常会下降,而是非疑问句结尾时常常会上升。
- 停顿:思路中间的短暂停顿与结尾处的停顿是不同的。
我们还会自然而然地做另外两件事:
- 当对方插话补充重要内容时,我们会停止说话。
- 在对方讲话时,我们会说一些“嗯”“对”“好”之类的小词,以表示我们在听。这些话并不会抢走话轮。
语音 AI Agent 必须学会做到这一切,而且还是在一条看不见用户的电话线路上完成。
语音 AI Agent 的工作原理
现在,让我们看看典型的语音 AI Agent 内部是什么样的,因为话轮转换正处于其中的核心位置。
许多语音 AI Agent 采用由三个主要部分组成的流水线:
User speaks
↓
+-------------------------+
| Speech-to-Text (STT) |
| sound -> text |
+-------------------------+
↓
+-------------------------+
| LLM |
| text -> reply text |
+-------------------------+
↓
+-------------------------+
| Text-to-Speech (TTS) |
| reply text -> sound |
+-------------------------+
↓
Agent speaks- 语音转文本(STT):将用户的声音转换为文本。它也被称为 ASR(自动语音识别)。
- LLM(大语言模型):读取文本并生成回复。
- 文本转语音(TTS):将回复文本转换回声音。
在这里可以看到,必须有某个环节来决定何时把用户的话发送给 LLM。如果发送得太早,LLM 会回答半个问题;如果发送得太晚,用户就会在沉默中等待。
这个决定就是话轮转换。
要学习 AI Agent、LLM 基础知识以及如何设计实时语音 AI Agent,请查看 Outcome School 的 AI 与机器学习课程。
为什么话轮转换对机器来说很难
机器听对话的方式与我们不同。它接收到的只是一段连续的声音流,被切成许多微小的片段,例如每 20 毫秒一个片段。
问题在于,同样的声音可能意味着不同的事情。
假设用户安静了整整一秒钟。这可能意味着:
- 用户已经说完,正在等待回答。
- 用户正在思考接下来要说什么。
- 用户正在从一张纸上读自己的卡号。
这三种情况下的沉默听起来完全一样。只有上下文才能将它们区分开。
此时,Agent 可能犯两类错误:
- 过早插话:用户说“我的电话号码是 98765……”然后停下来核对后面的数字。Agent 在用户还没说完时就抢着说“好的,谢谢”。
- 等待太久:用户问了一个简单的问题,Agent 却等了两秒才回复。用户以为电话掉线了,于是说“喂?”
良好的话轮转换要尽可能把这两类错误都降到最低。
正在规划进入 AI 领域?
无论你今天在哪个技术领域工作,只要付出努力,你都可以转型到以下这些角色:
- AI 工程师
- 前沿部署工程师
- AI Agent 工程师
- Harness 工程师
- 语音 AI 工程师
- AI 架构师
- LLM 工程师
- LLM 推理工程师
- 生成式 AI 工程师
- MLOps 工程师
- 机器学习工程师
- 深度学习工程师
Outcome School 的 AI 与机器学习课程可以带你实现这一目标。
话轮转换的两项任务
现在,我们可以把轮次转换拆分为两项任务:
- 轮次结束检测:判断用户何时说完,以便 Agent 开始说话。
- 打断处理:判断用户何时在 Agent 说话时开始讲话,以便 Agent 停止。
轮次结束检测也被称为端点检测,因为它要找到用户语音的结束点。
我们先从轮次结束检测开始。
方法一:等待静音
最简单的想法是:如果用户停止发声一段时间,那么他的轮次就结束了。
要做到这一点,Agent 需要有办法判断用户是否在说话。这就轮到语音活动检测(VAD)登场了。
语音活动检测(VAD)是一个小巧、快速的组件,通常是一个小模型,它检查每一小段音频,并判断其中是否包含人声。
它不理解词语,只是对每一段声音回答“有语音”或“无语音”,如下所示:
Audio piece: 1 2 3 4 5 6 7 Sound: hello how are you (quiet) (quiet) (quiet) VAD says: speech speech speech speech silent silent silent
现在,我们在 VAD 之上加一条规则:
如果 VAD 报告静音的时间超过一个固定时长,例如 700 毫秒,那么轮次就结束了。
这个固定时长被称为静音阈值或静音超时。
我们来看看它的实际效果:
+-------------------------------------------+
| User says "What is the weather today?" |
+-------------------------------------------+
↓
+-------------------------------------------+
| VAD: speech, speech, speech, then silence |
+-------------------------------------------+
↓
+-------------------------------------------+
| Silence lasts 700 milliseconds |
+-------------------------------------------+
↓
+-------------------------------------------+
| End of turn detected |
+-------------------------------------------+
↓
+-------------------------------------------+
| Text is sent to the LLM |
+-------------------------------------------+这种方法简单、快速、成本低。
问题在于,Agent 现在必须为超时选定一个数值,而没有任何一个数值适用于所有人。
- 如果超时时间较短,例如 300 毫秒,Agent 回应很快,但每当用户停下来思考时,它就会插话。
- 如果超时时间较长,例如 1500 毫秒,Agent 很少插话,但每次回应都显得很慢。
我们有一篇关于如何为语音 AI Agent 构建延迟预算的详细博客,解释了这段等待时间如何与回应的其他各个环节相配合。
仅有静音无法判断句子是否完整。“我的号码是 98765”后面跟一个停顿,和“谢谢”后面跟一个停顿看起来是一样的。
这种方法的问题在于它只听声音,而不理解含义。接下来我们看看下一种方法如何解决这个问题。
方法二:理解语义
我们人类不会等待固定的静音时长,而是听对方在说什么。因此,更好的做法是赋予 Agent 同样的能力。
这被称为语义轮次检测。语义的意思是“与含义相关”。
语义轮次检测使用一个模型来读取文字(有时还会听语气),并预测用户是否已经说完本轮话的概率。
该模型会给出一个 0 到 1 之间的数字。接近 1 的数字表示用户很可能已经说完。举个例子,用户在以下每句话之后停止了说话:
| 用户说的话 | 轮次结束的概率 | Agent 的行为 |
|---|---|---|
| “你们几点开门?” | 高,例如 0.95 | 快速回复 |
| “我想订一张……的桌子” | 低,例如 0.05 | 等待更久 |
| “我的卡号是 4512 8890” | 低,例如 0.20 | 等待更久 |
| “好的,就这些了,谢谢。” | 高,例如 0.97 | 快速回复 |
由此可见,文字本身能告诉我们很多信息。以“的”结尾的句子显然还没说完,而像“你们几点开门?”这样完整的问题则已经说完了。
在实际应用中,这两种方法会结合使用。VAD 仍然负责检测用户何时静音,然后由轮次检测模型决定等待多长时间,如下所示:
+---------------------------------------------------------------+
| VAD detects silence |
+---------------------------------------------------------------+
↓
+---------------------------------------------------------------+
| Turn detection model reads the words so far |
+---------------------------------------------------------------+
↓ ↓
+-------------------------------+ +-----------------------------+
| Sentence looks complete | | Sentence looks incomplete |
| wait a short time | | wait a longer time |
+-------------------------------+ +-----------------------------+
↓ ↓
+---------------------------------------------------------------+
| End of turn detected |
+---------------------------------------------------------------+因此,静音超时不再是一个固定的数值。当用户似乎已经说完时,它会变短;当用户似乎还在思考中途时,它会变长。
我们有一篇详细介绍投机式 LLM 生成如何在用户说完之前就开始回复的博客,解释了 Agent 如何在这段等待时间内准备好回复内容。
有些轮次检测模型只读取 STT 输出的文本。有些模型则直接监听音频,因此还能利用语音的语调,比如陈述句结尾的降调。
给你的一个温馨提示
无论你在哪个技术领域工作,都要熟悉以下这些主题:
- LLM
- RAG
- MCP
- Agent
- 微调
- 量化
我们把它们全部整合在一个视频里:
AI 工程详解:LLM、RAG、MCP、Agent、微调与量化
不必中断阅读——先收藏起来,等有空的时候再看。未来的你会感谢现在的你。
现在,让我们回到正题。
处理打断
接下来,我们来看轮次转换的第二项任务:处理打断。
假设 Agent 正在朗读一长串可用航班列表。中途,用户说:“等等,我只想要早上的航班。”Agent 必须停止说话并开始倾听。
当用户在 Agent 说话时开口,这被称为 插话。也就是用户“插进”了 Agent 的发言轮次。
为了处理插话,Agent 即使在自己说话时也保持 VAD 运行。流程如下所示:
+--------------------------------------+
| Agent is speaking |
+--------------------------------------+
↓
+--------------------------------------+
| VAD detects user speech |
+--------------------------------------+
↓
+--------------------------------------+
| Agent stops its audio immediately |
+--------------------------------------+
↓
+--------------------------------------+
| Agent listens to the user's new turn |
+--------------------------------------+
↓
+--------------------------------------+
| LLM replies using the new request |
+--------------------------------------+这里有几个重要的细节。
第一,Agent 必须快速停止。如果用户已经开始说话,而 Agent 还继续说了两秒,用户会感到被忽视。
第二, Agent 不能听到自己的声音。麦克风可能会拾取到从扬声器中传出的 Agent 自己的声音。如果 Agent 把自己的声音当成用户的声音,它就会不断打断自己。为了解决这个问题,语音系统使用回声消除技术,从麦克风输入中去除 Agent 自己的声音。
第三, Agent 必须记住用户实际听到了什么。如果 Agent 计划说五句话,但在说完两句后被打断,那么对话历史中必须只记录这两句。否则,LLM 会以为用户听到了从未说过的内容。
并非每个声音都是新的话轮
现在,下一个重要问题是:用户每次发出声音时,Agent 都应该停下来吗?
答案是否定的。
在 Agent 说话时,用户可能会说“嗯”、“好的”、“对”或“嗯嗯”。这些被称为附和语。它们的意思是“我在听,请继续。”它们并不是要抢夺发言轮次。
还有一些声音根本不是用户的语音:咳嗽声、关门声、背景中的电视声,或者房间里其他人在说话。
如果 Agent 对每一个这样的声音都停下来,它就会不断在句子中间中断。因此,Agent 必须区分:
| Agent 说话时的声音 | 含义 | Agent 的做法 |
|---|---|---|
| “嗯”、“好的”、“对” | 我在听 | 继续说话 |
| 咳嗽、背景噪音 | 根本不是发言轮次 | 继续说话 |
| “等等,停下”、“不,我是说周一” | 我想要发言轮次 | 停下来倾听 |
一种常见的做法是在停止前稍等片刻。例如,只有当用户持续说话达到最短时间(比如半秒),或者用户说的话不只是简单的“好的”时,Agent 才会停止。有些系统还会使用专门训练来识别附和语的模型。
保持更新: 订阅我们的新闻通讯,将我们最新的 AI 和机器学习博客直接发送到您的邮箱。
半双工与全双工 Agent
现在,是时候了解一种不同的设计了。
我们之前看到的流水线式 Agent 以半双工方式工作。也就是说,它把对话视为严格的轮次。要么是用户的轮次,要么是 Agent 的轮次。轮次切换系统决定何时在两者之间切换。对讲机就是这样工作的:一个人说话,然后另一个人说话。即使支持插话,Agent 在说话时倾听也只是为了知道何时停止。
全双工 Agent 的工作方式更像两个人之间的电话通话。它始终同时倾听和说话。
全双工语音模型,例如 Kyutai 的 Moshi,以并行流的方式同时接收用户的音频并生成 Agent 的音频。没有单独的组件来说“现在轮次结束了”。模型本身通过在大量对话音频上训练,学会何时说话、何时保持沉默、何时说“嗯”,以及何时停止。
为了便于您更好地理解,我来将半双工和全双工 Agent 之间的差异整理成表格。
| 对比项 | 半双工(流水线) | 全双工 |
|---|---|---|
| 听与说 | 严格轮流,同一时间只有一方 | 双方同时进行 |
| 轮次判定 | 独立的 VAD 和轮次检测模型 | 在模型内部学习 |
| 附和回应 | 需要额外的逻辑来处理 | 由模型从对话中学习 |
| 控制与调试 | 较容易,每个部分都可以单独检查 | 较困难,一切都包含在一个模型中 |
| 典型用途 | 许多生产环境的语音 Agent | 研究和早期产品 |
由此可见,全双工方式更接近人类的交谈方式。但流水线方式更容易构建、控制和与工具连接以及业务逻辑。因此,许多生产环境中的语音 AI Agent 都采用带有精细轮次控制的流水线方式。
我们有一篇关于设计实时语音 AI Agent的详细博客,端到端地介绍了整个系统。
完整的演练
现在,让我们通过一个完整的示例把所有内容整合起来。假设一位用户致电某餐厅的语音 AI Agent。
第 1 步: 用户说:“我想预订一张……的餐桌”,然后停下来思考。VAD 检测到静音。轮次检测模型发现句子未说完,给出较低分数,因此 Agent 继续等待而不是插话。
第 2 步: 用户继续说:“……明天晚上 8 点,四个人。” VAD 再次检测到静音。这一次,轮次检测模型发现句子已完整,给出较高分数,因此 Agent 只需短暂等待。轮次结束被检测到。
第 3 步: 文本发送到 LLM,由其生成回复。TTS 开始说话:“好的。我们晚上 8 点在主厅和露台都有空位。露台可以看到……”
第 4 步: 在 Agent 说话期间,用户说了“嗯哼”。Agent 识别出这是一个附和回应,于是继续说话。
第 5 步: 然后用户说:“等等,要露台。”这是一次真正的打断。VAD 检测到持续的语音,Agent 立即停止播放音频。对话历史只记录用户实际听到的回复部分。
第 6 步: Agent 处理新的轮次并回复:“好的,我已为您预订了明天晚上 8 点的四人露台餐桌。”
现在我们应该已经理解了什么是语音 AI Agent 中的轮次控制、Agent 如何决定何时说话和何时停止,以及全双工模型在处理方式上有何不同。
常见问题
什么是语音 AI Agent 中的端点检测(endpointing)?
端点检测是轮次结束检测的另一种叫法。它用于找到用户语音的结束点,让 Agent 知道用户已经说完,可以开始说话了。简单的版本会等待固定的静音时长,更好的版本还会分析话语内容,判断句子是否完整。
语音 AI Agent 的合适静音超时时间是多少?
没有一个适用于所有人的固定数值。较短的超时时间(如 300 毫秒)能让 Agent 快速回复,但会在用户停下来思考时打断对方。较长的超时时间(如 1500 毫秒)可以避免打断,但会让每次回复都显得迟缓。语义轮次检测通过在句子看起来完整时使用短超时、不完整时使用长超时来解决这个问题。
语音 AI Agent 为什么需要回声消除?
麦克风可能会拾取到从扬声器传出的 Agent 自己的声音。如果 Agent 把自己的声音当成用户,它就会不断打断自己。回声消除会将 Agent 自己的声音从麦克风输入中移除,这样只有用户的语音才会触发打断。
当用户打断 Agent 时,Agent 的回复会怎样?
Agent 会立即停止音频输出,对话历史中只记录用户实际听到的那部分回复。如果 Agent 原本要说五句话,但在说完两句后被打断,则只保留那两句。否则,LLM 会以为用户听到了从未说出的信息。
人类在对话中轮替发言的速度有多快?
非常快。一项针对十种语言对话的研究发现,一个人说完与另一个人开始之间最常见的间隔在 0 到 200 毫秒之间。这个时间太短,不足以听完整个句子再想出回复,所以我们在对方还在说话时就开始准备自己的回复。
目前就到这里。
谢谢
Amit Shekhar Outcome School 创始人
你可以通过以下方式与我联系:
关注 Outcome School: