🎤

Raspberry Piで長時間&連続的に音声を録音する

2021/03/13に公開

はじめに

諸事情により、長時間&連続的な録音を行う必要があり、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