跳到正文
认知
返回认知精选
认知精选科技大约 9 小时前1
单一来源当前只有一个可用来源,尚未完成多源交叉核验

定位神秘蜂鸣声来源

Simon Willison 的博客

Newsletter

赞助方:doubleAI — doubleAI 的 Maxwell 可在软件运行时加速其性能,无需更改代码。现已开放早期访问

利用 Claude 定位神秘蜂鸣声的来源

2026 年 11 月 9 日

我们家里有一个杂物间,里面堆满了我们在上次搬家后还没拆封的箱子。几周前,那个房间里的某样东西开始间歇性地发出蜂鸣声。蜂鸣声间隔很远,站在房间里试图确定噪音的来源让人很沮丧,而且我真的不想去翻阅每一个箱子。于是,我让 Claude Code 构建了 Beep Locator,这是一个软件系统,利用散落在房间各处的多个设备来三角定位神秘蜂鸣声的来源。

这是 Beep Locator 运行了一段时间后的样子:

你运行 Python Web 服务器来显示主界面,然后使用二维码或 URL 连接尽可能多的设备作为监听器——我当时用的是两台 iPad、一部手机、一台 MacBook Pro 和一台 Surface Ultra。

然后这些设备会互相播放声音,以帮助估算它们的位置。这效果不太理想,所以我添加了一个“粗略模式”,你可以拖动地图上的图标来提供大致位置,系统会根据这些声音进行调整。

设置完成后,所有设备都会开始监听蜂鸣声!

我还添加了一个拍手模式,这样我可以通过在房间不同位置拍手来测试它——在地图上显示为菱形。这帮助我确信它具备定位声音的能力。

蜂鸣声在地图上显示为 X,并在“已定位声音”日志中显示一条线。你可以回放这些声音(依次来自每个设备)来确认它们就是你正在寻找的神秘蜂鸣声,然后点击“This is the mystery beep”将其标记为该声音。

一旦你确认了神秘蜂鸣声的频率,系统就会开始监听它,测量蜂鸣声之间的间隔,并利用三角定位的位置来确定地图上最可能的位置。

系统按预期工作了。它将蜂鸣声的位置定位到了大约 40 厘米的误差范围内,然后我翻开了那堆特定的箱子,发现了一个急需更换电池的旧一氧化碳探测器。

工作原理

当我开始与 Claude 解决这个问题时,它很快找到了 Chunyi Peng、Guobin Shen、Yongguang Zhang、Yanlin Li 和 Kun Tan 在 2007 年发表的论文 BeepBeep: A High-Accuracy Acoustic-Based System for Ranging and Localization Using COTS Devices。以下是该论文的摘要:

我们介绍了 BeepBeep 的设计、实现和评估,这是一个高精度的基于声学的测距系统。它在无需依赖任何预规划基础设施的情况下,在自发的、即兴的、设备对设备的上下文中运行。它是一个纯软件解决方案,仅使用最基本的商用硬件集——扬声器、麦克风和某种形式的设备对设备通信——因此可以轻松应用于许多低成本传感器平台以及大多数商用现成移动设备,如手机和 PDA。它通过结合三种技术来实现高精度:双向感知、自记录和样本计数。

听起来完全就是我们想要构建的东西!

Beep Locator 运行一个 Python Web 应用服务器,完成大部分工作。监听设备随后通过 WebSockets 连接到该服务器,并展示一个请求浏览器麦克风访问的 UI。

监听器主要通过录制最近 60 秒的音频缓冲区来工作。它们还运行一个简单的哔哔声检测算法(参见 detector.js),该算法使用快速傅里叶变换和高通滤波器来识别潜在的哔哔声。它将这些事件发送到主服务器。

当报告哔哔声时,服务器会指示一个设备播放一个短促的啁啾声(到服务器的往返时间最短的设备),然后要求每个监听器上传一段从哔哔声前约 0.6 秒到该啁啾声后 0.8 秒的音频片段。这个啁啾声允许片段相互对齐,这是定位哔哔声的关键步骤。

我是如何构建它的

我最初通过 iPhone 使用 Claude Code Cloud 开始这个项目,Opus 5.5 运行在 Extra thinking effort 模式下。这是那个共享的启动会话,以针对一个新创建的空 GitHub 仓库发出的以下提示开始:

Write out a problem.md file describing the problem we want to solve

There is a device beeping in a room and I cannot find it

I want to set up several devices - laptops, phones, iPads - around the room all listening at the same time and have them help triangulate where the beep comes from

There needs to be a Python web app which coordinates it all - one device shows a web page for the app, other devices join a URL which turns them into listeners - all via browser WebAudio and WebSockets back to the Python server app

Ideally I wouldn't need to manually input the relative locations of the devices - it would be amazing if they could play sounds to each other in order to locate each other in 2D space - is that even possible though?

这让我得到了那个 problem.md 文件。在撰写该文件时,Claude 找到了并阅读了 BeepBeep 论文,该论文在文件中有描述。

这项研究看起来不错,所以我告诉它:

Ok try and build it, add a mechanism so you can send new code to the listeners which they will then run automatically - that way I can set everything up in the room and then leave you alone to continue hacking and experiment while I do something else

这让我到了这一步——系统的大部分已经构建完成,但还没有人真正尝试运行它。

我将新的仓库克隆到我的笔记本电脑上,启动了 Claude Code……然后 Fable 5.2 发布了,这个项目似乎是一个绝佳的机会来测试它。

我让笔记本电脑上的 Claude Code 启动服务器运行,然后确保它既能看到正在发生的事情,又能对正在运行的软件进行实时更改。

这已经内置在软件中了:Opus 5.5 在监听器上构建了一个 installModule() 方法,可以通过 WebSocket 连接触发,这意味着管理服务器可以在其任何客户端上执行任意的代码。

在某些设备上,监听麦克风的网页会在每次页面重新加载时请求用户权限。热交换模块机制意味着我们可以在无需手动逐一与每个监听设备交互的情况下部署新代码。

从那时起,我的主要参与就是坐在笔记本电脑旁,和 Fable 5.2 聊天,了解正在发生的事情,并偶尔请求新功能。以下是我运行的一些功能提示:

我想我们需要做到这一点,这样我就可以在地图上的“粗略模式”中拖动东西,我的工作只是把它们粗略地放在那里,然后退出粗略模式,它尝试让它们变得精确

这给了我拖动监听器在地图上的能力。

我想知道测试这个的好方法是什么?我们可以让它监听拍手声,然后我可以拍手,它就能识别拍手的位置吗? [...]

地图上的拍手应该使用与哔哔声不同的符号

这添加了这样一个功能:每次我拍手时,它都会在地图上显示为一个与哔哔声不同的符号。

地图上的每个符号都应该包含一个 HH:MM:SS 时间戳

这使得更容易识别哪个符号可能反映了哪个真实世界的声音。

日志应该显示带有时间戳的哔哔声和拍手声,并且应该有一个小播放按钮,点击时按顺序回放每个监听器记录的噪音(屏幕上显示清晰的文字说明哪个监听器记录了哪个片段),同时在回放播放时暂时关闭麦克风录制

现在我能够回放声音,这使得更容易识别哪个记录的片段是我正在寻找的神秘哔哔声。

在录音旁边应该有一个“这就是神秘哔哔声”的按钮——然后我可以点击回放来查看,如果那是的话,确认它就是神秘哔哔声

Evidence

来源与证据

单一来源 · 1 个信源

当前仅有一个可用来源,尚未完成多源交叉核验。

发布时间
内容处理
AI 翻译 / 摘要,需结合原文核对
内容有误或来源失效?告诉我们

每天早上收到这 5 条

免注册,填邮箱即可;每封邮件都能一键退订。

提交即表示同意按隐私说明保存你的邮箱,只用于发送简报。

或用 RSS 订阅

AI 翻译、摘要和解读仅用于辅助判断;涉及重要决策时,请回到上方来源核实。