AIで救急車のサイレン音を解析し救急車の往来回数をカウントしよう(1)

画像処理
救急車の音をAIで解析して往来回数をカウントしよう
Table of Content

救急車うるさーい!
のっけから不満でスタートしましたが、私は都内に住んでいて、それも救急病院の近くという、自分が急病になるリスクを考えると最高に安心な場所に住んでいます。しかし、当然のことながら、自分だけでなく他人も急病になるわけでして、その都度、急病人は救急車で搬送されてまいります。この救急車のサイレンの音が実にうるさい。もちろん、救急病院は何十年も前からそこにあって、私の方が後から引っ越して来ているわけですから、不満を言っても仕方がありません。厚木に家を建てて米軍機がうるさい、と不満を言うようなものです。不満があるならマッカーサーに言え。

とは言えあの救急車のサイレン音はやはり少しストレスだったりします。ここはひとつ、1日に何回くらいサイレン音を聞かされているのか、AIとIoT装置を組み合わせて計測してみよう、という企画になります。AIを使った解析もするので複数回に分けて掲載します。

今回のシステムのアウトプットは、以下のような表になります。このデータが毎日集まってくると長期的なトレンドが解析できるというものです。何の役に立つのかって? 次の家賃交渉の時に使うんだよ。「ここは救急車の音がうるさいから家賃下げろ」ってね。

救急車のサイレンが聞こえ始めた日時 救急車のサイレンが聞こえなくなった日時
2021-09-16 11:25:30 2021-09-16 11:27:10
2021-09-16 12:13:20 2021-09-16 12:14:40
・・・ ・・・

音響認識の方法

AIを使った音響認識の方法

よく使われる手法としては、音を周波数成分に分解して画像化し、AIの画像分類問題として解くというものです。「何のこっちゃ?」という人に簡単に説明をすると、マイクで集めた環境音の中に「高い音」と「低い音」の成分がどれくらいの割合で混ざっているか1秒ごとに、色が明るいほどその成分の音が強くなるように塗り分けします。これを横に300秒分並べてあげると、5分間の音ファイルから以下のような画像が得られます。ほら、音が画像になりましたね。あとはAIが得意な画像分類をして、救急車が来た時の画像と、来ていない時の画像に分類してあげればよいということです。

音を周波数分布として可視化した画像

音を周波数分布として可視化した画像

異音検知などにも使える?

今回、救急車の音を異音と見立てたとき、どれくらいの音量なら聞き分けられるか実験してみましょう。技術的な詳細に興味がない人でも、一連の記事の最後の部分に、AIでどこまで音響を判別できるか感覚で理解できる結果を掲載しています。
蛇足ですが、機械の故障予知やら不具合の見極めのため職人さんが音で判断する、ということは昔から行われています。これをIoT・AIで代替しようというソリューションは、DXコンサルタントの間では「異音検知もの」などと呼ばれており、IoT・AIの用途リストなどという、何の役に立つのか良くわからない資料を作らされる時には非常によく出てきます。
DXコンサルタントの資料では「異音検知もの」は簡単に実現できることになっていますが、実際のところは、音×AIで異常判定できるかどうかはその音の状況に強く依存します。以下のような条件だと少し難しいかもしれません。

  • 異常音の教師データが取得できない
  • 異常音の音量が小さすぎる
  • 異常音以外の環境音が大きすぎる

めったにない故障で故障の直前まで異音は出ないという場合、教師データが作れませんし、工場の中だと恒常的に爆音が轟いていて特定の装置の異常音などはAIはおろか人間にさえ聞き分けられないものです。職人さんはなぜか聞き分けられますが、そのスキルをAIに変換できるかどうかはやってみないとわかりません。・・嘘です。たいてい難しいです。
逆に言えば再現性があり聞き分け可能な異音についてはAIで検出することが可能です。

水道管の漏水音を聞き分ける市の職員

水道管の漏水音を聞き分ける市の職員

救急車の音を集める

まずは窓際にマイク・ラズパイを置いて外の音を集めてみよう

何がともあれ、この種のシステムは四の五の言わず、間違っても実験企画書を作ったりせず、さっさとやってみることです。まずはソフトウェアで解析しやすいwavファイルの形で環境音を集めてみましょう。
今回は有名な「Raspberry pi(ラズベリーパイ。略してラズパイ)」という超小型コンピュータを使います。
Amazonで、USBキーボード、USBマウス、HDMIモニタ以外の必要なものが全部入ったセットを売っています。初めての人は、キットを買った方が無難でしょう。



Raspberry piの初期設定の方法はこちらの記事をご確認ください。

初期設定の終わったRaspberry piを起動してUSBマイク、マウス、キーボード、ディスプレイ、電源を繋げたらコマンドプロンプトを立ち上げて、以下の1行のコマンドを打ち込んで実行(エンターを押す)してください。

arecord --device "plughw:CARD=USB,DEV=0" --channels 1 --format S16_LE --rate 16000 --max-file-time 300 --use-strftime "%Y%m%d/%Y%m%d_%H%M%S_%v.wav"

--max-file-time 300 は何秒ごとに録音ファイルを切り替えるか、という意味です。とりあえず様子を見るためここでは300秒(=5分)としておきましょう。5分ごとに区切ったwav ファイルが、コマンドを停止するか、シャットダウンするか、SDカードの容量がいっぱいになるまで保存され続けます。

コマンドを入れエンターキーを押し録音が開始された後は、電源とUSBマイク以外は抜いてしまっても問題ありません。

とりあえず、家族で実家に帰っている間、つまり生活音が入らない条件で窓際にマイクを設置して録音してみます。

救急車の音をとるため窓際に設置したラズパイとマイク

救急車の音をとるため窓際に設置したラズパイとマイク

なおどんなUSBマイクでも良いですが、今回はこのマイクを使いました。

集めたwavファイルをPCに転送しよう

・・・はい。1日帰省している間に2日分のデータが取れました。5分ごとにファイルを分けたものだから、1日に288(=12×24時間)ファイルもできています。さて、最終的には救急車の音響分析はRaspberry pi単体で判定できるようにしたいと思いますが、とりあえず救急車が来た時に、どんな周波数成分が出て、どんな画像になるのか観察するために、これらのwavファイルを全部PCに移して解析してみましょう。

ファイル転送の仕方は、PCからラズパイまで直接接続できる人はFTPでもSFTPでも構いませんので直接転送してください。「なんのこっちゃ?」という人はRaspberry piでブラウザを開いて、Dropbox のようなオンラインストレージ経由でファイルを転送しましょう。
ラズパイからPCに転送したwavファイル

音を可視化し救急車の音の特徴を探そう

pythonでコードを書いてまずは環境音を可視化してみよう

PC上でこれらのwav ファイルを C:/TEMP/ というフォルダに置くとします。pythonのコードを書いて、まずは1つ1つのwav ファイルの周波数分析結果を可視化していきます。

その前にWindows PCにpythonが入っていないなら、インストールの仕方についてはこことか、こことか、色々なサイトに方法が記述されているのでご参照ください。

また、まだ入っていないなら必要なライブラリをインストールしていきましょう。

pip install -U pip
pip install numpy
pip install librosa
pip install matplotlib

環境が整ったところで以下のコードを C:/TEMP/ の中にtime_spectrum.py として保存してください。

import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
import glob
import os

files = glob.glob("C:/TEMP/*.wav")

for file in files:
    print(file)
    file_name = os.path.basename(file)
    if os.path.exists("./" + file_name.replace(".wav",".png")):
        pass
    else:
        y, sr = librosa.load(file,sr=16000)
        n_fft = 2048

        spec = np.abs(librosa.stft(y, hop_length=512))
        #spec = librosa.amplitude_to_db(spec, ref=np.max)
        spec = librosa.amplitude_to_db(spec, ref=10000)
        librosa.display.specshow(spec, vmin=-100, vmax=-50, sr=sr, x_axis='time', y_axis='log')
        plt.savefig("./" + file_name.replace(".wav",".png"))
        plt.clf()

実行します。C:/TEMP/ の中に可視化された画像ファイルが生成されていきます。

python time_spectrum.py

私のボロPCでは1つのwavファイルを画像化するのに10秒弱かかりましたので、大量の可視化処理をするのに1時間弱かかりました。そしてできたのが以下の画像群。

ほう・・・いや、パッと見では何もわからん。。

5分ごとの環境音wavを可視化

5分ごとの環境音wavを可視化

音を可視化した画像を眺めてみる

一つの画像を大きく表示してみます。

可視化画像の拡大図(1)

可視化画像の拡大図(1)

まず目につくのが、各画像ファイルで必ず見られる濃淡です。上の画像なら1分15秒前後から30秒程度続いているような部分です。この部分の元ファイルの音を聞いてみると、ブロロロロ、と車の音がします。どうやら信号が変わって車が走り出した音です。
また、50~200Hzの間と300Hz付近に最初から最後まで帯状に音を観測しています。ただ、これは元ファイルを確認してもよくわかりません。サーっというノイズがずっと記録されているのを反映しているのだと思われます。

救急車の音らしき部分を探す

何か特徴のある画像は無いか? と、かたっぱしから画像を見ていたら、あれ? これは・・?

可視化画像の拡大図(2)

可視化画像の拡大図(2)

可視化画像の拡大図(2)の拡大図

可視化画像の拡大図(2)の拡大図

「こいつは怪しい」と思って元の wavファイルを聞いてみると、はたして、これは救急車のサイレン音でした。めっちゃウルさい。しかもこうやって可視化してみて気づいたのですが、画像上でも人間の耳で実際に聞いても40秒は鳴り響いています。長いよ。

Googleで調べてみると救急車のサイレン音は法律で「960 Hz と 770 Hz を 1.3 秒ごとに繰り返す音」と規定されているようです。確かに救急車のサイレンが聞こえる時間帯を拡大してみると960 Hz付近と 770 Hz付近には、以下の図のように交互に音が強く出ています。

960 Hz付近と770 Hz付近で交互に出る音

960 Hz付近と770 Hz付近で交互に出る音

「おいおい、だったらAIなんか使わずに、最初から960Hz と 770Hz の音が1.3秒ごとに繰り返されている部分をif文の条件設定などで救急車が来ているかどうか判定すればよいのでは?」と思いますよね。

しかし、可視化する前の生の数値データを見ながら、手作業による条件設定だけで色々な救急車の音を漏れなく・間違いなく判定できるかどうかやってみましたが、うまくいきませんでした。
実際に録音されたデータは960Hz と 770Hz以外のところにも音が出たりしていることがありますし、完全に交互に記録されているわけでもありません。音が小さい部分だと切れ切れになっているところもあります。

たとえば、可視化したときに、以下のようになっている部分は人間が聞けば救急車のサイレン音と認識できますが、条件設定ではきれいに切り抜けませんでした。この部分だけを切り抜くような条件設定は可能ですが、他の救急車が来ていない時間帯に反応してしまったりして正確性に欠けます。

960 Hz付近と770 Hz付近で交互に出る音(2)

960 Hz付近と770 Hz付近で交互に出る音(2)・・完全に交互ではないし周波数分布もぼやけている

このような少し曖昧な条件でも認識してしまうのがAIの素晴らしいところなので、やっぱりAIで学習させることにしましょう。

他にも特徴・違和感のある画像を探す

他に画像を目で確認していったところ、以下のような画像もありました。なんだこれは?
画像で見ただけでも、単なる車の走行音ではなく、何か人工的な音の感じがします。

可視化画像の拡大図(3)

可視化画像の拡大図(3)

可視化画像の拡大図(3)の拡大図

可視化画像の拡大図(3)の拡大図・・あやしい部分


この画像の実際の音を聞いてみましょう。

なるほど。消防車と救急車が一緒に走っているんでしょうか? 別のサイレンが響き渡っていますね。

可視化した画像を人の目で確認し救急車の往来の回数をカウント

可視化してみて分かったのが、1日分288枚の画像の中で、このような線が出ている回数を目で見て数えれば、救急車が家の前を何回通ったかはわかるということですね。まずはAIを使わず、人間がチェックしてみましょう。

・・・数えてみました。2021年8月24日は19回、8月25日は18回。マジかよ。うるさいわけだ。

時間別救急車出現回数

都内某所の時間別救急車のサイレン音検知回数

長くなったので今回はここまで。
次回はいよいよ、AIに救急車の音を学習させます。

AIで救急車のサイレン音を解析し救急車の往来回数をカウントしよう(2)
AIで救急車のサイレン音を解析し救急車の往来回数をカウントしよう(3)

テレビ会議・オンラインセミナーのスライドをAIが自動スクショするPCソフト

最後に少しだけ宣伝をさせてください。
テレビ会議やオンラインセミナーでスクショ撮りに忙しかったことはありませんか?

Summary Shots は、弊社 Tokyo Properties で開発したPCアプリケーションです。
AIが画面の変化を自動で検知してpngフォーマットのスクショを撮ってくれるので、会議中にマウスでスクショをとってファイル名を付けるといった作業から完全に開放されます。同時にmp3で音声も録音してくれます。さらに付属の再生ソフトでスクショ画像と音声を同期し、最大4倍速で再生することができるため、会議の振り返りも短時間にできます。

Summary Shotsの動作イメージ

Summary Shotsの動作イメージ

ZOOM、Teams、YouTube Live などどのような会議システムにも対応しています。
無料体験版もありますので、ぜひお試しください。

タイトルとURLをコピーしました