HN 日本語サマリー

← 一覧へ戻る
プログラミング

謎のビープ音の発生源を特定する

Locating the source of a mysterious beep (simonwillison.net)

275 pointsby bigwheels141 コメント

要約

自宅の部屋から発生する原因不明の断続的なビープ音の発生源を特定するため、著者はAIコーディングアシスタント「Claude Code」を活用し、複数のデバイス(スマートフォン、タブレット、ラップトップ)をマイクとして使用する「Beep Locator」システムを開発しました。このシステムは、これらのデバイスを使って音源を三角測量し、最終的に約40cmの精度で発生源を特定することに成功しました。

全文翻訳

謎のビープ音の発生源を特定する Claudeと共に

2026年11月9日

我が家には、前回の引っ越しからまだ開けていない箱でいっぱいの部屋があります。数週間前、その部屋のどこかから断続的にビープ音が鳴り始めました。ビープ音の間隔が長いため、部屋に立って音源を特定しようとしてもイライラするだけで、箱を一つ一つ漁る気にはなれませんでした。そこで、Claude CodeにBeep Locatorを構築してもらいました。これは、部屋中に散らばった複数のデバイスを使って、謎のビープ音の発生源を三角測量するソフトウェアシステムです。

Beep Locatorがしばらく実行された後の様子は以下の通りです。

[画像: 部屋の謎のビープ音を特定するために、複数の携帯電話、タブレット、ラップトップをマイクとして使用するウェブアプリのスクリーンショット。左側の列には、QRコードと参加リンクを含む「リスナーを追加」パネル、[「キャリブレーション」、「テストビープ」、「ビープが鳴った!」]ボタンを含む「コントロール」パネル、および「ビープ音を聞く」チェックボックスがあり、さらに「謎のビープ音」というメモには「3345 Hz ・ 3回確認 ・ セッション間で記憶」と表示されています。その下には、「デバイス」リストがあり、5つの色分けされたリスナー(Simon iPhone、New iPad、Old iPad、MacBook Pro、Surface Ultra)が表示され、それぞれに「✓マイク動作 ・ ✓スピーカー動作」とマークされています。メインエリアはグリッド状のマップで、1mのスケールバーがあり、5つのデバイスが色付きのドットとして、以前の音は小さなタイムスタンプ付きのマーカーとして表示されています。MacBook Proの近くにあるピンク色の影付き円は「謎のビープ音 ・ 2回検出 ・ 約41cm以内」とラベル付けされており、その隣には破線のプラス記号が「ここにリスナーを追加?謎のビープ音の位置を約12%絞り込めるかも」と示唆しています。マップの下には、「謎のビープ音の音量 温かい/冷たい」パネルがあり、各デバイスのバーが表示されています。Surface Ultraが「-6.0 dB ▲ +11.6 dB 温かい」で最も大きく、注釈には「約6 dB大きいということは、距離が約半分であることを意味します」とあります。一番下には、「検出された音」テーブルがあり、最近のクラップ音やビープ音とその座標、または「到着時刻が物理的にありえない(エコーまたは別の音?)」という警告が表示されています。]

Pythonウェブサーバーを実行してメインのUIを表示し、QRコードまたはURLを使用して、リスナーとして機能させることができるデバイスをできるだけ多く接続します。私は2台のiPad、1台の電話、1台のMacBook Pro、1台のSurface Ultraを使用しました。

その後、デバイス同士で音を再生し、互いの位置を推定します。これはあまりうまくいかなかったため、「ラフモード」を追加しました。このモードでは、マップ上でアイコンをドラッグして大まかな位置を指定でき、その位置に基づいて調整が行われます。

セットアップが完了したら、すべてのデバイスがビープ音を待ち受けます!

クラップモードも追加したので、部屋のさまざまな場所で手を叩いてテストしました。これはマップ上にひし形として表示されます。これにより、音を定位する能力に自信を持つことができました。

ビープ音はマップ上にXとして表示され、「検出された音」ログにも行が追加されます。これらの音を(各デバイスから順番に)再生して、探している謎のビープ音であることを確認し、「これが謎のビープ音です」をクリックしてマークすることができます。

謎のビープ音の周波数を特定したら、システムはその周波数の音を待ち受け、ビープ音の間隔を測定し、三角測量された位置情報を使用してマップ上で最も可能性の高い位置を特定します。

システムは意図した通りに機能しました。ビープ音の位置を約40cmの精度で特定してくれたので、その特定の箱の山を掘り起こしたところ、電池交換が切実に求められている古い一酸化炭素検出器が見つかりました。

仕組み

この問題についてClaudeと取り組み始めたとき、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などのほとんどの市販モバイルデバイスに容易に適用できます。これは、2ウェイセンシング、セルフレコーディング、サンプルカウントの組み合わせにより、高精度を実現します。

これはまさに私たちが構築する必要があるもののように思えました!

Beep Locatorは、ほとんどの作業を行うPythonウェブアプリケーションサーバーを実行します。リスニングデバイスはその後、WebSockets経由でそのサーバーに接続し、ブラウザのマイクアクセスを要求するUIを表示します。リスナーは主に、直近60秒間のオーディオバッファを記録することで機能します。また、簡単なビープ音検出アルゴリズム(detector.jsを参照)を実行し、高速フーリエ変換とハイパスフィルターを使用して潜在的なビープ音を特定します。これらのイベントはメインサーバーに送信されます。

ビープ音が報告されると、サーバーは短いチャープ音を再生します(サーバーへのラウンドトリップ時間が最も短いデバイスで)。その後、すべてのリスナーに、チャープ音の約0.6秒前から0.8秒後までのクリップをアップロードするように要求します。このチャープ音により、クリップを互いに整列させることができ、ビープ音の定位において重要なステップとなります。

構築方法

このプロジェクトは、iPhone経由でClaude Code Cloudを使用して開始しました。Opus 5.5をExtra thinking effortモードで実行しました。以下は、新しく作成された空のGitHubリポジトリに対して実行されたこの共有開始セッションです。

解決したい問題について説明する problem.md ファイルを作成してください

部屋の中にビープ音を出すデバイスがあり、それを見つけられません

部屋中にラップトップ、電話、iPadなどの複数のデバイスを配置し、すべて同時に聞いて、ビープ音の発生源を三角測量できるようにしたいです

それをすべて調整するPythonウェブアプリが必要です。1つのデバイスがアプリのウェブページを表示し、他のデバイスがURLに参加してリスナーになる。すべてブラウザのWebAudioとPythonサーバーアプリへのWebSocket経由で行います

理想的には、デバイスの相対的な位置を手動で入力する必要がないようにしたいです。互いに音を再生して2D空間で互いを特定できるようにすると素晴らしいのですが、それは可能でしょうか?

これにより、この problem.md ファイルが得られました。このファイルを作成する過程で、ClaudeはBeepBeep論文を見つけて読みました。これはそのファイルに記載されています。

調査は良好に見えたので、次のように指示しました。

OK、構築を試してみてください。リスナーに新しいコードを送信し、それを自動的に実行できるようにするメカニズムを追加してください。そうすれば、部屋でセットアップを完了してから、私が他のことをしている間に、あなたがハッキングを続けたり実験したりできるように、私を放置できます。

これにより、この時点まで到達しました。システムのほとんどの部分が構築されましたが、まだ実際に実行されたものはありませんでした。

新しいリポジトリをラップトップにクローンし、Claude Codeを起動しました...そしてFable 5.2がリリースされました。このプロジェクトは、それを試す絶好の機会のように思えました。

ラップトップ上のClaude Codeにサーバーの実行を開始させ、何が起こっているかを確認し、実行中のソフトウェアにライブ変更を加えることができるようにしました。

これはすでにソフトウェアに組み込まれていました。Opus 5.5は、リスナーにWebSocket接続経由でトリガーできるinstallModule()メソッドを構築していたため、管理サーバーはクライアントのいずれかで任意の新しいコードを実行できました。

一部のデバイスでは、マイクをリッスンするウェブページは、ページがリロードされるたびにユーザーの許可を求めます。ホットスワップモジュールメカニズムにより、リスニングデバイスのそれぞれに手動で対話することなく、新しいコードをデプロイできました。

それ以降、私の関与は主にラップトップの横に座ってFable 5.2と何が起こっているかについてチャットし、時折新機能のリクエストをすることでした。以下は、私が実行した機能プロンプトの一部です。

「ラフモード」でマップ上のものをドラッグできるようにする必要があると思います。私の仕事は、それらを大まかに配置することだけで、ラフモードを終了すると、正確性を取得しようとします。

これにより、リスナーをマップ上でドラッグできるようになりました。

これをテストするのに良い方法はありますか?クラップ音を聞くようにして、私が手を叩けば、クラップ音の場所を特定できるでしょうか? [...]
クラップ音は、ビープ音とは異なるシンボルでマップに表示されるべきです

これにより、手を叩くたびにビープ音とは異なるシンボルでマップに表示されるようになりました。

マップ上の各シンボルには、HH:MM:SSのタイムスタンプを含めるべきです

これにより、どのシンボルがどの実際の音を反映しているかを特定しやすくなりました。

ログには、ビープ音とクラップ音をタイムスタンプと共に表示し、クリックすると、各リスナーからの録音を順番に再生する小さな再生ボタン(画面にはどのリスナーがどのスニペットを録音したかを示す明確なテキストが表示される)があり、再生中は一時的にマイク録音をオフにする必要があります。

これで音を再生できるようになり、探している謎のビープ音である録音スニペットを特定するのがはるかに容易になりました。

録音の横に「これが謎のビープ音です」というボタンがあるべきです。そうすれば、再生して確認し、それが探しているものなら謎のビープ音であることを確認できます。
そうすれば、システムは将来、ノイズを分類して、それが同じ謎のビープ音である可能性が高いかどうかを確認し、その情報を使用して、それがどこにあるのかについてのより正確なアイデアを構築できます。

この時点で、私はかなり近づいていました。ビープ音の発生源について solid なアイデアを持っていましたが、さらに正確な位置を得るために、その地点の周りにリスナーを再配置できたら、もっとクールではないでしょうか?

この機能を追加したいです。各リスニングデバイスなどを再起動する必要はありません。リスナーを再配置するための「リスナーを再配置する」ボタンをクリックして再配置モードに切り替え、「再配置済み」をクリックするとラフモードに入り、大まかに配置するように求められます。その後、配置してクリックすると、再び開始されます。以前のセッションはアプリを通じて読み取り専用で表示できます。

そして、もう1台デバイスが余っていたので、次のように言いました。

マップに、これまでに収集されたデータに基づいて、リスナーを追加すると役立つ場所の提案が含まれる機能を追加してください。

Claude Codeに耳を与える

このプロジェクトで最も興味深い部分は、Claude Codeに耳を与えることが可能であることを実証したことだと思います。

Claudeにはネイティブのオーディオ入力(まだ)はありませんが、マイクでキャプチャされたオーディオを分析できるJavaScriptおよびPythonコードを実行できます。

Webサーバーを実行し、複数のリスニングデバイスとのWebSocket接続を確立するように指示し、それらのデバイスでWebAudioマイクを実行させ、WebSocket経由で実行される新しいJavaScriptコードを送信できるようにしました。

その後、Claudeに問題のハッキングを任せ、オーディオログをクエリし、問題を解決するために耳を再構成させることができました。

数週間前にGitHub Universeで聞いた同様のハックを思い出します。Martin Woodwardは、GitHub UniverseのバッジコンピューターをUSB-C経由でコンピューターに接続し、画面にウェブカメラを向けることでデバッグしていたと語っていました。これにより、彼のコーディングエージェントは、アップデートが正しく機能しているかどうかを確認できました。

コーディングエージェントが周囲の世界を認識できるようにする方法を見つけるのは、非常に楽しいことです。