我们用对话式 AI,给不识字的外婆造了一部「手机」丨社区来稿
2026 年 7 月 22-26 日,全国最大黑客松 AdventureX 在杭州湖畔举办,822 人参加、23 个赛道、240 个项目,我和队友两个人做了一台没有屏幕的电话——外婆对它说「给孙女打电话」,孙女的手机就真的响了。在最火爆的 Qoder 赛道里,拿到了二等奖。
技术上,它是一条 Agora Conversational AI 的实时语音链路,加一套自研的确定性意图状态机,再加一个用 AT 指令真实拨号的树莓派。产品上,它只想解决一件很小的事:让不识字的老人重新有能力主动联系家人。
一、我们没有选题,选题住在我们家里
比赛开始前,别的队伍在头脑风暴,我们没有。因为那个问题每天都在发生:外婆快八十了,到现在没用过智能手机。不是没教过——教过很多遍。微信语音她找不到那个绿色图标,老人机她记不住哪个键是谁,放大字体也没用,她不识字。
她不是没有想说的话。她想告诉女儿「晚上回来吃饭」,想问老朋友「明天还去散步吗」。只是每一次「想联系」,都被识字、通讯录、翻菜单拦在门外。于是她慢慢变成了一个「只等电话响」的人。
我们决定这五天只做一件事:造一台不用学的电话。没有屏幕,没有按键,没有菜单。她只要说:「给孙女打电话。」电话就真的响。我们给它取名「老天才」——外婆的第一部手机。语音助手叫「小听」,因为它唯一的工作就是听她说话。
先说清它不是什么,因为这几乎是所有人的第一个反应。它不是智能音箱:音箱是开放对话,以内容和家居控制为中心,而它只有「联系家人」一个使命,交互路径固定且极短;它不是老人机:老人机仍然要求记号码、按按键、看屏幕;它也不是手机的「老人模式」:老人模式简化的是界面,前提仍然是「会用手机」,而我们把屏幕这个前提直接删掉了。

二、给老人做语音交互,和给年轻人做完全是两回事
产品的核心是一条语音链路,而这条链路的用户是最「挑剔」的一群人——不是要求高,是容错低。老人语速慢、停顿长,一句话说到一半想词是常态,链路如果把长停顿当成「说完了」就抢答,她会立刻慌;她有口音,「小听小听」可能说成发音相近的别的音,唤醒不能死板匹配;而一旦第一次失败,她很可能永远不再碰这台设备——我们没有「教育用户」的机会。
所以我们需要考虑的是:需要有更稳定的传输、更聪明的打断,和更精准的识别。
整体是这样一条双路径链路:有 Wi-Fi 时走云端智能路径,让她自由说话;没网时走 SIM 保底路径,用固定指令也能把电话打出去。
外婆开口:「给孙女打电话」↓ 有 Wi-Fi 吗?有 → 云端智能路径:Agora Conversational AI(ASR → LLM → TTS 实时管线,zh-CN 判停)没有 → SIM 保底路径:Vosk 限定词表本地识别固定指令↓本地确定性意图状态机:唤醒门控 · 称呼与内容提取 · 去重与并发锁LLM 只负责说话,无权触发任何操作↓├─ Photon 桥 → iMessage → 家人 iPhone 收到消息└─ 硬件桥(树莓派)→ SIM7600CE AT 指令拨号 → 家人手机真实响铃我们选了 Agora Conversational AI 来做云端这条语音链路,原因很实际:它把 ASR、LLM、TTS 封装成一条实时管线,我们不用自己拼三家服务、调音频管线——五天要出真东西的场景,省下的每一小时都算数。
项目基于 Agora 官方的 Conversational AI Next.js Quickstart 改造,当前链路是 Deepgram nova-3(zh-CN)→ gpt-4o-mini → MiniMax speech_2_6_turbo,音频场景用 chorus profile,判停交给 turnDetection(zh-CN):speech_threshold 0.5、prefix_padding_ms 300、interrupt_duration_ms 160、silence_duration_ms 480,会话 idleTimeout 30 秒。
关于延迟,在比赛场馆这种人员众多的网络环境下,我们实测两轮对话,端到端延迟分别是 1708 ms 和 1672 ms——从说完话到听见小听开口,大约 1.7 秒,具体拆开:ASR 确认最后一个词用了 480 ms,LLM 吐出第一个 token 用了约 700 ms(整条链路里最大的一块),TTS 合成第一段音频不到 300 ms。
省下来的集成时间,我们全花在了老人交互的规则层上。这层的核心决定只有一句:让 LLM 只负责说话,不负责决定。在这里,我们也做了一些小巧思和设计。
唤醒词做同音容错
转写常把「小听小听」写成「小厅小厅」「扫听扫听」「小青小青」「晓婷晓婷」。我们没有硬匹配那四个字,而是把每个音节放宽成一个同音字集合(xiǎo 一类、tīng 与 qīng 一类),但要求它保持「XT…XT」这种叠词结构——这个形状在日常说话里几乎不会出现,所以放宽了也不会误唤醒。唤醒后只回一声「我在」,用最短的声音告诉她可以说了。
意图和内容用确定性规则提取,不交给模型
一句「给孙女发消息说我出门了」里,称呼(孙女)和内容(我出门了)由本地的匹配规则与状态机分别取出;「跟儿子说晚饭别等我」这类没有触发词的转述句式,只有当说出的称呼精确命中已知联系人时才成立,所以「让我想想」这种日常闲聊永远不会触发发送。同一轮次做去重,并发上锁,避免一句话被执行两次。
谁有权执行
真实的发送和拨号只由这套本地逻辑裁决,LLM 无权触发任何一次操作。系统提示里还立了一条硬规矩——在系统真实调用接口并拿到回执之前,小听不许说「已经发了」「发送成功」这类话,哪怕外婆追问「发了吗」,它也只能说「正在处理,稍等一下」。老人产品里,模型幻觉出来的一句「已经发给孙女了」就是事故。
外婆:「小听小听」↓ 转写文本唤醒门控:同音叠词匹配 → 开门(armed)小听:「我在」外婆:「给孙女发消息说我出门了」↓ 转写文本意图提取:称呼=孙女 | 内容=我出门了轮次去重 + 并发锁 → 由程序裁决:执行↓ 只传称呼,不传号码桥 → iMessage 送达孙女的 iPhone↑ 真实接口回执小听:「已经发给孙女了」(这句由系统裁决,不由 LLM 生成)消息出口接的是 Photon Spectrum:外婆的话变成一条真实的 iMessage 出现在孙女的 iPhone 上,家人那端什么都不用装。硬件我们选择的是 Raspberry Pi Zero 2 W 加 SIM7600CE(支持国内频段的 4G 通信模组),用 AT 指令实机拨号。Wi-Fi 断了就走保底路径:板子本地用 Vosk 限定词表离线识别「打给孙女」,SIM 卡把电话打出去。云端语音负责体验上限,SIM 路径负责通信底线。
三、踩过的一些坑
坑一:裸奔的拨号接口。硬件桥最早就是局域网里一个不设防的 HTTP 服务,网页端发个 POST,树莓派就拨号。联调很爽,直到某天晚上突然意识到:会场几百人连着同一个 Wi-Fi,任何一个知道 IP 的人都能让外婆的电话拨出去。连夜给拨号接口加上 Bearer Token 认证,并且定下一条规矩:联系人的真实号码只存在桥接进程自己的配置里——消息桥侧一份、树莓派本地映射表一份,云端只下发「呼叫某个称呼」的结构化指令。号码不进前端、不进仓库代码、不进大模型上下文。就算云端全被攻破,攻击者也只知道外婆有个「孙女」,拿不到号码。
设备 / 浏览器端:音频采集 · 转写 · 意图裁决(只知道「孙女」这个称呼)↓ 同源请求,不包含任何号码云端 Next.js:token 签发 · Agent 编排 · 桥接代理App Certificate 仅服务端 · PUBLIC_DEMO_MODE 服务端闸门↓ Authorization: Bearer token├─ Photon 桥(本机):收件号码只在本进程配置里└─ 硬件桥(树莓派):号码只在本地映射表里真实号码只住在这两个桥里:不进前端、不进仓库代码、不进 LLM 上下文坑二:区域选错,延迟有一部分是自己造的。演示链路的 Agora 客户端区域一直是 Area.US——服务的是国内的老人,音频却先绕一趟美国。会场网络背了不少锅,但这一段是我们自己欠的:改成 Area.AP 是发布后要做的第一件事。
四、诚实地说:它还很不完善
五天做出来的是一个跑通了核心链路的原型,离能放心交到外婆手里还有距离。
方言是最大的欠账。时间太紧,还没来得及在语音链路上更换或微调更适配老人方言、口音的模型,而我们的目标用户恰恰是最需要方言的人群。这是下一步的第一优先级。
判停参数还没为老人调过。现在的 silence_duration_ms 是 480 毫秒,对语速慢、说到一半想词的老人偏激进,容易被当成「说完了」。这正是第二节里我们自己提出的问题,目前只解决了一半,下一步要连同方言一起调。
线上体验版的人设还没换干净。demo 站的小听仍带着官方 quickstart 的「Agora 平台助手」人格,你跟它聊 Conversational AI 它也会答。产品里的小听只该做一件事:听外婆说话。
真实老人测试还没做够。「第一次就能成功」目前只是设计原则,还不是被验证过的结论。来信方向还在规划中:家人发来消息时设备亮灯提醒,老人拿起听筒就能听到;机座还可以贴上家人的照片,让她对着照片说话。iMessage 适合演示,中国市场落地还需要更接地气的消息通道和运营商方案。
五、写在最后
第一次参加黑客松,两个人的队伍,运气不错,拿到了 Qoder 赛道二等奖。
但真正让我们踏实的是演示跑通的那一刻:对着麦克风说「小听小听」,它答「我在」;说「给孙女发消息说我出门了」,iPhone 叮的一声,iMessage 到了;说「给孙女打电话」——手机震起来,屏幕上是真实的来电。
不是动画,是一个真的可能性:外婆想我们的时候,可以不用再等电话响。
如果说有什么体会:语音 AI 最好的位置也许不是台前,而是隐身在链路里,把一句含糊的家常话翻译成一次准确的抵达,然后把舞台还给真正想说话的两个人。
路还长,先把方言做好。她不需要学会手机。她只需要说出,想联系谁。

阅读更多 Voice Agent 学习笔记:了解最懂 AI 语音的头脑都在思考什么
作者提示: 个人观点,仅供参考