🎤
Raspberry Piで長時間&連続的に音声を録音する
はじめに
諸事情により、長時間&連続的な録音を行う必要があり、Raspberry Piで実現できましたので簡単にメモしておきます。
機材
今回使用した機材は以下の通りです。Linuxが動作する環境、USBオーディオデバイスとして認識されるマイクであれば何でも大丈夫と思います。
環境
OSとしてはLinux、ディストリビューションとしてはRaspbianを使用しました。
随分前にセットアップしたままの環境を流用しました。(なのでRaspberry Pi OSではないです)
yuya@raspi$ uname -a
Linux raspi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux
yuya@raspi$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
yuya@raspi$ grep Model /proc/cpuinfo
Model : Raspberry Pi 4 Model B Rev 1.2
yuya@raspi$ free
total used free shared buff/cache available
Mem: 3999784 295492 293316 210820 3410976 3342120
Swap: 102396 102396 0
事前準備
Raspbianで録音する場合、録音を行うユーザがaudio
グループに属す必要があります。
yuya@raspi$ sudo adduser yuya audio
yuya@raspi$ id yuya
uid=1001(yuya) gid=1001(yuya) groups=1001(yuya),27(sudo),29(audio),44(video),995(docker)
録音デバイスの確認
録音はarecord
コマンドで行います。-l
オプション、-L
オプションで録音デバイスを一覧し、対象のデバイスが認識されていることを確認します。
yuya@raspi$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: USB [WordForum USB], device 0: USB Audio [USB Audio]
Subdevices: 0/1
Subdevice #0: subdevice #0
yuya@raspi$ arecord -L
...
hw:CARD=USB,DEV=0
WordForum USB, USB Audio
Direct hardware device without any conversions
plughw:CARD=USB,DEV=0
WordForum USB, USB Audio
Hardware device with all software conversions
連続録音
連続した録音を行うコマンド例は以下の通りです。
yuya@raspi$ arecord --device "plughw:CARD=USB,DEV=0" --channels 1 --format S16_LE --rate 22050 --max-file-time 60 --use-strftime "%Y%m%d/%Y%m%d_%H%M%S_%v.wav"
オプションの意味は以下の通りです。
-
--device "plughw:CARD=USB,DEV=0"
: 録音デバイスを指定します。 -
--channels 1
: 録音するチャネル数を指定します。モノラルなので1
を指定しています。 -
--format S16_LE
: フォーマットを指定します。この例では、符号あり16ビット、リトルエンディアンを指定しています。 -
--rate 22050
: サンプリング周波数を指定します。この例では22,050Hzを指定しています。 -
--max-file-time 60
: 1ファイルあたりの最大サイズを秒単位で指定します。この例では60秒を指定しています。 -
--use-strftime "%Y%m%d/%Y%m%d_%H%M%S_%v.wav"
: 出力するファイル名をstrftime
の書式で指定します。%v
には連番が出力されます。また、ディレクトリは自動的に生成されます。
上記の例では、60秒毎にWAVE形式のファイルが出力され、ファイル名は
20210312/20210312_235548_01.wav
20210312/20210312_235648_02.wav
- ...
といった感じになります。
残念ながらstrftime
の%N
は使用することができなかったため、秒より高い精度の情報を出力することはできませんでした。(本当はミリ秒単位で開始時間を出力したかったのですが・・・)
ファイルサイズ
計算上のファイルサイズは「2バイト(16ビット)×22050Hz×60秒」で2,646,000バイト(約2.6MB)となります。
実際に出力されたファイルサイズはどれもピッタリ2,646,044バイトで、差分の44バイトはWAVE形式のヘッダ分かと思われます。
最後に
上記の方法で、今のところ連続6日弱(ファイルサイズにして16GBほど)の連続録音が行えています。
何かの参考になれば幸いです。
Discussion