今日も微速転進

ここではないどこかへ

PythonとPmodのマイクモジュールで玄関のチャイムの音を検知する


スポンサーリンク

ラズパイコンテストの応募ネタです。しょぼいけど動いたので。

背景

難聴による聴力低下が進むと玄関のチャイムの音が鳴っても聞こえない、または聞こえづらいという問題が発生する。

補聴器というソリューションも存在するが、一日中補聴器を装用しているわけではない。玄関のチャイムそのものをワイヤレスタイプや光で通知するタイプに交換するということも考えられるが、借家等の事情により必ずしも適切とは言えない。

玄関のチャイムそのものを改造せず、玄関のチャイムの音を検知するプログラムにより難聴者のQoLを改善することを目指す。

なお、健常者に置いてもなにかに没頭していて玄関のチャイムが鳴ったことに気づかないということは充分あるので健常者にとっても有益なはずである。

前提

f:id:atuyosi:20180910220631j:plain:w480

過去記事で紹介しているマイクモジュールを使う。

a244.hateblo.jp

ラズパイはRaspberry Pi 3 model B+。別にGPIOピンヘッダがハンダ付けされていればPi Zero Wでも問題ない。

ただし、マイクは安いUSBマイクでは感度が良くないのでMEMSタイプか、設置位置を考慮する必要がある。

事前調査

USBのマイクで玄関のチャイムの音を録音してAudacityで分析してみる。

arecordコマンドで録音する。さすがにデフォルトの8,000Hzはどうかと思うので、CD音質で録音してみます。音質を下げるのは難しくないので。

$ arecord -D plughw:1,0 -f cd  mic.wav

-f cdで録音フォーマット(サンプリング周波数、ビット数)を指定しています。このオプションを省略すると8,000Hz、8bit。ステレオである必要性はないです……。

f:id:atuyosi:20180910195404j:plain:w480

ローパスとハイパスフィルタでノイズ除去、正規化を施す。

f:id:atuyosi:20180910194231j:plain:w480

ものすごくざっくりだが2,000Hzあたりの周波数の成分を検出すれば良いという仮定でやってみる。

方針

残念ながらマイクモジュールの信号をWAV形式に落とし込む方法がわからないのでマイクからの信号値変動幅で判定する。

一定時間内にしきい値を一定回数超えたら玄関のチャイムがなったとみなす。

2,000Hzということなので0.5ミリ秒以下でサンプリングすればいいはず。

準備

SlackのIncomming Webhockを使えるようにする。

  1. WorkspaceのApp管理ページへ移動する(もしくはhttps://slack.com/appsから遷移する)。
  2. 上段にある検索ボックスに"incoming"と入力して検索
  3. 「設定を追加」をクリックする
  4. 画面の表示に従って必要なパラメータを入力
  5. 投稿用のURLをコピーしておく

api.slack.com

環境変数Pythonスクリプトと同じディレクトリの.envというファイルに書き込む。

SLACK_HOCK_URL=https://(省略)

各種モジュール

プログラム側に環境変数経由で投稿用のURLを渡すのでdotenvをインストール。

$ pip install python-dotenv
$ pip install slackweb
$ pip install designspark.pmod

なお、Pythonのバージョンは3.5.3。

Pythonスクリプト

マイクモジュールからの入力値が一定時間内にしきい値を超えたら通知するスクリプト

こんなので動くのかって感じだけど動きました。

大きな音に反応したり、センサ本体が物理的に揺れたりしたときも電圧値が変化します。

センサの接続部がゆるいのも不安定な要因の一つっぽいです。

実行した様子

Slackのおかげで超お手軽。

$ python3 detect_sound_and_notify.py > /dev/null 2>&1

実際は実行し続ける必要があるのでtmux上で起動してセッションをdetach。

通知

f:id:atuyosi:20180910215159j:plain:w480

メッセージ

f:id:atuyosi:20180910215222j:plain:w480

課題など

  • パラメータの調整が不十分
  • 設置位置とマイク感度に応じた調整
  • Slack以外の通知手段
  • 部品がむき出し……

チャイムの音を人工知能に学習させればよかったのでは……。

ALSA経由で使えるマイクモジュールの方が良かったかも。

感想

少しばかり難しく考えて途方に暮れましたが、センサから値で音がなったかは検知できているので妥協しました。

理想を言えば、チャイムの音の周波数成分を分析して人工知能でいい感じにできると誤検知が減るはずです。 しかしながら、そもそもセンサの入力値をPCM形式のような音として扱える形式にする方法がわかりませんでした。

alsa - How to recording audio file with PMod mic3 on Raspberry PI? - Stack Overflow

動いたので良しとしましょう。

何より提供いただいたPmod HATの返却義務を回避できたはずなので。

広告