RaspberryPiでUSBスピーカーをデフォルトの音声出力デバイスにする

## はじめに
RaspberryPi上でAlexaで遊ぶために、USBスピーカーをデフォルトの出力にしたいなあと思って設定したメモ。Alexa自体はUSBスピーカーじゃなくても使えますが、デフォルトではイヤホンジャックの出力が優先になっているので、それを変えます。

## 環境
- [RaspberryPi3 Model B RS版 日本製](https://www.amazon.co.jp/Raspberry-Pi-Model-V1-2-%E5%9B%BD%E5%86%85%E6%AD%A3%E8%A6%8F%E4%BB%A3%E7%90%86%E5%BA%97%E5%93%81/dp/B01NAHBSUD/ref=sr_1_1?ie=UTF8&qid=1538327917&sr=8-1&keywords=raspberry+pi3+model+b+rs)
- [LOGICOOL ウェブカム HD画質 200万画素 C510](https://www.amazon.co.jp/LOGICOOL-%E3%82%A6%E3%82%A7%E3%83%96%E3%82%AB%E3%83%A0-HD%E7%94%BB%E8%B3%AA-200%E4%B8%87%E7%94%BB%E7%B4%A0-C510/dp/B0044JZEMW/ref=sr_1_1?ie=UTF8&qid=1538327593&sr=8-1&keywords=HD+WEBCAM+C510)
- [サンワサプライ USBスピーカー(ブラック) MM-SPU8BK](https://www.amazon.co.jp/gp/product/B016U0VZFM/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)
- [TOSHIBA microSDHCカード MSDAR40N16G](https://www.amazon.co.jp/TOSHIBA-microSDHC%E3%82%AB%E3%83%BC%E3%83%89-Class10-%E6%9C%80%E5%A4%A7%E8%BB%A2%E9%80%81%E9%80%9F%E5%BA%A640MB-MSDAR40N16G/dp/B019RE5Y96/ref=sr_1_1?ie=UTF8&qid=1538327709&sr=8-1&keywords=TOSHIBA+16GB+UHS-I)

全部買ってからだいぶ経っている古いものなので、手に入りにくいものもあるかもしれません。手元にUSBマイクがないのでWebカメラを使います。

## RaspberryPiの設定
毎回毎回設定が面倒くさいので、巷にはすでにあると思いますが、自分でセットアップツールを作りました。使用方法もReadmeに書いてあります。普通に使えますが、他の環境で試していないので、人柱になっていただいてもかまいません。 -> https://github.com/jumjamjohn/Raspian

## 流れ
- 動作確認のための音源作成
- スピーカーの動作確認
- USBスピーカーをデフォルトの出力にする設定

## 動作確認のための音源作成
- 録音デバイスの一覧

```bash:Terminal
arecord -l
# =>
# card 2: U0x46d0x81d [USB Device 0x46d:0x81d], device 0: USB Audio [USB Audio]
#  Subdevices: 1/1
#  Subdevice #0: subdevice #0
```

RaspberryPi上のどこのUSBポートに挿すかによって、`card カード番号: ..., device: デバイス番号: ...`の番号が変わります。`USB Audio`などとなっているデバイスのカード番号とデバイス番号を控えておきます。

- 録音

```bash:Terminal
cd ~
arecord -D plughw:1,0 -d 10 -f cd test.wav
```

`Recording WAVE 'test.wav'`と表示されて録音が始まるので、「テスト、テスト」とつぶやいてみましょう。コマンドの解説として、`arecord -D plughw:カード番号,デバイス番号 -d 録音する秒数 -f cd 音源のファイル名`です。上のコマンドで`~/test.wav`が作成されているはずです。

## USBスピーカーの動作確認

- 音源の確認

RaspberryPiのイヤホンジャックにイヤホンを挿し、

```bash:Terminal
aplay test.wav
```

で先程の音源が再生されます。音源が正しく録音されていて、かつ音声出力がデフォルトの状態で、かつイヤホンとイヤホンジャックが正常に動作していれば、聞こえるはずです。聞こえなかったらそのどこかが正常に動作してません。

- 音声出力デバイスの一覧

```bash:Terminal
aplay -l
```

`arecord -l`のときと同様に、`USB Audio`となっているもののカード番号とデバイス番号を控えておきます。

- USBスピーカーの動作確認

```bash:Terminal
aplay -D hw:1,0 test.wav
```

音源が正しく録音されていて、USBスピーカーとUSBポートが正常に動作していれば、聞こえるはずです。聞こえなかったらそのどこかが正常に動作してません。コマンドの解説として、`aplay -D hw:カード番号,デバイス番号 音源のファイル名`です。

## USBスピーカーをデフォルトの音声出力デバイスにする設定
USBスピーカーがRaspberryPi上で正常に動作していることが確認できたら、音声出力デバイスの優先順位を変更します。上のように順々に動作を確認していかないと、うまくいかなかったときにどこが動いていなくてうまくいかないのかわからなくなるので、順番にやります。慣れてたらすっ飛ばしても良いと思いますが。

- バックアップを取っておく

システム上重要なファイルを編集します。何かあったときに復元できないと困るので、バックアップを取ります。

```bash:Terminal
cp /usr/share/alsa/alsa.conf /usr/share/alsa/alsa.conf.bak
```

- alsaの設定ファイルを編集

viでもnanoでも良いです。

```bash:Terminal
sudo vi /usr/share/alsa/alsa.conf
```
`aplay -l`で確認したUSBスピーカーのカード番号とデバイス番号を入れます。

```bash:/usr/share/alsa/alsa.conf
...
defaults.ctl.card 1
defaults.pcm.card 1
defaults.pcm.device 0
...
```

- 再起動

```bash:Terminal
sudo reboot
```

- 再びSSHして音源再生

```bash:Terminal
aplay test.wav
```

これでUSBスピーカーから再生されれば成功です。予想した動作でなかった場合、`/usr/share/alsa/alsa.conf`の設定に問題があるかもしれません。

## 参考
https://uepon.hatenadiary.com/entry/2016/04/14/214420