Tako can fry!

とほほ・・・

スマートスピーカーを作ってみるよ (2)

RaspberryPi Zero W でスマートスピーカー的なものを作る上で、USB スピーカーと USB マイクをつなげる必要があり、そのときのメモでも。
調べればどこかに出てくる情報なんだけれども。

バイスの接続確認

lsusb コマンドで表示される情報を見てもよくわからないので、スピーカーやマイクを抜き差しして増えたデバイスがあれば、多分それという感じで確認。
SANWA のサイコロみたいなスピーカーと SANWA のマイクの場合、下のように表示される。
同じ SANWA で、どっちも同じ IC を使っているっぽいけど上がスピーカーで下がマイクの模様。
挿さっているかどうか確認できるぐらいかな。

$ lsusb
Bus 001 Device 004: ID 0d8c:0103 C-Media Electronics, Inc. CM102-A+/102S+ Audio Controller
Bus 001 Device 013: ID 0d8c:0134 C-Media Electronics, Inc.

接続されているサウンドバイスの確認

サウンドの入出力に使えるデバイスとして確認してみるには、/proc/asound/cards というファイルの中身を確認すればいいとのこと。
これまた似たような情報が・・・

$ cat /proc/asound/cards
 0 [ALSA           ]: bcm2835 - bcm2835 ALSA
                      bcm2835 ALSA
 1 [MicroII        ]: USB-Audio - Audio Advantage MicroII
                      C-Media INC. Audio Advantage MicroII at usb-20980000.usb-1.1, full speed
 2 [Device         ]: USB-Audio - USB PnP Audio Device
                      C-Media Electronics Inc. USB PnP Audio Device at usb-20980000.usb-1.3.7, full s

左側に表示されている数値でで接続したデバイスのカード番号がわかったので、/proc/asound/card1/ や /proc/asound/card2 以下の情報を確認してみる。
機能等はそのディレクトリ下の stream0 というファイルを見ればいいらしい。
Playback と出ればスピーカーで、Capture と出ればマイクかな。

$ cat /proc/asound/card1/stream0    (スピーカーの情報)
C-Media INC. Audio Advantage MicroII at usb-20980000.usb-1.1, full speed : USB Audio

Playback:
  Status: Stop
  Interface 1
    Altset 1
    Format: S16_LE
    Channels: 2
    Endpoint: 6 OUT (ADAPTIVE)
    Rates: 44100, 48000

$ cat /proc/asound/card2/stream0    (マイクの情報)
C-Media Electronics Inc. USB PnP Audio Device at usb-20980000.usb-1.3.7, full s : USB Audio

Capture:
  Status: Stop
  Interface 1
    Altset 1
    Format: S16_LE
    Channels: 1
    Endpoint: 2 IN (ASYNC)
    Rates: 8000, 11025, 16000, 22050, 32000, 44100, 48000

ユーザーを audio グループへ追加

音声関連のコマンドを扱う上で、毎回 sudo で実行するのも面倒なので、自分を audio グループへ追加しておく。
追加後にリブートが必要。
(下の例はユーザー tako2 でログインしている。)

$ sudo gpasswd -a tako2 audio

スピーカーで音声が生成できるか確認

サンプルの wav ファイルがあるので、それを再生させてみる。
plughw: の後に先程のカード番号を指定するっぽい。
調べた情報からするとどこかの設定ファイルでデフォルトのカード番号を指定できるみたいだけど、うまくいかなかったので毎回指定することにしている。

$ aplay -D plughw:1 /usr/share/sounds/alsa/Front_Left.wav

マイクで音声を録音できるか確認

arecord コマンドで録音して、それを aplay コマンドで再生させてみる。
マイクはカード番号が 2 だったので -D plughw:2 という感じでデバイスを指定している。

$ arecord -D plughw:2 test.wav
(Ctrl-C で録音終了)
$ aplay -D plughw:1 test.wav

スピーカーのボリューム調整

若干グラフィカルな方法とコマンドライン的な方法と 2 つあり。

グラフィカルなほうは alsamixer コマンドで -c でカード番号を指定。

$ alsamixer -c 1

コマンドラインのほうは amixer コマンドでこれも -c でカード番号を指定。
パラメータに get PCM を指定してボリュームを確認できる。
(下の例だと 50% がボリューム)

$ amixer -c 1 get PCM
Simple mixer control 'PCM',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 9472
  Mono:
  Front Left: Playback 4736 [50%] [-18.50dB] [on]
  Front Right: Playback 4736 [50%] [-18.50dB] [on]

set PCM の後にパーセントや on、off を指定することで、ボリュームやミュートを制御可能。

$ amixer -c 1 set PCM 70%   (ボリュームを 70% に)
$ amixer -c 1 set PCM off   (ミュート)
$ amixer -c 1 set PCM on    (ミュート解除)

マイクの感度調整

スピーカーと同じように、マイクも alsamixer や amixer で設定できる。

$ alsamixer -c 2 -V capture

マイクの場合、get Mic や set Mic を指定。

$ amixer -c 2 get Mic
Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 62
  Mono: Capture 44 [71%] [13.64dB] [on]