一个会说话的 Agent,最尴尬的时刻,是它真正开始干活之后。
你让它查一份资料,它很自然地回一句「好,我去看看」。然后工具开始调用,搜索开始转圈,后台开始跑任务,刚才还像个活人的声音突然没了。屏幕上只剩一个转圈。。。你不知道它卡住了,还是忘了你。想追问进度,又怕把正在做的事打断。
这种体验特别像打电话给一个助理。前半分钟他有问有答,真正接到任务以后,却啪一下把电话挂了。等十分钟再打过去,对方可能还得重新问一句,你刚才让我做什么来着?
我最近翻到一个开源项目,Qwen Audio Agent。它的 README 第一行写的是「Agent,始终在场」。说真的,这句话比一串模型参数更戳我,因为它盯上的不是 Agent 会不会说话,而是 Agent 忙起来以后,还能不能继续和人交流。
它不是又造了一个 Agent
先把最容易误会的地方讲清楚,Qwen Audio Agent 不是一个试图包办所有事情的新模型,也不是把 OpenClaw、Codex、OpenCode 全部重写一遍。
它更像一个语音前台和运行时。
你面对的是同一个语音助理,但系统内部把工作拆成了两条路。能直接回答的问题,交给 Qwen Audio Realtime 当场说。需要搜索、读文件、调用工具、改代码或者持续几分钟的任务,则交给后面的 Agent 去做。
前台继续听你说话,后台继续干活。
这两件事终于不再互相绑架了。
很多语音产品的问题,不是识别不准,也不是合成声音不够自然,而是整个交互仍然沿用一问一答的回合制。你说一句,它做完一切,再回一句。任务只要稍微重一点,对话就会塌成等待页面。
Qwen Audio Agent 做的事,坦率的讲,很像给这套回合制挖了一条旁路。项目里的spawn_thinking会把需要持续处理的请求交给后台,但它自己不等任务结束。前台先告诉你工作已经接住,然后继续留在对话里。
注意,这里最值钱的不是「异步」两个字。程序员早就会开后台任务了。真正难的是异步以后,用户还得面对同一个人,任务状态不能丢,结果回来不能串台,中途追问和取消也不能把上下文搞乱。
这才是它真正想解决的东西。
一张嘴,背后却是两套节奏
项目文档把整个系统分成了三个层次。
第一层是实时语音前台,负责持续收音、理解当前对话、直接回答简单问题,也负责把复杂任务派出去。第二层是 Gateway 和协调 Agent,管理任务的排队、状态、权限、取消与结果回收。第三层是可选的独立 Agent Session,真正进入项目目录,调用工具,操作文件,或者跑一个持续时间更长的任务。
这套结构看着有点工程味,我还是用大白话讲。
你可以把实时前台想成坐在你面前的项目经理。简单问题他自己答。事情一旦需要查资料、跑程序或者进项目里改文件,他就把任务交给后面的执行者。但项目经理没有离席,你还能继续问他进度,补充要求,或者说先停一下。
后面的执行者做完以后,也不是突然从另一个窗口扔回来一坨结果。结果会先回到原来的协调上下文,再由同一个语音助理自然地告诉你「已经好了」。
你想想看,这里有一个特别容易被忽略的细节。人对助理的信任,很大一部分不是来自对方从不犯错,而是来自你知道事情现在在谁手里,做到哪一步了,有变化时该找谁。
传统聊天框很容易把这层关系压扁。消息发出去,界面上只剩一个转圈。Qwen Audio Agent 则给任务留了一张「回执」,内部会记录 queued、running、delegated、finalizing、completed、cancelled 这些状态。前端不需要把内部 Session、权限载荷和执行细节全摊给用户,但至少能告诉你,它是在处理中,还是已经完成。
这不是更会聊天。
这是更会交代。
你可以继续说,任务也可以继续跑
如果只是把工作扔到后台,这个项目还没有那么有意思。它更骚的一点,是用户可以在任务进行时继续发起新的对话。
比如一个任务正在让 Codex 改代码,你可以问当前进度,也可以取消。另一个需要立即回答的问题,不必傻等前一个任务做完。项目会为同一个用户维护任务队列,同一个后台协调 Session 内的写入保持串行,避免几条请求互相踩上下文。
项目文档对这条边界写得很克制。前台负责交流、查询状态和传递明确的权限决定,但不替后台选择工具,也不擅自决定执行策略。后台 Agent 仍然拥有自己的工具、Skill、MCP 和权限体系。
我很喜欢这个判断。
因为语音不是万能遥控器。它最适合做的是表达意图、补充上下文、确认风险和接收结果。至于到底用终端还是浏览器,开几个步骤,是否需要另一个 Session,那应该是执行 Agent 的工作。
很多产品为了让语音显得厉害,会恨不得把所有按钮都塞进一句口令里。结果用户说得累,系统也猜得累。这个项目反而承认了语音的边界,然后把它放在最适合的位置上,作为人与 Agent 之间持续存在的那条线。
这条线还能跨过一次重连
顺着上面的再聊聊记忆。
Qwen Audio Agent 会为每个用户和后台维护一个固定的协调 Session。换一次语音连接,不会顺手把后台上下文也清空。已经完成但还没来得及播报的结果,也会尽量回到发起它的那次对话里。只有原会话不在了,系统才会在同一用户的新连接里恢复未播报结果。
这里没有什么玄学记忆。用户档案、长期记忆和任务状态都落在本机配置目录里。USER.md保存稳定偏好,frontend-memory.json保存用户明确要求长期记住的内容,tasks.json保存任务结果和待通知状态。
项目也特意提醒,不要把密码、API Key、验证码或者访问令牌塞进这些文件。麦克风音频与实时对话会发送给配置的 Qwen Audio Realtime 服务,后台任务还可能访问你选定的模型、工具和外部服务。
这块需要注意一下。「本地保存记忆」不等于「所有数据都只在本地」。如果你要把它放进公司项目、客户资料或长期常驻的工作环境,数据会流向哪里,后台 Agent 能拿到什么权限,必须自己先捋清楚。
从终端到桌面悬浮球
这个项目提供 WebUI、终端 TUI 和 macOS 桌面悬浮球。README 里的两种悬浮球动效,一种像流光声波,一种像液态渐变。它们并不负责炫技,主要是在桌面上给语音状态一个持续可见的入口。
平台差异也得说清楚。macOS 的 TUI 使用带回声消除的全双工模式,可以直接说话打断。Linux 和 Windows 默认是半双工,播报时按x手动打断。虽然也能开启无回声消除的全双工,但项目建议戴耳机,否则扬声器回声可能被重新识别成用户输入。
安装门槛不算零。它需要符合版本要求的 Node.js、npm、DashScope API Key,还要明确选择一个后台 Agent。用 npm 全局安装以后,先运行qwenaudio config写配置,再启动 Gateway,随后打开 TUI 或 WebUI。
如果只是想偶尔问一句天气,或者让模型回答一个知识问题,这套架构有点重。你用手机里的现成语音助手,可能更省事。
但如果你真的想让 Agent 常驻桌面,持续接收任务,进入项目工作区,跑几分钟甚至更久,再把结果带回当前对话,那它就值得认真看。尤其是那些已经在用 OpenClaw、OpenCode、Qoder 或 Codex 的人,它不是让你抛弃原来的 Agent,而是给原来的执行能力补上一层持续语音入口。
真正稀缺的不是声音,是在场
我有时候觉得,语音 Agent 的第一阶段,大家都在追求「像人」。停顿要自然,音色要有情绪,打断要足够快。于是我们得到了越来越像真人的声音。
可一个助理真正让人安心的地方,从来不只是声音像不像。
你把事情交给他以后,他没有消失。你临时想起一个条件,可以补一句。你觉得方向不对,可以叫停。任务做完,他还记得这是从哪段对话里长出来的,然后回到你面前把结果讲清楚。
这种「在场感」听着很软,背后却全是很硬的工程问题。并发、队列、状态、权限、取消、重连、结果去重、播放时机,每一块没处理好,那个像人的幻觉都会啪一下碎掉。
Qwen Audio Agent 现在当然还不是一个装上就能托管全部生活的万能助理。它依赖云端实时语音服务,依赖你选择的后台 Agent,跨平台全双工体验也不完全一致。当前版本还是 0.9.1,README 自己也对不同后端的验证程度做了区分。
但我是真的觉得,它提出的这个方向很对。
过去我们让 Agent 学会说话。下一步,可能不是让它说得更像人,而是让它在真正开始干活以后,仍然留在这场交流里。
所以回到开头那个尴尬的瞬间。
一个会说话的 Agent,不应该一干活就闭嘴。
它应该接住任务,然后继续在场。