リビングルームの騒音の大きさを記録する

 スマートホーム化計画の一環。
 リアルタイムで解析するとかっこいいけど、定期的に録音して、そのファイルを解析すればいいと考えた。

 ファイルの解析はsoxでできるらしい。
blog.monophile.net

 録音はマイクを接続すれば簡単、のはずだった。
 まずはマイクを調達。ダイソーにイヤホンマイクがあったが、4極プラグが使えるか不安だったのでハードオフに行って調達。300円+消費税。3極プラグでええのかなと思ったが、他のPC用マイクも3極プラグだったのでええのかなと。
 その場で「NEC マイク」でgoogle画像検索し、かつてのPC98シリーズの付属品だと判明した。

 さっそくおうちサーバに接続。が、いきなりトラブル。arecord -lでサウンドディバイスがないと怒られてしまう。
  cat /proc/asound/cardsではディバイスが表示される。いろいろ悩んでたどり着いたのがこれ。
www.raspberrypi.org

 追加前にsudo arecord -lしてみたらディバイスが表示された。audioグループに追加してみたら期待通りディバイスが表示された。

 もう一つのトラブルは、いざ録音してみてもなにも録音されていない。結論としてはalsamixerでゲインを適当に設定したら録音された。ディバイス認識不能対策を検索していた時にalsamixerの罠も読んでいたのにすっかり忘れていた。

 で、phpスクリプト化

<?php
$tempfile = __DIR__. "/temp.wav";
exec("arecord -d 5 $tempfile 2>/dev/null");
$response = `sox $tempfile -n -S stats 2>&1`;
if(preg_match("/RMS Pk dB +([\-\.0-9]+)/",$response,$temp) == 1){
	$noise = $temp[1];
}

?>

 5秒録音してそのファイルを解析。ログ部分は省略。
 複数の入力ディバイスがある場合はarecord -lの出力からディバイス番号を取得してarecordの-Dオプションで渡す必要な場合があるかもしれない。
 arecord の標準エラー出力を捨てるのは、cronで動かした時に毎回エラーメールが来るのを防ぐため。soxは情報を標準エラー出力に表示する(標準出力はパイプ渡しなどに使うため音声用になっている)ので、それをバックティック演算子で取り込むために標準出力に出力する。