自動音声検出レコーダを作ってみた
某コミュニティ放送局からの依頼で、音声検出機能付きのレコーダーを作ってみた。
技術的な要件
先方が言うにはこんな要件
・音声を検出して録音開始、および終了
・録音した音声をファイルとして保存
録音開始と一時停止ならけっこうアプリが見つかるのだけど、録音終了から保存を実施してくれるものが見つからなかった。それと、Windowsはたまに「勝手にリスタート」しやがるので、できれば使いたくないというのもあって、「無いなら作ったるわ。Raspberry Piでな」ということで、作ってしまうことに。
大雑把な仕様
と言った感じで今回用意したのはこんな感じ。
・Raspberry Pi 4B(2GBモデル)
・BEHRINGER UCA202 オーディオインターフェース
・Raspberry Pi OS
・python3.10
特にGUIが必要なアプリでもないので、ターミナル(Windowsでいうコマンドプロンプト)内でCLIで動かすことに。
動かしてみた
そんなわけで、Visual Studio Codeでちまちまとコーディング。ちなみに本作がわたしにとってpython仕事デビューだったりする。ほぼ初めてちゃんと触ってみたけど、pythonってけっこういろいろできるし、モジュール突っ込めばなんとかなる的な要素もあって結構楽しい。こういん時、インターネットの海に放流されている先人の知恵はありがたい。とはいえ、pyaudioとか一般的なモジュールしか使わないので、それほど苦労もなく完成。ただし、完全に沈黙しているのもなんなので、録音開始時と終了時にそれぞれインジケーターを表示させることと、デッドマン装置として、待機中は現在時刻を秒単位で表示し続けることとした。万が一プロセスが止まっている場合、この時計表示も止まるので、まーわかりやすいかな、と。
あと、起動直後に本体に認識されているすべてのオーディオデバイスをパースするため、エラー吐きまくりなんだけどこれはあとで修正することに。そんなわけでできた画面がこちら。
サーバーに転送する機能もつけてみたった
要求としては、録音して生成されたファイルは、ホームページで再生できるようにしたいらしいので、「じゃー転送まで自動化しましょう」ということで、ファイルをローカルに保存した後、サーバーにも転送することに。
探してみたら、paramikoとかいうモジュールを追加することでpythonでもsftpできるらしいのでこれを利用することに。ただ、自動でsftpするっていうのは、IPとパスワードを決め打ちしてコードに書かなきゃいけないわけで、セキュリティてきにはかなりアレ。このへんは後日サーバーとの間にVPNでも張るかなーと検討中。そして、転送した結果がこれ。
録音開始時刻がファイル名になった.wavがちゃんと転送されてきている。ちなみにlatest.wavは、最後に転送されてきたファイルと同じもの。ひとまずRaspi側で同じファイルをファイル名だけ変えて2回転送するというアタマの悪い方法で実装。このへんもサーバ側で何とかする予定。
ちなみになんでlatest.wavが必要かというと、ホームページで再生ボタン押したときに直近に保存されたファイルを再生させたいため。
そんなわけで
「とりま、うごく」という状況にはなったのでサンプルとして出荷。すると同時にもう少しブラッシュアップして本納品につなげたいなと思ってる次第。
あ、コードはお恥ずかしいので掲載しません(汗