はじめに
本文章では、Raspberry Piのヘッドフォン(イヤホン・ジャック)やUSBマイクの使用方法について記載します。
Raspberry Piでは音声の再生や録音するため、「Advanced Linux Sound Architecture(ALSA)」が使用されています。ALSAは、当初、Linuxで利用されていた「Open Sound System(OSSv3)」を置き換えるために開発されたコンポートです。カーネルドライバーと直接やり取りすることなく、カーネルドライバーの機能を利用できる高機能なAPIが提供されています。
実行環境
- ボード
Raspberry Pi 4 Model B - OS
Raspberry Pi OS Lite
Release date: May 3rd 2023
System: 32-bit
Kernel version: 6.1
Debian version: 11 (bullseye)
再生用デジタルオーディオデバイスの設定
ハードウェア・モジュールの認識確認
ハードウェア・モジュールとして、サウンドカードとデジタルオーディオデバイスが認識されているかは、以下のコマンドで確認することができます。
pi@raspberrypi:~ $ cat /proc/asound/modules
0 snd_bcm2835
1 vc4
2 vc4
pi@raspberrypi:~ $ lsmod | grep snd
snd_soc_hdmi_codec 20480 2
snd_soc_core 274432 2 vc4,snd_soc_hdmi_codec
snd_bcm2835 28672 0
snd_compress 20480 1 snd_soc_core
snd_pcm_dmaengine 20480 1 snd_soc_core
snd_pcm 139264 5 snd_bcm2835,snd_soc_hdmi_codec,snd_compress,snd_soc_core,snd_pcm_dmaengine
snd_timer 36864 1 snd_pcm
snd 106496 6 snd_bcm2835,snd_soc_hdmi_codec,snd_timer,snd_compress,snd_soc_core,snd_pcm
pi@raspberrypi:~ $
「snd_bcm2835」が、「0番」(1番目)のサウンドカードとして認識され、「snd_pcm」と「snd」に関連づけられていることが分かります。
再生用デジタルオーディオデバイスの認識確認
再生用デジタルオーディオデバイスを確認するには、ALSAコマンドの「aplay」を使用して確認することができます。
「aplay -l」コマンドを使用すると、すべてのサウンドカードとデジタルオーディオデバイスを一覧表示することができます。
pi@raspberrypi:~ $ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones]
Subdevices: 8/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
Subdevice #7: subdevice #7
card 1: vc4hdmi0 [vc4-hdmi-0], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: vc4hdmi1 [vc4-hdmi-1], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
pi@raspberrypi:~ $
ヘッドフォン(イヤホン・ジャック)が、「card:0、device:0」として、認識されていることがわかります。
「aplay -L」コマンドを使用すると、ALSAで定義されているすべての PCM(サウンドデバイス) を一覧表示すができます。
pi@raspberrypi:~ $ aplay -L
null
Discard all samples (playback) or generate zero samples (capture)
hw:CARD=Headphones,DEV=0
bcm2835 Headphones, bcm2835 Headphones
Direct hardware device without any conversions
plughw:CARD=Headphones,DEV=0
bcm2835 Headphones, bcm2835 Headphones
Hardware device with all software conversions
default:CARD=Headphones
bcm2835 Headphones, bcm2835 Headphones
Default Audio Device
sysdefault:CARD=Headphones
bcm2835 Headphones, bcm2835 Headphones
Default Audio Device
dmix:CARD=Headphones,DEV=0
bcm2835 Headphones, bcm2835 Headphones
Direct sample mixing device
hw:CARD=vc4hdmi0,DEV=0
vc4-hdmi-0, MAI PCM i2s-hifi-0
Direct hardware device without any conversions
plughw:CARD=vc4hdmi0,DEV=0
vc4-hdmi-0, MAI PCM i2s-hifi-0
Hardware device with all software conversions
default:CARD=vc4hdmi0
vc4-hdmi-0, MAI PCM i2s-hifi-0
Default Audio Device
sysdefault:CARD=vc4hdmi0
vc4-hdmi-0, MAI PCM i2s-hifi-0
Default Audio Device
hdmi:CARD=vc4hdmi0,DEV=0
vc4-hdmi-0, MAI PCM i2s-hifi-0
HDMI Audio Output
dmix:CARD=vc4hdmi0,DEV=0
vc4-hdmi-0, MAI PCM i2s-hifi-0
Direct sample mixing device
hw:CARD=vc4hdmi1,DEV=0
vc4-hdmi-1, MAI PCM i2s-hifi-0
Direct hardware device without any conversions
plughw:CARD=vc4hdmi1,DEV=0
vc4-hdmi-1, MAI PCM i2s-hifi-0
Hardware device with all software conversions
default:CARD=vc4hdmi1
vc4-hdmi-1, MAI PCM i2s-hifi-0
Default Audio Device
sysdefault:CARD=vc4hdmi1
vc4-hdmi-1, MAI PCM i2s-hifi-0
Default Audio Device
hdmi:CARD=vc4hdmi1,DEV=0
vc4-hdmi-1, MAI PCM i2s-hifi-0
HDMI Audio Output
dmix:CARD=vc4hdmi1,DEV=0
vc4-hdmi-1, MAI PCM i2s-hifi-0
Direct sample mixing device
pi@raspberrypi:~ $
再生用デジタルオーディオデバイスを使用した再生
再生用デジタルオーディオデバイスは、「speaker-test」コマンドを使用して確認することができます。再生用デジタルオーディオデバイスを指定せず、コマンド実行すると、デフォルトの再生用デジタルオーディオデバイスを使用して再生されます。
「-c」オプション:チャンネル数を指定します。(2:ステレオ)
「-t」オプション:wavファイルを指定しています。
pi@raspberrypi:~ $ speaker-test -c 2 -t wav
pi@raspberrypi:~ $
【補足】
デフォルトで使用する再生用デジタルオーディオデバイスを指定していませんが、イヤホン・ジャックから再生されたと思います。これは、ALSAでは、明示的にデフォルトで使用するデジタルオーディオデバイスを指定していない場合、「card: 0、device: 0」のデジタルオーディオデバイスが使用されるためです。
「aplay -l」のコマンド実行結果から、「card: 0、device: 0」のデジタルオーディオデバイスが、たまたま、ヘッドフォン(イヤホン・ジャック)だったため、再生できたわけです。
明示的にデフォルトで使用する再生用デジタルオーディオデバイスの指定方法については、USBマイクの項目に記載します。
録音用デジタルオーディオデバイスの設定
USBマイク
本文章では、以下のUSBマイクを使用しました。
・SANWA SUPPLY MM-MCU06BK(サンプリングレート:48kHz、解像度:16bit)
USBデバイスの認識確認
接続したUSBマイクがUSBデバイスとして認識されていることを確認するには、「lsusb」コマンドを使用して確認することができます。
【USBマイクの接続前】
pi@raspberrypi:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $
【USBマイクの接続後】
pi@raspberrypi:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0d8c:2800 C-Media Electronics, Inc. USB Microphone
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $
USBマイクが、「Bus 001 Device 003: ID 0d8c:2800」で認識されていることが分かります。
ハードウェア・モジュールの認識確認
ハードウェア・モジュールとして、サウンドカードとデジタルオーディオデバイスが認識されているかは、以下のコマンドで確認することができます。
pi@raspberrypi:~ $ cat /proc/asound/modules
0 snd_bcm2835
1 vc4
2 vc4
3 snd_usb_audio
pi@raspberrypi:~ $ lsmod | grep snd
snd_usb_audio 303104 0
snd_hwdep 20480 1 snd_usb_audio
snd_usbmidi_lib 32768 1 snd_usb_audio
snd_rawmidi 40960 1 snd_usbmidi_lib
snd_seq_device 16384 1 snd_rawmidi
snd_soc_hdmi_codec 20480 2
snd_soc_core 274432 2 vc4,snd_soc_hdmi_codec
snd_bcm2835 28672 0
snd_compress 20480 1 snd_soc_core
snd_pcm_dmaengine 20480 1 snd_soc_core
snd_pcm 139264 6 snd_usb_audio,snd_bcm2835,snd_soc_hdmi_codec,snd_compress,snd_soc_core,snd_pcm_dmaengine
mc 61440 8 videodev,bcm2835_codec,snd_usb_audio,videobuf2_v4l2,videobuf2_common,rpivid_hevc,v4l2_mem2mem,bcm2835_isp
snd_timer 36864 1 snd_pcm
snd 106496 11 snd_seq_device,snd_hwdep,snd_usb_audio,snd_usbmidi_lib,snd_bcm2835,snd_soc_hdmi_codec,snd_timer,snd_compress,snd_soc_core,snd_pcm,snd_rawmidi
pi@raspberrypi:~ $
「snd_usb_audio」として、認識されていることが分かります。「snd_usb_audio」が、「3番」(4番目)のサウンドカードとして認識され、「snd_pcm」や「snd」に関連づけられていることがわかります。
録音用デジタルオーディオデバイスの認識確認
録音デバイスを確認するためには、ALSAコマンドの「arecord」を使用して確認することができます。
「arecord -l」コマンドを使用すると、録音(capture)用のすべてのサウンドカードとデジタルオーディオデバイスを一覧表示することができます。
pi@raspberrypi:~ $ arecord -l
**** List of CAPTURE Hardware Devices ****
card 3: Microphone [USB Microphone], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
pi@raspberrypi:~ $
USBマイクが、録音用デバイスとして、「card:3、device:0」として認識されていることがわかります。
「arecord -L」コマンドを使用すると、定義されているすべての PCM(サウンドデバイス) を一覧表示すができます。
pi@raspberrypi:~ $ arecord -L
null
Discard all samples (playback) or generate zero samples (capture)
hw:CARD=Microphone,DEV=0
USB Microphone, USB Audio
Direct hardware device without any conversions
plughw:CARD=Microphone,DEV=0
USB Microphone, USB Audio
Hardware device with all software conversions
default:CARD=Microphone
USB Microphone, USB Audio
Default Audio Device
sysdefault:CARD=Microphone
USB Microphone, USB Audio
Default Audio Device
front:CARD=Microphone,DEV=0
USB Microphone, USB Audio
Front output / input
dsnoop:CARD=Microphone,DEV=0
USB Microphone, USB Audio
Direct sample snooping device
pi@raspberrypi:~ $
デフォルトで使用される録音用デバイスの設定
再生用デジタルオーディオデバイスのところで記載しましたが、デフォルトで使用する録音用デジタルオーディオデバイスとして使用するデバイスを明示的に指定していない場合、録音用デジタルオーディオデバイスとして使用されるデバイスは、「card: 0、device 0」になります。
「card: 0、device: 0」は、ヘッドフォン・デバイスであるため、以下のコマンドを実行し録音しようとするとエラーが表示され録音することはできません。
pi@raspberrypi:~ $ arecord -c 1 -d 5 -f S16_LE -r 44100 -t wav record.wav
arecord: main:830: audio open error: No such file or directory
pi@raspberrypi:~ $
デフォルトで使用する再生用および録音用デジタルオーディオデバイスは、「/etc/asound.conf」ファイルや「~/.asoundrc」ファイルで設定することができます。
デフォルトで使用する再生用デジタルオーディオデバイスとしてヘッドフォン(「card: 0、device: 0」)を使用し、録音用デバイスとしてUSBマイク(「card: 3、device: 0」)を使用するには、ALSAの「asym」プラグインを使用して設定します。
この「asym」プラグインは、再生(playback)と録音(capture)を組み合わせたもので、Slave PCM に両方向に異なるデジタルオーディオデバイスを定義することができます。
以下のように「~/.asoundrc」ファイルを作成し記載します。
【補足】
「~/.asoundrc」には、ユーザー個々に使用する設定を記載します。
「/etc/asound.conf」には、システム全体で使用する設定を記載します。
pi@raspberrypi:~ $ vi .asoundrc
【記載内容】
pcm.!default { # サウンドデバイスのデフォルトを設定
type asym # Asym PCM
playback { # Playback slave definition
pcm {
type hw
card Headphones # [aplay -L]コマンドで確認したデバイスの名前
device 0 # [aplay -L]コマンドで確認したデバイスの番号
}
}
capture { # Capture slave definition
pcm {
type hw
card Microphone # [arecord -L]コマンドで確認したデバイスの名前
device 0 # [arecord -L]コマンドで確認したデバイスの番号
}
}
}
pi@raspberrypi:~ $
録音用デジタルオーディオデバイスを使用した録音
上記の設定ファイルで、デフォルトで使用する録音用デジタルオーディオデバイスとしてUSBマイクを、再生用デジタルオーディオデバイスとしてヘッドフォン(イヤホン・ジャック)を設定できましたので、デバイスを指定することなくUSBマイクを使用して録音し、ヘッドフォン(イヤホン・ジャック)を使用して再生できるようなります。
pi@raspberrypi:~ $ arecord -c 1 -d 5 -f S16_LE -r 44100 -t wav record.wav
Recording WAVE 'record.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
pi@raspberrypi:~ $ ls -l
total 432
-rw-r--r-- 1 pi pi 441044 Aug 19 14:08 record.wav
pi@raspberrypi:~ $
【arecordのオプションパラメータ】
-c 1:チャネル数を指定します。(モノラル:1)
-d 5:録音時間を指定します。(5秒)
-f S16_LE:サンプリングのフォーマットを指定します。(S16_LE)
-r 44100:サンプリングレートを指定します。(44100Hz)
-t wav:ファイルフォーマットのタイプを指定します。(wav形式)
pi@raspberrypi:~ $ aplay record.wav
Playing WAVE 'record.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
pi@raspberrypi:~ $
以上です。