Raspberry Pi 3 Model BとReSpeaker 2-Mics Pi HATでGoogle Assistant SDKを活用する

# イントロダクション

2017年10月にGoogleから日本語に対応したスマートスピーカー「[Google Home](https://store.google.com/product/google_home)」「[Google Home Mini](https://store.google.com/product/google_home_mini)」が発売され、2017年3月に雑誌「The MagPi」[第57号](https://www.raspberrypi.org/magpi/issues/57/)の付録として配布されて大きな話題になった[AIY Projects voice kit](https://aiyprojects.withgoogle.com/voice/)が単体で入手できるようになるなど、Google Assistantを利用できるハードウェアデバイスはどんどん増えつつあります。

ここでは、Raspberry Piと[ReSpeaker 2-Mics Pi HAT](http://wiki.seeed.cc/ReSpeaker_2_Mics_Pi_HAT/)を組み合わせてGoogle Assistant SDKを活用する方法を紹介します。ReSpeaker 2-Mics Pi HATはSeeed Studioが開発したRaspberry Pi用拡張ボードで、$9.90という低価格にも関わらず、2つのマイクと1つのスピーカー出力、1つのヘッドフォン出力、2つのGroveコネクタ、1つのボタン、3つのRGB LEDを搭載しています。ReSpeaker 2-Mics Pi HATにより、柔軟に拡張でき、かつコンパクトなスマートスピーカーを実現できます。

![IMG_5036.JPG](https://qiita-image-store.s3.amazonaws.com/0/92577/5287a1f2-a362-4ef2-dd41-75ac7aed1f92.jpeg)

# 準備

## 必要なもの

- [Raspberry Pi 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)：1個
- マイクロUSBカード：1枚
- マイクロUSBケーブル：1本
- USB電源アダプタ：1個
- [ReSpeaker 2-Mics Pi HAT](https://www.seeedstudio.com/ReSpeaker-2-Mics-Pi-HAT-p-2874.html)：1個（Mouserの[713-107100001](https://www.mouser.jp/ProductDetail/Seeed-Studio/107100001/)）
- スピーカ（8Ω、1W）：1個（[例](https://www.marutsu.co.jp/pc/i/11490048/)）[^speaker]
- JST PHコネクタ付きケーブル：1本（[例](https://www.amazon.co.jp/dp/B017IIV8KM/)）

[^speaker]: ReSpeaker 2-Mics Pi HATに搭載されているコーデックチップ「[WM8960](https://www.jp.cirrus.com/products/wm8960/)」がサポートするのが8Ω負荷の1Wであるため、これに合ったものを選択します。

## セットアップ

1. [公式ウェブサイト](https://www.raspberrypi.org/downloads/raspbian/)よりRaspbianのイメージファイルをダウンロードする（例：RASPBIAN STRETCH WITH DESKTOP September 2017）
2. [Etcher](https://etcher.io/)をダウンロードして解凍する
3. Etcherを起動して画面右上の歯車アイコンをクリックし「Auto-unmount on success」のチェックを外す ![etcher-settings.png](https://qiita-image-store.s3.amazonaws.com/0/92577/69275a49-078e-ead7-ef61-632dbbe81071.png)
4. 画面右上の`Back`をクリックして本の画面に戻り、ダウンロードしたイメージファイルとSDカードリーダーを指定して`Flash!`をクリックしてイメージを書き込む ![etcher-main.png](https://qiita-image-store.s3.amazonaws.com/0/92577/5af08aa4-6336-7954-9894-07858290f227.png)
5. 書き込みと検証が終わるまで10分間程度待つ
6. ウェブブラウザで[https://mascii.github.io/wpa-supplicant-conf-tool/](https://mascii.github.io/wpa-supplicant-conf-tool/)にアクセスし、アクセスするWi−Fiアクセスポイントの情報を入力して`追加`ボタンを押し、`wpa_supplicant.conf作成`と`ssh.txt作成`をクリックする
7. ダウンロードされた2つのファイルを書き込みが終わったマイクロSDカードの最上位階層（/boot/）にコピーし、マウントを解除してマイクロSDカードを取り出す
8. 取り出したマイクロSDカードをRaspberry Piボードに挿入してマイクロUSB端子に電源を接続し、起動する
9. ターミナルで`arp -an | grep b8:27:eb`と入力してRaspberry Piが取得しているIPアドレスを見つける（例：192.168.1.123）[^vendorId]
10. ターミナルで`ssh pi@192.168.1.123`と入力し、ユーザー`pi`に対して初期設定されているパスワード`raspberry`を入力してログインする
11. `SSH is enabled and the default password for the 'pi' user has not been changed. This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.`（SSHが有効で、'pi'ユーザーのデフォルトパスワードは変更されていません。これはセキュリティ上のリスクです。新しいパスワードを設定するには、'pi'ユーザーとしてログインし、'passwd'と入力してください。）という警告が表示されるので、警告に従って`passwd`コマンドを入力し、パスワードを初期値から別のものに変更する
12. `sudo apt-get update`に続けて`sudo apt-get upgrade`を実行して最新版へ更新する
13. `sudo raspi-config`で`Raspberry Pi Software Configuration Tool`を起動し、`4 Localisation Options`＞`I2 Change Timezone`＞`Asia`＞`Tokyo`を選択し、`exit`キーを押してツールを終了する

[^vendorId]: `b8:27:eb`はRaspberry Pi FoundationのベンダーIDなので、`arp -an`の出力からこのIDを含む行だけを抽出することで、同じネットワークに接続されている全ての機器の中からRaspberry PiボードのIPアドレスだけを抽出できる。もし、複数のボードを接続する場合には順に接続することで混乱を避けられる。

# ReSpeaker 2-Mics Pi HATのセットアップ

まず、ReSpeaker 2-Mics Pi HATに搭載されているコーデックチップ「WM8960」を使用できるようにするため、カーネルを再ビルドし、再起動します。

```shell-session
$ git clone https://github.com/respeaker/seeed-voicecard.git
$ cd seeed-voicecard
$ sudo ./install.sh 2mic
$ sudo reboot
```

再起動後に`aplay -l`と`arecord -l`で再生と録音、それぞれに`seeed2micvoicec`が追加されていることを確認します。

```shell-session:再生に対応したハードウェアデバイスのリストを出力する
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: seeed2micvoicec [seeed-2mic-voicecard], device 0: bcm2835-i2s-wm8960-hifi wm8960-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```

```shell-session:録音に対応したハードウェアデバイスのリストを出力する
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: seeed2micvoicec [seeed-2mic-voicecard], device 0: bcm2835-i2s-wm8960-hifi wm8960-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```

確認できたら、`seeed2micvoicec`をデフォルトの入出力デバイスとして使用するよう、`/home/pi/`で`nano .asoundrc`を実行し、以下の内容を入力します。

```:/home/pi/.asoundrc
pcm.!default {
  type asym
  capture.pcm "mic"
  playback.pcm "speaker"
}
pcm.mic {
  type plug
  slave {
    pcm "hw:1,0"
  }
}
pcm.speaker {
  type plug
  slave {
    pcm "hw:1,0"
  }
}
```

`/home/pi/.asoundrc`の設定を済ませたら、Google Assistant SDKサイトでの説明[Configure and Test the Audio](https://developers.google.com/assistant/sdk/develop/python/hardware/audio?hardware=rpi)のステップ1で説明されているテストを順に実行します。

```shell-session:スピーカーから音声を再生できることを確認する
$ speaker-test -t wav

speaker-test 1.1.3

Playback device is default
Stream parameters are 48000Hz, S16_LE, 1 channels
WAV file(s)
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 128 to 131072
Period size range from 64 to 65536
Using max buffer size 131072
Periods = 4
was set period_size = 32768
was set buffer_size = 131072
 0 - Front Left
Time per period = 0.032640
```

```shell-session:マイクから音声を録音しスピーカーから再生できることを確認する
$ arecord --format=S16_LE --duration=5 --rate=16000 --file-type=raw out.raw
Recording raw data 'out.raw' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
$ aplay --format=S16_LE --rate=16000 out.raw
Playing raw data 'out.raw' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
```

これでReSpeaker 2-Mics Pi HATのサウンド入出力に関する一通りの動作確認ができましたので、`alsamixer`コマンドでAlsaMixerを起動し、`F6`キーを押してサウンドカードを選択し、ボリュームを適切に変更します。

![alsamixer-select.png](https://qiita-image-store.s3.amazonaws.com/0/92577/50637746-4eb2-5f11-ce4e-e222c1eb7121.png)

![alsamixer-playback.png](https://qiita-image-store.s3.amazonaws.com/0/92577/d5ff0340-a22d-bc7d-f736-24f5449fd354.png)

![alsamixer-capture.png](https://qiita-image-store.s3.amazonaws.com/0/92577/e2e0962e-f65d-91cd-c746-01846e201eef.png)

以上でReSpeaker 2-Mics Pi HATのセットアップと動作確認は全て完了しましたので、Google Assistant Libraryのセットアップと動作確認へと進みます。

# Google Assistant Libraryのセットアップと動作確認

1. [Configure a Developer Project and Account Settings](https://developers.google.com/assistant/sdk/develop/python/config-dev-project-and-account)の説明に従ってプロジェクトを作成し、そのプロジェクトに対してGoogle Assistant APIを有効化し、OAuth Client IDを作成してダウンロードする
2. 作成した`client_secret_<client-id>.json`ファイルをRaspberryPiの`/home/pi/`にアップロードする（例：~/Downloadsにダウンロードしたファイルを192.168.1.123のRaspberry Piにアップするのであれば`scp ~/Downloads/client_secret_<client-id>.json pi@192.168.1.123:/home/pi/`）
3. [Activity controls](https://myaccount.google.com/activitycontrols)ページで自分のGoogleアカウントのアクティビティコントロールを確認し、[Web & App Activity（ウェブとアプリのアクティビティ）](https://support.google.com/websearch/answer/54068)、[Device Information（端末情報）](https://support.google.com/accounts/answer/6135999)、[Voice & Audio Activity（音声アクティビティ）](https://support.google.com/websearch/answer/6030020)の3つが有効（青色）になっていることを確認する
4. [Download the Library and Run the Sample](https://developers.google.com/assistant/sdk/develop/python/run-sample)で説明されている手順に従ってPythonの仮想環境を準備し、Google Assistant Libraryをインストールする
5. `google-assistant-demo`を実行して動作確認を行う

# 参照

- [INSTALLING OPERATING SYSTEM IMAGES](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)
- [SSH (SECURE SHELL)](https://www.raspberrypi.org/documentation/remote-access/ssh/)
- [SETTING WIFI UP VIA THE COMMAND LINE](https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md)
- [Raspberry Piの無線LANをmicroSDで設定する](https://qiita.com/mascii/items/0d1a280ac58ed8f6f999)
- [Raspberry Piの無線LANをmicroSDで簡単に設定するためのツールを作った](https://qiita.com/mascii/items/a43d71572e1919e56398)
- [ReSpeaker 2-Mics Pi HAT](http://wiki.seeed.cc/ReSpeaker_2_Mics_Pi_HAT/)