Raspberry Pi で再生と録音を行う

Linux
スポンサーリンク

はじめに

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
  • カード1 : AK5371 [AK5371]
    • デバイス 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

例えば、上記であれば、

  1. bcm2835
  2. 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.wavtest.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.

おわりに

いったんここまでです。また何か分かったら追加していきたいと思います。

参考

 

 

コメント

タイトルとURLをコピーしました