機械が異音を出しているとき、どこから鳴っているのかを目で確かめられると話は早い。それをやる装置がアコースティックカメラで、カメラ映像の上に音の強さを熱画像のように重ねて表示する。ただし市販品は数十万円からになり、個人が試しに買える値段ではない。マイクを数百本並べた構成が普通なので、価格が下がる要素も乏しい。
22carlo22氏がGitHubで公開した「AcousticCam」は、これをESP32とマイク4本で組む試みだ。ESP32がカメラ映像と4本のマイクの音を送り出し、受け取ったパソコン側のPythonが音源の位置を計算してヒートマップを描く。音の到来方向を求める処理には既製のライブラリを使わず、一から書いている。仕組みを理解するためと、後でC++に移してESP32単体で動かすときの下地にするためだという。
今回の更新は速度の改善が中心だ。それまでは音声をUSBシリアルで送り、カメラ映像は自宅のWi-Fi経由で流していた。これを改め、ESP32自身をアクセスポイントにしてパソコンを直接つながせ、映像と音声を1本の無線で受け取る形にした。計算も削り、選んだ範囲の周波数だけを扱って全帯域の処理をやめている。省いた分はヒートマップの解像度に回せる。
マイクが4本しかない弱点にも、設定で手を打った。低い音では画面に大きくぼやけた雲が出るため、ぼかしを削って音源の真上に鋭い点を残す調整を用意した。反響でヒートマップが跳ねる問題には平滑化を、狙った音だけを見たい場合には画面中央に検出を絞る機能を足している。イヤホンとMP3プレーヤーで高さの違うホワイトノイズを鳴らし、別々に切り分ける様子も公開した。
マイクの本数と間隔が何を決めているかについて、同氏の説明が分かりやすい。音源の位置は2本以上のマイクに届く音の位相差から求めるため、間隔が狭ければ高い音を、広ければ低い音を正確に扱える。装置は実際のマイク間隔から最適な周波数範囲を自動で計算する。市販品がマイクを数百本も並べるのは、短い間隔と長い間隔の両方を同時に確保して守備範囲を広げるためだ。
次はパソコンを外し、ESP32だけで完結させる計画だ。ESP32-S3のカメラ付きボードに2インチ(約51mm)の液晶とロータリーエンコーダーを組み合わせ、片方のコアで音の計算を、もう片方でヒートマップの描画を担当させる。カメラ1枚の取得に約50ミリ秒かかるため、両方の処理をそれぞれ50ミリ秒以内に収めれば毎秒20コマで動くと見積もる。