はじめに
Raspberry Pi にスピーカーやマイクなどを付けて、色々しようと思いまして、オーディオデバイス系の操作などを少しまとめてみました。
環境
- Raspberry Pi 3
- Raspbian
- Linux version 4.19.58-v7+ (dom@buildbot) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #1245 SMP Fri Jul 12 17:25:51 BST 2019
紹介するコマンド
今回以下のコマンドを紹介します。
- lsusb
- aplay
- arecord
- amixer
- sox
接続中のデバイスを確認する
lsusb
で接続中のデバイスを確認できます。USBマイクを認識しているか手っ取り早く確認できます。
pi@raspberrypi:~ $ lsusb Bus 001 Device 004: ID 0556:0002 Asahi Kasei Microsystems Co., Ltd Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
上記であれば、
Bus 001 Device 004: ID 0556:0002 Asahi Kasei Microsystems Co., Ltd
この部分がマイクのデバイスになります。
接続中のオーディオデバイスを確認する
より詳しく、音声デバイスと録音デバイスについて動作を確認してみます。音声デバイスの調査はaplay -l
、録音デバイスはarecord -l
でそれぞれ確認できます。
pi@raspberrypi:~ $ aplay -l **** ハードウェアデバイス PLAYBACK のリスト **** カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA] サブデバイス: 7/7 サブデバイス #0: subdevice #0 サブデバイス #1: subdevice #1 サブデバイス #2: subdevice #2 サブデバイス #3: subdevice #3 サブデバイス #4: subdevice #4 サブデバイス #5: subdevice #5 サブデバイス #6: subdevice #6 カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI] サブデバイス: 1/1 サブデバイス #0: subdevice #0
pi@raspberrypi:~ $ arecord -l **** ハードウェアデバイス CAPTURE のリスト **** カード 1: AK5371 [AK5371], デバイス 0: USB Audio [USB Audio] サブデバイス: 1/1 サブデバイス #0: subdevice #0
上記をまとめると次のようになります。
- カード0 : ALSA [bcm2835 ALSA]
- デバイス 0 : bcm2835 ALSA [bcm2835 ALSA]
- 再生デバイス、イヤホンジャック
- デバイス 1 : bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI]
- 再生デバイス、HDMI
- デバイス 0 : bcm2835 ALSA [bcm2835 ALSA]
- カード1 : AK5371 [AK5371]
- デバイス 0 : USB Audio [USB Audio]
- 録音デバイス、マイク
- デバイス 0 : USB Audio [USB Audio]
カード番号をXとすると、plughw:X
と表すことができます。他にも、カード番号X、デバイス番号Yを組み合わせてplughw:X,Y
、さらにサブデバイス番号Zを追加したplughw:X,Y,Z
と細かく指定することもできます。
オーディオデバイスの優先度を確認する
/proc/asound/modules
を確認することで、上記のどのカードが利用されるか優先度を調べることができます。
pi@raspberrypi:~ $ cat /proc/asound/modules 0 snd_bcm2835 1 snd_usb_audio
例えば、上記であれば、
- bcm2835
- usb_audio
このような優先度になります。
使用するデバイスを指定する
再生時や録音時は、デバイスを指定しなければ優先度が高いものから利用されます。もしコマンドのデバイス指定を省略したいが、目的のデバイスを利用したいと言った場合は、予めデバイスそのものの優先度を変更しておくとよいです。
以下、ファイルを用意してデバイスの順番自体を変更する方法と、環境変数を設定してデバイス番号を指定する方法を紹介します。
オーディオデバイスの順序を変更する
専用の設定ファイル/etc/modprobe.d/alsa-base.conf
を作り、中に次のように記載することでカードの認識順序を変更できます。インデックスが0になっているのが利用されるため、優先度を変更できます。
options snd slots=snd_usb_audio,snd_bcm2835 options snd_usb_audio index=0 options snd_bcm2835 index=1
オーディオデバイスの番号を指定する
次のように環境変数ALSADEV
を明示的に設定することで、デフォルトの設定を変更できます。
export ALSADEV="plughw:1,0"
オーディオデバイスを通して再生、録音をする
再生はaplay
。録音はarecord
で可能です。
pi@raspberrypi:~ $ aplay test.wav 再生中 WAVE 'test.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ
pi@raspberrypi:~ $ arecord -f cd test.wav 録音中 WAVE 'test.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ
録音は、-f cd
でCDの音質で録音をしてみました。録音を停止する際は、Ctrl+C
で停止ができます。
なお、特にオーディオデバイスを指定しないと、優先度が高いデバイスで再生/録音を行います。今回、録音デバイスの優先度が低いため、arecord
を実行すると、優先度が高い再生用デバイスbcm2835
が利用されてしまい、録音できないとエラーが発生してしまいます。
pi@raspberrypi:~ $ arecord -f cd test.wav arecord: main:828: audio open error: そのようなファイルやディレクトリはありません
エラーを回避する場合は、デバイスを-D
オプションで直接指定することで回避が行えます。
pi@raspberrypi:~ $ aplay -D plughw:0 test.wav 再生中 WAVE 'test.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ
pi@raspberrypi:~ $ arecord -D plughw:1 -f cd test.wav 録音中 WAVE 'mic.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ
オーディオデバイスの音量を確認する
amixer -cX
で各カードの音量レベルを確認することができます。カード0とカード1の音量レベルを確認してみると次のようになります。
pi@raspberrypi:~ $ amixer -c0 Simple mixer control 'PCM',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback -10239 - 400 Mono: Playback -2000 [77%] [-20.00dB] [on]
pi@raspberrypi:~ $ amixer -c1 Simple mixer control 'Mic',0 Capabilities: cvolume cswitch cswitch-joined Capture channels: Front Left - Front Right Limits: Capture 0 - 55 Front Left: Capture 31 [56%] [0.00dB] [on] Front Right: Capture 31 [56%] [0.00dB] [on]
オーディオデバイスの音量を変更する
amixer sset XXX YYY -cZZZ
で各カードの音量レベルを変更することができます。XXX
にはコントロール名。YYY
に数値、ZZZ
にカード番号を入れます。
pi@raspberrypi:~ $ amixer sset PCM 0 -c0 Simple mixer control 'PCM',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback -10239 - 400 Mono: Playback 0 [96%] [0.00dB] [on]
pi@raspberrypi:~ $ amixer sset Mic 50 -c1 Simple mixer control 'Mic',0 Capabilities: cvolume cswitch cswitch-joined Capture channels: Front Left - Front Right Limits: Capture 0 - 55 Front Left: Capture 50 [91%] [19.00dB] [on] Front Right: Capture 50 [91%] [19.00dB] [on]
Limitesの範囲で指定できます。PCMは、-10239~+400まで指定できますが、負の値はダブルクォーテーションで囲っても設定ができませんでした。何か方法があるかもしれませんが。
次のように%での指定も可能。
pi@raspberrypi:~ $ amixer sset PCM 50% -c0 Simple mixer control 'PCM',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback -10239 - 400 Mono: Playback -4919 [50%] [-49.19dB] [on]
soxを使用する
SoXとは、Sound eXchangeの略称からきており、音声の録音、再生、加工などをより高機能で利用できるツールとなります。
インストール方法
以下で、一通りインストールできます。
sudo apt-get install -y alsa-utils sox libsox-fmt-all
利用方法
基本的に、以下のようにsox
から始めて、入力A、出力Bと設定します。
sox A B
例えば、AやBには次のようなデバイス(ファイル)を入れることができます。
- 具体的なファイル名:
test.wav
、test.flac
など - デフォルトのデバイス:
-d
- 指定したデバイス:
-t alsa plughw:0
- nulデバイス:
-n
デバイス(ファイル)の前に、デバイスに対してのパラメータの設定も可能です。
- ボリューム:
-v
- チャンネル数:
-c
- サンプリング周波数:
-r
- 量子化ビット数:
-b
ここに挙げた以外にも機能が豊富にあります。詳細は、sox
を実行すると表示されるヘルプを確認してみてください。
利用例
音をデフォルトのデバイスで再生する
sox ./test.wav -d
音を指定したデバイスで再生する
sox ./test.wav -t alsa plughw:0
音を指定したデバイスで録音し入力レベルを確認する
nulデバイスへ録音することで、入力音の状態を表示できます。
sox -t alsa plughw:1 -n
以下のように、音量レベルが表示されます。
pi@raspberrypi:~ $ sox -t alsa plughw:1 -n Input File : 'plughw:1' (alsa) Channels : 2 Sample Rate : 48000 Precision : 16-bit Sample Encoding: 16-bit Signed Integer PCM In:0.00% 00:00:01.19 [00:00:00.00] Out:53.2k [ -=|=- ] Clip:0
Ctrl+C
で確認を終了できます。
音を指定したデバイスで録音する
sox -t alsa plughw:1 ./test.wav
Ctrl+C
で録音を終了できます。
音を指定したフォーマットで録音する
以下は、次のフォーマットで録音します。
- チャンネル数:1
- サンプリング周波数:8000Hz
- 量子化ビット数:16ビット
- フォーマット:flac形式(可逆圧縮音声ファイル)
サンプリング周波数は入力デバイスと、出力デバイスの両方とも設定して下さい。
sox -c 1 -r 8000 -t alsa plughw:1 -r 8000 ./test.flac
録音中は、以下のようにサンプリングレートやチャンネル数が変わっていることが分かります。
pi@raspberrypi:~ $ sox -c 1 -r 8000 -t alsa plughw:1 -r 8000 ./test.flac Input File : 'plughw:1' (alsa) Channels : 1 Sample Rate : 8000 Precision : 16-bit Sample Encoding: 16-bit Signed Integer PCM In:0.00% 00:00:05.29 [00:00:00.00] Out:40.7k [ | ] Clip:0
音を特定の条件で録音する
以下は、最大5秒か、無音が3秒続いたら録音を停止します。
sox -c 1 -r 8000 -t alsa plughw:1 -r 8000 test.flac trim 0 5 silence 0 1 3.0 -35d
次のオプションを組み合わせています。
- 5秒間録音する:
trim 0 5
- 無音が3秒続いたら停止する:
silence 0 1 3.0 -35d
マイクの音量を確認する
-S stats
を後ろにつけることで音声の解析が行います。
pi@raspberrypi:~ $ sox -t alsa plughw:1 -n -S stats Input File : 'plughw:1' (alsa) Channels : 2 Sample Rate : 48000 Precision : 16-bit Sample Encoding: 16-bit Signed Integer PCM In:0.00% 00:00:02.65 [00:00:00.00] Out:123k [ | ] Clip:0 ^C Overall Left Right DC offset -0.000007 -0.000007 -0.000006 Min level -0.328339 -0.326996 -0.328339 Max level 0.223816 0.222778 0.223816 Pk lev dB -9.67 -9.71 -9.67 RMS lev dB -28.66 -28.68 -28.64 RMS Pk dB -18.15 -18.19 -18.15 RMS Tr dB -55.23 -55.22 -55.23 Crest factor - 8.89 8.88 Flat factor 0.00 0.00 0.00 Pk count 2 2 2 Bit-depth 15/16 15/16 15/16 Num samples 123k Length s 2.560 Scale max 1.000000 Window s 0.050 Aborted.
モノラル入力であれば、モノラルのみ表示されます。
pi@raspberrypi:~ $ sox -c 1 -r 8000 -t alsa plughw:1 -n -S stats Input File : 'plughw:1' (alsa) Channels : 1 Sample Rate : 8000 Precision : 16-bit Sample Encoding: 16-bit Signed Integer PCM In:0.00% 00:00:04.10 [00:00:00.00] Out:24.6k [ | ] Clip:0 ^C DC offset -0.000000 Min level -0.226990 Max level 0.247528 Pk lev dB -12.13 RMS lev dB -32.12 RMS Pk dB -20.98 RMS Tr dB -57.08 Crest factor 9.99 Flat factor 0.00 Pk count 2 Bit-depth 14/16 Num samples 24.6k Length s 3.072 Scale max 1.000000 Window s 0.050 Aborted.
デシベル表示をやめる場合は、-S stat
とします。
pi@raspberrypi:~ $ sox -c 1 -r 8000 -t alsa plughw:1 -n -S stat Input File : 'plughw:1' (alsa) Channels : 1 Sample Rate : 8000 Precision : 16-bit Sample Encoding: 16-bit Signed Integer PCM In:0.00% 00:00:05.12 [00:00:00.00] Out:32.8k [ | ] Clip:0 ^C Samples read: 32768 Length (seconds): 4.096000 Scaled by: 2147483647.0 Maximum amplitude: 0.266113 Minimum amplitude: -0.206604 Midline amplitude: 0.029755 Mean norm: 0.008582 Mean amplitude: 0.000010 RMS amplitude: 0.021841 Maximum delta: 0.179169 Minimum delta: 0.000000 Mean delta: 0.002618 RMS delta: 0.009308 Rough frequency: 542 Volume adjustment: 3.758 Aborted.
おわりに
いったんここまでです。また何か分かったら追加していきたいと思います。
参考
コメント