海の響きを懐かしむ

観たもの聴いたもの読んだものの記録と、日記など

標準偏差を使って音量から人の気配を察知する

AudioInput.java — Gist

マイクから音量を取って、人間の気配を察知させるプログラムの改良をした。いままで決めうちの閾値でやってたのをやめて、以下のページを参考に、過去の差分から標準偏差を取るやり方を試してみた。

Java:合計、平均、標準偏差、中央値、最頻値を求める:しゃくれアゴに幸あれ:So-netブログ
時系列分析による異常検知入門

起動すると、音量を毎秒取得して、日付・時間・取得音量・標準偏差値・気配の有無の順にcsv出力する。起動後の最初の20秒間は音量の平均値を出して、その後は毎秒標準偏差値を出している。標準偏差を出すには鈍感さを予め決めておく必要があって、上のコードだと88行目の「2.0」がそれにあたる。これをいろんなところで回して、tail -fしてどれくらいの数字がとれるか調査している。鈍感さを、居る場所によって何度も変えながらチューニングしてみたところ、2.0より1.8か1.9くらいが精確な気がした(がやがやした教室で回すと、割と頻繁に気配を察知する)。でもORFでデモする場合、もっと騒がしいはずなので、鈍感さを高めにして比較的うるさい場所でデータを取ってみる必要がある。

それからシステム自体の設計についてだけど、本番機であるmac miniで一週間ぶんまわしてみたところ、落ちることなくデータがとれていた。これを今度は本番のプログラム(XMPPの通信部分も含む)に組み込んで、変な落ち方をしないか確かめたい。

#ちなみに音量でやってると、TVの音とか拾っちゃうじゃん、って言われるんだけど、少なくともMacbookの内蔵マイクの場合、意外とそういう音は拾わない。強くタイピングしたときや、声を出したときに反応することが多くて、指向性?の問題なのかな、意外と大丈夫。でも実験は外付けマイクでやるので、USBマイクか、iPhone用のイヤホンマイクのどちらかを使おうと思う。