Django 联合创造者 Simon Willison 让 Claude Code 通过多设备麦克风定位神秘蜂鸣,精度约 40 厘米
Simon Willison 用 Claude Code 搭建了一套基于浏览器的多设备声学三角定位系统,在杂物间找到了一个急需换电池的旧一氧化碳探测器。他认为这个项目最有意思的部分不是声学定位本身——那篇 2007 年的 BeepBeep 论文早已描述了原理——而是编程智能体可以通过 WebSocket 热部署代码、远程操控多台设备的麦克风,从而获得对物理世界的感知能力。
杂物间里有个东西在间歇性地响。蜂鸣间隔太长,Simon Willison 站在房间里很难判断声源位置,又不想翻遍所有纸箱。于是他让 Claude Code 写了一个系统:用房间里能找到的所有设备——两台 iPad、一部手机、一台 MacBook Pro 和一台 Surface Ultra——同时监听,通过声学三角定位找到蜂鸣源。系统最终把位置锁定在 40 厘米范围内,他翻开那一堆箱子,发现是一个急需换电池的旧一氧化碳探测器。
Willison 认为这个项目最有意思的部分不是定位精度,而是他证明了一件事:可以给编程智能体装上耳朵。Claude 本身没有原生音频输入,但它能运行 JavaScript 和 Python 代码来分析麦克风捕获的音频。他让 Claude 启动一个 Python 服务器,通过 WebSocket 连接多台设备,在每台设备上调用浏览器 WebAudio API 获取麦克风权限,然后给它们热部署新的音频处理代码。这样一来,他基本可以走开,让 Claude 自己查询音频日志、调整检测算法、重新配置它的耳朵。
技术机制基于 2007 年的 BeepBeep 论文。每台监听设备维护一个 60 秒的音频缓冲区,运行一个用快速傅里叶变换和高通滤波器识别蜂鸣的检测脚本。当某台设备报告疑似蜂鸣时,服务器选择往返延迟最低的设备播放一个短促啁啾声,然后要求所有设备上传蜂鸣前约 0.6 秒到啁啾后约 0.8 秒的音频片段。这个啁啾声充当时间戳,让各设备的片段可以精确对齐,从而计算到达时间差并三角定位。
开发过程中,Willison 先用 Claude Code Cloud 在 iPhone 上以 Opus 5.5 生成了问题描述和初始代码,然后把仓库克隆到笔记本上,用新发布的 Fable 5.2 继续迭代。关键设计是 Opus 5.5 在初始构建时就写了一个 installModule() 方法,允许服务器通过 WebSocket 向任意监听设备推送并执行新的 JavaScript 代码。这意味着 Willison 不需要跑到每台设备前刷新页面、重新授权麦克风,智能体可以远程部署修改。他通过一系列具体提示逐步添加了拖拽定位、拍手测试、时间戳标注、录音回放和标记神秘蜂鸣等功能。
不过自动设备间测距效果并不好,Willison 不得不加入一个粗糙模式,让用户手动把设备图标拖到大致位置,系统再在此基础上微调。这说明这套方法在真实环境中仍然依赖人工初始校准。另外,40 厘米的精度来自一次特定场景——小房间、间歇性蜂鸣、五台设备——不是可复现的基准测试结果。Willison 自己也提到 GitHub Universe 上 Martin Woodward 用类似思路给编程智能体装眼睛:通过 USB-C 连接徽章电脑,再架一个摄像头对着屏幕,让智能体判断更新是否成功。他的结论是:想办法让编程智能体感知周围世界,是一件非常有趣的事。