语音 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: