194円(送料込み)のマイクと Raspberry Pi でボイスレコーダーを作る話し

はじめに

  原因不明のサーバーのダウンが頻発すると厄介です。ログから分かる事は突然にシャットダウンシーケンスが走り始めたという事だけなので、おそらく 瞬間的な電圧の低下 とか 高周波のノイズが電源基盤に入った とか何かそいいう 物理的な要因 なのだろうと思うのですが、そういえばサーバ室って高周波研と薄いパーティション挟んだだけの隣だし... でも僕らはソフト屋なので電気の理屈なんてよくわからないし...

 こういう時は、まず 現場・現物をよく観察 すると 予想外のヒント が見えてくる事が、ドラマだけでなく 現実の問題 でもよくあります

先輩A 「このボタン、軽くなら大丈夫だからちょっと押しちゃおうぜ!」
後輩B 「えー、まずいっしょそれ」
先輩A 「大丈夫、元気があれば何でも出来る!ダーッ!」

ぷちっ!
......

 最近だと 飛行機もどんどん安全になってきていて 人為的な理由が墜落理由の大きな割合をしめるようになってきているそうですが、ナショジオでメーデーとか見てるとこういう時に大活躍するのが ボイスレコーダーですね

 その昔、特許まとめの会で上記事案を勘案して 「サーバーのスイッチ周りにボイスレコーダーを設置する」というアイデアを出して特許部の怖い人に 「アマチュア発明家のアイデアみたいなのでノルマ件数稼ぎしようとするな!」と叱られた若き日の思い出も甘酸っぱく、つきましては ボイスレコーダーを作ってみようと思った次第です

194円(送料込み)のUSBマイク

 購入当時(2016年1月5日)は 送料込みで194円だったUSBマイク横浜市営地下鉄の初乗りよりも安いお値段が嬉しいです。これだと仮に届いた物がうまく使えなかったとしても、 新横浜から渋谷にでようとして間違えて地下鉄に乗った程度の損害ですみます

 1月5日にぽちって1月25日に届いたのがこちらです
 スクリーンショット 2016-01-29 13.21.28.png

すごく小さくて軽いです。本当に動くのか、この黒い部分の中に本当になにかはいっているのか心配になるレベルの シンプルで美しい構造 です

組み立て

という程たいそうなものではなく、マイクを Raspberry Pi のUSB ポートに挿すだけです
スクリーンショット 2016-01-29 13.58.59.png

基本設定(実は不要)

後で御説明致しますが、時々発生する数百ミリ秒程度の音飛び(ボイスレコーダーとしての機能には我慢できる範囲だと思うのですが)を気にしないのであればソフトウェアの設定は全く不要なので興味がなければこの章は読み飛ばしていただいても大丈夫です

Raspberry Pi (Raspbian は jessie でも jessie lite でもどっちでもいいです)に挿して lsusb で確認してみると嬉しいことにちゃんと認識されていて中身は C-Media の CM108 みたいです。

スクリーンショット 2016-01-29 11.44.03.png

ここで、時々(例えば音声認識させたい時とか)に問題になるサウンドデバイスとして認識される順番ですが、そのままだとやっぱり snd_bcm2835 に負けて二番目になります

スクリーンショット 2016-01-29 11.44.40.png

でも、単にボイスレコーダーとしてつかうのであれば snd_usb_audio は二番目のまま で問題はないです。
別に1番をめざさなくても2番のままでいいなんて、なんという朗らかさなのでしょう

※尚、今回は関係ないですがこちらのファイルでこのマイクの snd_usb_audio はトップにできることを確認しております

録音

arecord -l で見ても下記のようにカード番号1、デバイス番号0 です

スクリーンショット 2016-01-29 11.45.13.png

そこで、下記のようなコマンドで 8ビット 8KHz のモノラルで録音を始めます。丁度、昔の電話(G.711)の音質ですね

録音コマンド
arecord -D plughw:1,0 test.wav

これを /etc/rc.local とかに書いておくと起動後勝手に録音をはじめてくれるので便利です

スクリーンショット 2016-01-29 13.45.58.png

無圧縮なのでうるさかろうが静だろうが 毎秒8kByte ずつ test.wav ファイルが育っていくのですが、1分間で480kByte、一時間で 28.8 MByte、一日で 691.2 MByte、 一週間録音しっぱなしでも 4.6 GByte なので、 無圧縮でも 8GByte の SDカード一枚で一週間もちます。もちろん ffmpeg とかで圧縮するとさらに良いかと思いますが、ffmpeg はかなり CPU をまわしてしまうのでバッテリー駆動だと逆に連続録音時間を縮めてしまう可能性なども総合的に勘案する必用がございます

録音ボリューム調整

ボリューム調整でもカード番号の 1を明に -c オプションで指定して

ボリューム調整
amixer sset Mic 16 -c 1

このマイクは 0 - 16 の16段で調整が可能なようで、16が最高感度のようです

見た目の通り あまり感度は良くなく、マイクの側で話さないと拾ってくれないのですが、逆に余計な音をあまり拾わないのでかえってよいかも

再生

デフォルトの設定だと Raspberry Pi を HDMI でテレビとつなぎ

再生コマンド
aplay test.wav 

でテレビのスピーカーから再生されるようです

jessie lite のデフォルトだとテレビはこういう感じの画面かと思いますがここから音がでます

※当然なのですがイヤホンを挿せばイヤホンから再生されます

スクリーンショット 2016-01-29 13.21.38.png

音飛び対策

ここまで組み立てもなにもなし、ソフトの設定も不要と好い事づくめだったのですがちょっと残念な事に長時間録音していると下記のように時々音が飛びます

スクリーンショット 2016-01-29 12.40.07.png

これはファイルシステムとSDカードの組み合わせによるcpuのストールが原因で、ext4 や FAT よりもさらに速いXFSを使うとこの現象はおきなくなるとのことでした。
そこで、下記のように gparted 等で XFS のパーティションを作って、そこに録音する事にします

スクリーンショット 2016-01-27 10.12.45.png

尚、以前もこちらこちらで少しご紹介させていただいたのですがRaspbian の SD カードのパーティションの操作は PC よりも Raspberry Pi 自体で おこなったほうが準備の手間等が楽ですし、失敗して 大事な PC の HDD を壊す 心配もないです

  SDカードスロットに挿している SD のパーティションをいじることは無理なので、下記のように USBカードリーダー を用意し、パーティションを操作したい SD カードを USBカードリーダーに挿して別の SD カードで起動した Raspberry Pi から編集すると楽です。この時、USBカードリーダー上の SD カードは /dev/sda として上記写真のようにパーティションを操作 することができます

スクリーンショット 2016-01-29 17.02.45.png

XSF に録音すると確かに音飛びがなくなりました。すばらしい

結び

 ボイスレコーダーを用意する時は一言その旨ことわっておくほうが職場の人間関係が悪くならなくていいと思います。「君たちを疑ってるわけではないんだけど」などといういささか見え透いて感じる言い訳でも、一言あるだけで不思議とソフトな雰囲気になります

related works

というかすでに Raspberri Pi にマイクを設定して音声認識をさせる先行事例の紹介が文献4文献5など沢山ある中で、本稿には全然進歩性がなく、むしろ使い方として退行してますし...

単に安いマイクが使えました、という紹介ぐらいの意味しかなかったと思います。どうもすみません ^^;;;

references

  1. 194円の USB マイク eBay のサイトです

  2. Raspbian Jessie で usbマイクの優先順位を上げる方法 本稿では関係ないとことわりながら上で補足した gist の元ネタです。jessie になって 設定方法がかわりました

  3. Raspbian への xfs のインストール

  4. Raspberry Pi で音声認識 ALSA のコマンド等を勉強させていただきました。大変参考になりました

  5. 簡単にできる!音声認識と音声合成を使ってRaspberrypiと会話 ALSA のコマンド等について勉強させていただき大変参考になりました。どうもありがとうございました

futur works

ちなみにこのマイクでも音声認識の入力には十分でしたので、その旨あわせてご報告させていただきます