让编程智能体用本地语音考查代码理解
Socra 为编程智能体增加本地语音交互,使用 Piper 合成语音、faster-whisper 识别回答,并在网页展示代码、图示和问题。已在 Claude Code 与 Pi 上运行,通过 MCP 提供工具,其他客户端尚未测试。
AI 深度解读
让 AI 帮忙写出代码,和能当场解释代码,是两回事。Socra 的作者把项目笔记、阶段考试接进 AI 编程流程后,又做了一层本地语音界面:让 agent 开口提问,自己口头作答,网页同步展示代码和图示。
这篇值得看的地方,是语音交互暴露出的工程问题:沉默像死机、音频吞字、切换会话后重复等待,以及画面如何准确恢复。作者的经验表明,问题常常出在交互与状态管理,未必需要换模型。
口头考试要检验的是你能不能解释自己的项目
作者原先为每个项目在 Obsidian 中记笔记,到达里程碑时由 agent 发起考试。加入语音,是因为文字答案可以反复修改,口头解释更容易暴露理解上的缺口。这是作者设计工具的出发点,原文没有提供学习效果的对照实验。
Socra 负责语音和展示:Piper TTS 把文字转成语音,faster-whisper STT 把回答转成文字。小网页只展示当前需要的代码片段、图示和问题,也能随时切回打字。
它从 10 月 20 日的口试原型起步,当时 Claude Code 调用 say、ask、get_answer 三个 MCP 工具,现在扩展到七个,包括用于展示完整场景的 present。原文没有列出其余工具名。
目前有两种模式:Mentor 解释用户自己的项目并检查理解,不评分;Exam 则提供口头问题、口头作答和口头反馈。
作者实际用过的是 Claude Code 和 Pi,两者共用 Socra 工具。Codex、OpenCode 等支持 MCP 的 agent 是适配目标,尚未测试。
本地运行也有明确边界。服务只绑定 127.0.0.1,语音处理没有网络往返;Piper 和 faster-whisper 是免费的开放模型,不需要语音 API key,也没有按分钟账单。但 agent 自身发送的数据仍可能离开机器,使用的模型费用照常存在。
语音体验首先卡在等待和播放上
屏幕上有加载动画,用户还能判断程序正在工作;语音里沉默五秒,就容易被当成卡死。早期 Socra 等整段回复生成完才播报,现在改成逐句播放:第一句话写完便开始说,后面的内容继续生成。
语音界面需要让用户听见进展。
作者还计划让 agent 在耗时步骤前后说几句简短提示,但这部分仍未完成,不能算现有能力。
另一个问题更隐蔽:暂停一会儿再播放,开头几个词会消失。音频文件没有损坏,是浏览器的音频输出空闲后进入休眠,唤醒时吃掉了片头。作者用不可听信号保持输出活跃,并测量各个声音的起始静音;此前某个声音起声较慢,反而掩盖了问题。
语言支持也走过弯路。作者以西班牙语起步,却不断遇到英文技术术语发音不准的问题。加术语表、继续补规则之后,他决定先把英语做好。
现在 Whisper 语言、agent 回复语言指令、默认声音,以及 Whisper 在静音时容易幻觉出的短语,都由一个设置控制;测试会检查其他文件是否硬编码语言。西班牙语被明确延期。
选声音时,作者用相同句子做盲听,将候选标为 A 到 G,先评分再揭晓。胜出的是 LibriTTS-R speaker 0,合成也比此前默认声音快。原文没有给出耗时数据,这仍是作者个人使用下的选择。
提示词和画面,都要按状态来设计
切换 Mentor 与 Exam 时,Socra 会启动新的 agent 会话,并交接此前发生的事、最近几轮对话,以及搜索转录记录的方法。
有人报告切换后卡住。作者没复现原始卡死,却发现新会话会要求用户再次按 Switch。原因藏在交接提示词里:它没说明用户已经确认切换,结尾还写着「Do not start any work yet」。
模型照着做了。
修复办法是明确写出切换已经确认,并规定各模式如何开场,例如 Exam 直接问第一题。同时记录切换各步骤的日志,方便原始问题再次出现时定位。这里要分清:重复等待的问题有了修复,最初报告的卡死并未被复现和证实解决。
画面展示采用了相似思路。agent 不逐条遥控网页,而是提交带版本的 JSON 场景,包含朗读步骤、展示对象,以及绑定步骤起点的视觉动作。服务端先用 schema 校验,再计算每一步结束后的完整视觉状态,网页只渲染状态。
这样,后退、重复和网页重连都能恢复到确定的画面,不必重新执行此前的动作。场景无效时,错误会指向 cues[0].do[1].params.lines 这样的具体路径,让模型据此修改。
我的判断
我认可作者把提示词视为流程状态的一部分。只要一句「先别开始」就能阻止会话推进,交接文本就应该像接口约定一样接受检查,不能只当作写作材料。
场景方案也有实际价值。相比让模型连续发出页面操作,完整状态更容易恢复和排查;代价是要维护场景协议、校验和状态计算。对于只朗读问题的简单工具,这套结构未必划算。
至于「口头回答能促进理解」,原文提供的是作者的使用动机和经验,没有证明它优于文字问答,也没有证明它能改善长期掌握程度。
Socra 仍是早期、Windows 优先、目前仅支持英语的 MIT 开源项目,尚未经过其他用户测试,macOS/Linux 支持也是待办。对国内程序员来说,它更适合参考实现思路;中文技术问答的识别、术语发音和实际体验,原文都没有验证。
能拿来做什么
- 在项目里程碑后,让 agent 围绕刚完成的前端或 Node 改动提问,例如数据为何放在这一层、异常如何处理;先试口头作答,观察它能否暴露解释不清的地方。
- 给语音编程工具拆开记录首句等待、语音合成和播放起声时间,遇到吞字时先检查音频文件,再排查浏览器播放链路。
- 为 agent 的模式切换写清已完成的确认、下一步动作和首轮输出,并记录切换日志,避免新会话重复等待用户操作。
- 如果讲解页面需要后退、重复和重连恢复,可以借鉴带 schema 校验的 JSON 场景,让前端渲染完整状态,并向模型返回具体字段错误。