A frontend-backend architecture for tool calls in full-duplex speech models
Ke Hu, Slyne Deng, Chen Chen, Elena Rastorgueva, Edresson Casanova, Punit Kumar, Dharmendra Choudhary, Nikhil Srihari, Ameya Sunil Mahabaleshwarkar, Viet Anh Trinh, Slim Essid, Oluwatobi Olabiyi, Zhehuai Chen
cs.CL
2026-09-17
NVIDIA 把全双工语音的工具调用外包给文本 LLM。前端发委托 token 并转发流式 ASR,后端用 LangGraph 执行后 prefills 回前端。单轮召回 92%–97%,无关调用拒绝率 81.2%。
全双工语音到语音模型已经能边听边说、处理打断、把回合切换做得像人。工具调用是另一回事。τ-Voice 显示,主流商用双工语音模型在干净条件下只能完成 31%–51% 的落地客服任务;同一套任务交给 GPT-5 文本 agent,完成率是 85%。噪声和口音一上来,差距还会再拉开。
把工具调用直接塞进 Moshi 这类音频原生双工模型,会撞上容量账:音频 token 占参数和上下文,文本 LLM 本来可以拿去记事实、跟指令、排工具。KAME、MoshiRAG、Thinking Machines 的 interaction-background、Qwen-audio-agent、GPT-Live 都在走「语音前端加文本后端」,但委托信号怎么发、后端结果怎么灌回前端,公开细节很少。
NVIDIA 这篇把委托收成前端文本通道里的控制 token,前端几乎不用改结构。
前端是双工语音到文本模型,合成另接流式 TTS。用户语音经 6 亿参数的 Parakeet 流式编码器,送进 NVIDIA Nemotron-Nano-9B-v2-Base。同一套 LLM 骨干一次解码出两路:流式 ASR 转写,和 agent 文本。VoiceChat-TTS 吃回合开始和打断控制 token,增量出 codec 语音。
用户问需要查工具的话,比如纽约天气,前端在 agent 通道发 <tcbos>,通常在用户说完后约 320 毫秒。接着吐约 1 秒垫话,再发 <tceos>。触发后,带 <usereos> 的 ASR 转写交给后端。
后端是 LangGraph 上的 ReAct agent:指令跟随 LLM 节点加工具节点,条件边决定要不要继续调。多轮靠 thread-keyed checkpointer 存状态,每轮只吃当前 ASR。自然语言结果用 <pfbos> / <pfeos> 写入前端上下文;前端被训练成原样复述,再交给 TTS。工具执行期间前端插 pad、保持静音。后端如果吐出非法工具请求或普通文本,也直接当 prefill 送回去,误触发时大模型还能用自然语言挡住无关查询。
训练是预训练加 SFT。工具调用对话由 Nemotron 3 Nano、Gemma-4-31B-IT、Qwen3.5-397B-A17B 等生成,LLM judge 滤掉不一致和错误调用,再 TTS 合成、用 Parakeet 按 WER/CER 过滤。航空、零售等领域另用两台 Qwen3.5-235B-A22B 对打出轨迹,失败样本丢掉。数据量大约:预训练 53 万小时,SFT 11.1 万小时,ASR 转录 1.6 万小时,带工具调用的多轮对话 8500 小时。系统提示随机用完整工具定义,或只给函数名加描述。
prefill 区不算 loss。训练还在 <tceos> 后再垫约 1 秒,模拟工具耗时。
单轮评测用 ServiceNow-AI 的 BFCL 语音版,AST 比对工具调用结构。Qwen3-30B-A3B 加外部 ASR 平均 74.6%,无关调用拒绝率 81.2%;GPT-realtime 是 80.8% 和 90.8%。差距主要在 Parallel-Multiple(61.1% 对 74.0%)和 Irrelevance。7B 后端平均 71.7%,已经高于 Ultravox-v0.6 Llama-3.1-8B 的 43.3%,后者在 240 条无关提示上全部误调,拒绝分为 0。前端委托 token 召回:Simple 97.2%,Multiple 92.0%,Parallel 95.0%,Parallel Multiple 93.5%。内部 ASR 换成外部 ASR,平均从 73.0% 升到 74.6%,Parallel-Multiple 从 55.1% 到 61.1%。
| 方法 | BFCL 均分 | 无关拒绝 |
| GPT-realtime | 80.8 | 90.8 |
| Ultravox-v0.6-32B | 76.6 | 82.5 |
| Ours-30B-extASR | 74.6 | 81.2 |
| Ours-7B-intASR | 71.7 | 76.7 |
| Ultravox-v0.6-8B | 43.3 | 0.0 |
Full-Duplex-Bench v3 是 12 人、100 个场景的真实录音,带停顿、口误和自我纠正。Qwen3-235B-A22B 后端:工具选择 71.7%,参数准确 55.2%,Pass@1 48.0%,回复质量 67.0%,回合切换 100%。GPT-realtime-mini 的 Pass@1 是 51.0%、回复质量 62.0%;完整 GPT-realtime 是 61.0% 和 74.7%。系统打断率 51%、垫话率 83.3%,远高于 GPT-realtime 的 13.5% 和 12.1%。垫话是设计出来的;打断率高是因为用户一停顿前端就回 backchannel,不过它边说边听,最终工具调用通常还能看到完整请求。
EVA-Bench 覆盖 213 个航空、ITSM、医疗 HR 客服场景。评测直接拿 agent 文本,不算 TTS。235B 后端 EVA-A 46.6、任务完成 57.3%,对上 GPT-realtime-mini 的 33.1 / 37.1,接近 Gemini 3.1 Flash Lite 的 45.6 / 57.1,仍低于 GPT-realtime2 的 59.4 / 68.1。同尺寸:30B 后端 EVA-A 32.4、任务完成 40.4%,Qwen3-Omni-30B-A3B-Instruct 是 29.1 / 32.5。航空域完成率 72%,高于 GPT-realtime2 的 54%;ITSM 56.3% 对 75%,医疗 HR 49.4% 对 69.9%。后两个域要连续做成 6 到 8 次工具调用,前端漏一次委托,整条链就断。
加了工具调用训练后,普通双工几乎保住。内部基准回合精度/召回 82/91,基线 85/94;延迟 438 ms 对 423 ms;打断准确率 99% 对 100%。OpenbookQA 64.7 对 65.0。流式 ASR 平均 WER 从 10.80% 升到 11.47%。Full-Duplex-Bench v1 上更急着接话:顺畅回合 TOR 从 93% 到 100%,延迟从 221 ms 到 92 ms;停顿处理变差,Pause TOR 从 53.2% 到 68.2%。
这是一套可换后端的模块化方案。语音前端继续管听、说、打断;工具调用和多跳推理交给已经会用工具的文本 LLM。换 7B、30B、235B,前端不用重训架构。对要上语音 agent 的团队,这条路比把工具协议塞进音频 token 更省事。
它给不出端到端语音 agent 的上限。BFCL 均分和无关拒绝都低于 GPT-realtime,FDB3 的 Pass@1 也没过 GPT-realtime-mini。清楚的是工程接口:一个委托 token,一段 prefill-and-repeat,后端可插拔。
长链工具调用是硬伤。ITSM 和医疗 HR 要连续 6 到 8 次成功调用,完成率明显掉在 GPT-realtime2 后面。前端漏检一次,后端再强也接不上。
评测口径偏文本。EVA 和 FDB3 的回复质量用的是 agent 文本,不是合成语音再转写,TTS 失真被绕开了。后端延迟因本地 vLLM 和云 API 混用,论文直接不报端到端时延。FDB3 垫话率和打断率高到不能当成「更自然」,只是设计选择。
训练数据大量是合成语音。作者把 ASR WER 上升和停顿处理变差归因于此,SFT 里几乎没有自然停顿。前端误触发时靠后端兜底,论文没单独报误触发率,只给了正例召回。