用 Claude 定位神秘哔声的来源
本文目录
我们家有一个储物间,里面堆满了上次搬家后还没拆封的箱子。几周前,那个房间里开始有东西间歇性地发出哔声。哔声间隔太久,站在房间里试图判断声源很令人沮丧,而我真的不想翻遍每一个箱子。于是我让 Claude Code 构建了 Beep Locator,一个利用散布在房间各处的多台设备来三角定位神秘哔声来源的软件系统。
这是 Beep Locator 运行一段时间后的样子:
你运行一个 Python Web 服务器来显示主界面,然后使用二维码或 URL 连接尽可能多的设备作为监听器——我用了两台 iPad、一部手机、一台 MacBook Pro 和一台 Surface Ultra。
然后这些设备会互相播放声音,以帮助估计彼此的位置。这效果不是特别好,所以我加了一个「粗略模式」(Rough mode),你可以在空间中拖动它们的图标来提供大致位置,然后根据那些声音进行调整。
设置完成后,所有设备都会监听哔声!
我还加了一个拍手模式,这样我就可以在房间不同位置拍手来测试它——在地图上显示为菱形。这帮助我确信它有能力定位声音。
哔声会以 X 的形式显示在地图上,并在「已定位声音」日志中增加一行。你可以重放这些声音(依次从每台设备播放),以确认它们就是你正在寻找的神秘哔声,然后点击「这就是神秘哔声」将其标记。
一旦你确认了神秘哔声的频率,系统就会监听它,测量哔声之间的间隔,并利用三角定位的位置锁定地图上最可能的地点。
系统按预期工作。它把哔声的位置确定在约 40 厘米以内,然后我翻找了那堆特定的箱子,发现了一个古老的一氧化碳探测器,它急需更换电池。
工作原理#
当我开始和 Claude 一起解决这个问题时,它很快找出了《BeepBeep: A High-Accuracy Acoustic-Based System for Ranging and Localization Using COTS Devices》,这是 Chunyi Peng、Guobin Shen、Yongguang Zhang、Yanlin Li 和 Kun Tan 在 2007 年发表的一篇论文。以下是该论文的摘要:
我们介绍 BeepBeep 的设计、实现与评估,这是一个基于声学的高精度测距系统。它在自发、自组网、设备到设备的场景中运行,不依赖任何预先规划的基础设施。它是一个纯软件解决方案,只使用最基本的一组商用硬件——扬声器、麦克风和某种设备间通信方式——因此可以很容易地应用于许多低成本传感器平台,以及大多数商用现货移动设备,如手机和 PDA。它通过三种技术的组合实现高精度:双向感知(two-way sensing)、自录音(self-recording)和样本计数(sample counting)。
这听起来正是我们需要构建的东西!
Beep Locator 运行一个 Python Web 应用服务器,完成大部分工作。监听设备随后通过 WebSockets 连接到该服务器,并呈现一个请求浏览器麦克风权限的界面。监听器主要依靠录制最近音频的 60 秒缓冲区来工作。它们还运行一个简单的哔声检测算法(见 detector.js),该算法使用快速傅里叶变换(Fast Fourier Transform)和高通滤波器来识别可能的哔声。它将这些事件发送到主服务器。
当有哔声被报告时,服务器会让一台设备播放一段短促的鸣叫(到服务器往返时间最短的设备),然后要求每个监听器上传一段音频片段,范围大约是哔声前 0.6 秒到鸣叫后 0.8 秒。这段鸣叫使各个片段能够相互对齐,这是定位哔声的关键一步。
我是如何构建它的#
我从 iPhone 上通过 Claude Code Cloud 启动了这个项目,运行的是处于 Extra thinking effort 模式的 Opus 5.5。这是共享的起始会话,它从针对一个新建的空 GitHub 仓库写下这段提示开始:
写一个 problem.md 文件,描述我们想要解决的问题 房间里有一个设备在哔哔响,我找不到它 我想在房间里布置几台设备——笔记本电脑、手机、iPad——同时监听,让它们帮助三角定位哔声的来源 需要一个 Python Web 应用来协调这一切——一台设备显示应用网页,其他设备加入一个 URL 成为监听器——全部通过浏览器 WebAudio 和 WebSockets 连接回 Python 服务器应用 理想情况下我不需要手动输入设备的相对位置——如果它们能互相播放声音,从而在二维空间中定位彼此,那就太棒了——不过这真的可能吗?
这让我得到了一个 problem.md 文件。在撰写它的过程中,Claude 找到并阅读了 BeepBeep 论文,该论文在该文件中有所描述。
研究看起来不错,所以我告诉它:
好的,试着构建它,加一个机制,让你可以把新代码发送给监听器,让它们自动运行——这样我就可以在房间里把一切设置好,然后让你自己继续折腾和实验,我去做别的事
这让我达到了这个阶段——系统的大部分已经构建完成,但还没有真正尝试运行过。
我把新仓库克隆到笔记本电脑上,启动了 Claude Code……然后 Fable 5.2 发布了,这个项目似乎是测试它的绝佳机会。
我让笔记本电脑上的 Claude Code 启动服务器,然后确保它既能看见正在发生的事情,又能在软件运行过程中实时修改软件。
这一点已经内置在软件中:Opus 5.5 在监听器上构建了一个 installModule() 方法,可以通过 WebSocket 连接触发,这意味着管理服务器可以在任何客户端上执行任意新代码。
在某些设备上,监听麦克风的网页每次重新加载时都会请求用户权限。热插拔模块机制意味着我们可以部署新代码,而不必依次手动操作每个监听设备。
从那时起,我的参与主要是坐在笔记本电脑旁,和 Fable 5.2 聊正在发生什么,偶尔请求新功能。以下是我运行过的一些功能提示:
我觉得我们需要做到让我能在「粗略模式」下在地图上拖动东西,我的工作只是把它们放在大致位置,然后退出粗略模式,它尝试让它们精确
这让我能够在地图上拖动监听器。
我想知道有什么好办法来测试这个?能不能让它监听拍手声,然后我拍手,它就能识别拍手的位置?[…] 拍手在地图上应该使用与哔声不同的符号
这加上了这样一个功能:每次我拍手,它都会在地图上以不同于哔声的符号显示。
地图上的每个符号都应该包含 HH:MM:SS 时间戳
这让我更容易看出哪个符号可能对应现实世界中的哪个声音。
日志应该显示带有时间戳的哔声和拍手声,并且有一个小播放按钮,点击后依次重放来自每个监听器的录制声音(屏幕上用清晰的文字显示哪个监听器录制了哪段),同时在重放期间暂时关闭麦克风录制
现在我可以重放声音了,这让我更容易识别哪段录制片段是我在找的神秘哔声。
应该在录音旁边有一个「这就是神秘哔声」按钮——然后我可以点击重放来查看,如果那正是我在找的,就确认它是神秘哔声 然后系统可以在未来对噪音进行分类,看它们是否可能是同一个神秘哔声,并利用这些信息构建更准确的位置判断
此时我已经很接近了——我已经对哔声来自哪里有了可靠的判断,但如果我能把监听器重新布置在那个点周围,以获得更精细的位置,那岂不是很好?
我想要一个这样的功能,我不想重启每个监听设备等等,我希望能够点击一个「重新布置设备」按钮,让我进入重新布置模式,然后我点击「已重新布置」,它把我带入粗略模式,要求我大致定位它们,我照做并点击,然后它重新启动。之前的会话可以通过应用只读查看。
由于我还有一台备用设备,我接着说:
加一个功能,让地图上包含一个建议位置点,根据目前收集的数据,在那里添加一个监听器会很有用
给 Claude Code 装上耳朵#
我认为这个项目最有趣的部分是,我证明了给 Claude Code 装上耳朵是可能的。
Claude 没有原生音频输入(目前还没有),但它可以运行 JavaScript 和 Python 代码,分析麦克风捕获的音频。
我让它运行一个带有 WebSocket 连接的 Web 服务器,连接多台监听设备,然后让它同时在这些设备上运行 WebAudio 麦克风,并把它们接入,以便可以通过该 WebSocket 向它们发送新的 JavaScript 代码来执行。
然后我基本可以让 Claude 自己待着,让它攻克问题、查询音频日志,并重新配置它的耳朵来帮助它解决问题。
这让我想起几周前在 GitHub Universe 上听说的一个类似黑客技巧:Martin Woodward 告诉我,他一直在调试 GitHub Universe Badge 计算机,方法是把它们通过 USB-C 插入电脑,然后把网络摄像头对准它们的屏幕,这样他的编程智能体就能判断更新是否正常工作。
想办法让编程智能体感知周围世界,非常有趣。
发布于 2026 年 11 月 9 日晚上 11:57