UKey's Labo

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で終了します。

実行した上記コマンドを簡単に説明すると。

デフォルトスピーカーが現在接続してあるスピーカーであれば、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:[カード番号],[デバイス番号] [出力ファイル名]

音声が出力されない場合は、以下を確認してみてください。

参考サイト

引用

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はアナログ信号を標本化(サンプリング)・量子化し、得られた信号の大きさを整数データとし、それを一組のパルス列として出力する。