Raspberry Pi オーディオまとめ

Raspberry Pi 3 Model B+ で、USBマイク、3.5mmヘッドフォンジャックに繋いだ小型スピーカーを入出力について調べたことをまとめました。
USBマイクは、amazonで購入した、BU-Bauty。
小型スピーカーはダイソーで購入した、耳元キューブスピーカーを使用しました。
動作環境
対象 | バージョン |
---|---|
ラズベリーパイ | Raspberry Pi 3 Model B+ |
OS | Raspbian GNU/Linux 9.6 (stretch) |
Raspberry Piのオーディオの仕組み(簡単に)
ハード
今回使用しているRaspberry Pi 3 Model B+では、音声のOUTPUTは、GPIOを除けば、HDMIと3.5mmヘッドフォンジャックのいずれかになります。
ソフト
ALSAという技術を使用して、音声の入出力を管理しています。
サウンドカードの確認
cat /proc/asound/cards
0 [ALSA ]: bcm2835_alsa - bcm2835 ALSA
bcm2835 ALSA
1 [Device ]: USB-Audio - USB PnP Sound Device
C-Media Electronics Inc. USB PnP Sound Device at usb-3f980000.usb-1.1.3, full s
0[ALSA ]
は上記から、ラズパイ内蔵のbcm2835内蔵のサウンドカードです。
1[Device ]
は、USB接続しているUSBマイクが表示されています。
デバイスを確認
cat /proc/asound/devices
0: [ 0] : control
16: [ 0- 0]: digital audio playback
17: [ 0- 1]: digital audio playback
32: [ 1] : control
33: : timer
56: [ 1- 0]: digital audio capture
マイクは「capture」、スピーカーは「playback」と表示される。
2行目、3行目はどちらもdigital audio playback
となっていますが、16: [ 0- 0]~
のほうが、3.5mmヘッドフォンジャック、
17: [ 0- 1]~
のほうが、HDMI出力になります。
以下を調べると確認できます。
PCMストリームを調べる
cat /proc/asound/pcm
00-00: bcm2835 ALSA : bcm2835 ALSA : playback 7
00-01: bcm2835 ALSA : bcm2835 IEC958/HDMI : playback 1
01-00: USB Audio : USB Audio : capture 1
行頭の数値、00-00
はカード番号-デバイス番号
になっています。
1行目の00-00: bcm2835 ALSA : bcm2835 ALSA : playback 7
は、カード番号0、デバイス番号0のスピーカーということになる(Raspberry Pi 3 model B+では、3.5mmイヤホンジャック)。
2行目の00-01: bcm2835 ALSA : bcm2835 IEC958/HDMI : playback 1
は、HDMIの音声出力。
現在の設定を確認
amixer
コマンドを使用する。
設定確認の場合は、amixer -c [カード番号] contents
を実行する。
スピーカーの設定を確認する。上記で確認している通り、カード番号は0
なので、以下を実行。
amixer -c 0 contents
# ・・・[省略]
numid=1,iface=MIXER,name='PCM Playback Volume'
; type=INTEGER,access=rw---R--,values=1,min=-10239,max=400,step=0
: values=-10238
| dBscale-min=-102.39dB,step=0.01dB,mute=1
# ・・・[省略]
本来であれば、その他情報も表示されますが、ここではボリュームにスポットを当てます。
現状、valuesが-10238で設定されており、最小値となっています。
ボリュームの変更
以下の書式でボリューム変更ができます。
amixer -c [カード番号] cset [対象] [設定値][%|dB]
例として、以下ではボリュームを最大値(100%)で設定しています。
amixer -c 0 cset numid=1 100%
numid=1,iface=MIXER,name='PCM Playback Volume'
; type=INTEGER,access=rw---R--,values=1,min=-10239,max=400,step=0
: values=4
| dBscale-min=-102.39dB,step=0.01dB,mute=1
GUIで操作できる alsamixerコマンド
alsamixerコマンドを実行すると、以下のような画面が表示されます。
実行してみると解るのですが、ここまでで紹介してきた、コマンド実行で調べるカード情報、デバイス情報は、この画面で一括で確認することができます。
F2
を押下してSystem information
を開いてみましょう。
小さめにですが、上記のようなダイアログが表示されます。
ご覧の通り、ここで表示されているのは、「サウンドカードの確認」、「デバイスの確認」で表示させていた情報であることがわかります。
試しに、/proc/asound/cards
を選択してみます。
上記のようなダイアログが表示されたかと思います。
その他、/proc/asound/devices
も同様に確認できます。
ボリュームも、簡単に、かつ直感的に変更できます。
スピーカーのボリュームを変更する場合は、以下でPlaybackが選択されていることを確認して、キーボードの↑、↓でボリュームの変更ができます。
今回の環境では、USBマイクも接続してあるので、この画面でInputのゲインを変更することもできます。
USBマイクはスピーカーとは別のサウンドカードになるので、操作対象のサウンドカードを変更します。
F6
を押下して、Select sound card
を開きます。
USBマイクは1 USB PnP Sound Device
のほうなので、そちらを選択します。
スピーカーのほうと同じような画面が開き、ここでゲインを調整することができます。
以下の箇所がCaptureが選択されていることを確認してください。
スピーカーチェック
スピーカーで音が出力されるか確認します。
speaker-test
コマンドで行います。
speaker-test -D hw:0,0 -t sine -f 1000
ctrl + c
で終了します。
実行した上記コマンドを簡単に説明すると。
-D
– 出力先をhw:[カード番号],[デバイス番号]
で指定-t
–pink|sine|wav
の中からテスト用に出力するサウンドの種類を選択。何も指定しない場合はpink
-f
–-t
でsine
を使用した場合に、サイン波の周波数を指定する。
デフォルトスピーカーが現在接続してあるスピーカーであれば、speaker-test
だけで、スピーカーからピンクノイズが出力されます。
デフォルト設定のスピーカー
HDMIケーブルでディスプレイと接続している場合、3.5mmジャックに接続したスピーカーから音が出力されないことがあるようです。その場合、以下のコマンドで強制的に3.5mmジャックを出力先に設定することができます。
amixer -c [カード番号] cset numid=3 [デバイス番号]
例)
amixer -c 0 cset numid=3 1
もしくは、raspi-config
コマンドでも設定可能です。
sudo raspi-config
以下の画面が開くので、7 Advanced Options
を選択。
A4 Audio
を選択
1 Force 3.5mm ('headphone') jack
を選択します。
マイクチェック
マイクで音が拾えているか、録音して確認します。
録音にはarecord
コマンドを使用します。
例)
arecord -D hw:1,0 -f S16_LE test.wav
以下のようにコンソールに出力され、録音状態になります。
Recording WAVE 'teat.wav' : Signed 16 bit Little Endian, Rate 8000 Hz, Mono
Warning: rate is not accurate (requested = 8000Hz, got = 44100Hz)
please, try the plug plugin
上記コマンドの書式は以下の通りです。
arecord -D hw:[カード番号],[デバイス番号] -f [フォーマット][出力先ファイル名]
フォーマットに指定できるものはman arecord
で確認ができます。
録音は、ctrl + c
で終了します。
録音した音声は以下のコマンドでスピーカーに出力することができます。
aplay -D hw:0,1 test.wav
書式は以下の通りです。
aplay -D hw:[カード番号],[デバイス番号] [出力ファイル名]
音声が出力されない場合は、以下を確認してみてください。
- スピーカーのボリュームを確認
- マイクのInputゲインの確認
- デフォルト出力デバイスの確認
参考サイト
引用
ALSA(Advanced Linux Sound Architecture)
ALSAの仕様については、以下のような注意点があります。
引用元 – Qiita – Linux の Audio 機能をコマンドラインで設定
- ALSA は色んなサウンドカードを統一的に操作出来るようにする仕組み。
- ALSAは個々のサウンドカードを担当するが、一つのサウンドカードには一つのアプリしかアクセス出来ない。
サウンドカード
引用元 – wikipedia – サウンドカード
サウンドカード (Sound card) 、またはサウンドボード (Sound board) は、コンピュータに音響信号の入出力機能を付加または強化する拡張用の回路基板である。
コンピュータに内蔵する形態を採り、主に、PCIやPCI Expressといった内部バスによって接続する。また、ノートパソコン用にExpressCard型のサウンドカードも存在する。サウンドカードと同類のものに、ノートパソコンなどに手軽に接続できるようにUSBバス接続やIEEE 1394接続等の製品があるが、これらはオーディオインターフェースと呼ばれることが多い。
BCM2835
引用元 – Raspberry Pi 公式サイト – BCM2835
This is the Broadcom chip used in the Raspberry Pi Model A, B, B+, the Compute Module, and the Raspberry Pi Zero.
raspberry pi で使用されているbroadcomチップ。
Broadcomチップ
Broadcomという会社で製造されているマルチメディアプロセッサのこと。
引用元 – thinkit – イントロダクションRaspberry Pi ―仕様説明からセットアップまで 前編
このBroadcomチップの中に、CPU、GPU、オーディオや通信ハードウェアを含んだシステムコンポーネントの大部分が組み込まれています。
PCM (Pulse Code Modulation)
パルス符号変調。音声などのアナログ信号をパルス列に変換するパルス変調の一つ。
PCMはアナログ信号を標本化(サンプリング)・量子化し、得られた信号の大きさを整数データとし、それを一組のパルス列として出力する。