ラズパイでUSBマイクによる録音
Page content
目的
ラズベリーパイを用いて音声認識を用いた電子工作で遊んでみたいと思う。
事始めとしてUSBマイクを認識させ、音声を録音する手順について整理する。
実験環境
- Raspberry Pi 4B(8[GB]版)
- Raspberry Pi OS Lite(64bit 2022-09-22リリース版)
- Amazonの安価なUSBマイク 試したのはコレ
USBマイクの設定
まずデバイスを認識しているか確認する。
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 08bb:2902 Texas Instruments PCM2902 Audio Codec
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
今回試した環境ではUSBマイクは
Bus 001 Device 004: ID 08bb:2902 Texas Instruments PCM2902 Audio Codec
で認識されていることがわかる。このデバイスで録音したい訳であるが、音声系のデバイスには使用する優先度が存在するらしい。下記コマンドでUSBマイクの優先度を確認できる。
$ cat /proc/asound/modules
0 snd_bcm2835
1 vc4
2 vc4
3 snd_usb_audio
この数値が小さいほど優先度が高いのでUSBオーディオの優先度が低いのでこれを最上位とする。優先度の設定ファイルは
/etc/modprobe.d/alsa-base.conf
というものを新規作成すれば良い。このファイルに以下のような内容を記載する。
$ sudo vim /etc/modprobe.d/alsa-base.conf
+ options snd slots=snd_usb_audio,snd_bcm2835
+ options snd_usb_audio index=0
+ options snd_bcm2835 index=1
設定は再起動すると有効になるので再起動し、その後設定を再確認する。
$ sudo reboot
...
$ cat /proc/asound/modules
0 snd_usb_audio
1 snd_bcm2835
2 vc4
3 vc4
無事USBオーディオの優先度が高くなっている。
USBマイクによる録音
USBマイクの設定が完了したので録音にチャレンジする。録音用のコマンドはデフォルトで用意されている「arecord」を使用する。 まずコマンド上では何番でUSBマイクが認識されているのかを確認する。
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
この結果から今回試した環境では「カード:0」「デバイス:0」と分かる。この情報は録音するときに指定する。 今回は下記のようなオプションをつけて実験を行う。
$ arecord -D plughw:0,0 -d 10 -f cd test.wav
- plughw:0,0 : 録音デバイスの指定 0,0 は先述のカード番号とデバイス番号を示す
- -d 10 :録音時間を指定、今回は10秒
- -f cd :録音フォーマットを指定、今回はCD音源仕様(ステレオは意味ない?)
wavファイルが生成されるので、これを母艦に移動し再生する。
感度調整
実験環境では録音はできているが明らかに音が小さかった。そこで感度を調整する。 マイク感度の設定はデフォルトで用意されている「amixer」というコマンドを使用することで設定できる。
$ amixer sset Mic 16 -c 0
Simple mixer control 'Mic',0
Capabilities: cvolume cvolume-joined cswitch cswitch-joined
Capture channels: Mono
Limits: Capture 0 - 16
Mono: Capture 16 [100%] [23.81dB] [on]
- 16 : この数字はマイクによって異なる、実験環境だと[0-16]の範囲、16で最大感度
- -c 0 : 「arecord -l」で取得したカード番号を指定する