RaspberryPiにAlexaをインストールしてAmazonMusicを流そうとした件


こんばんは。ボルダリングで腕がパンパンmorifujiです。

今日は久しぶりにRaspoberryPiを押入れから引っ張り出して、Alexaさんを憑依させてAmazonMusicを流させようとしたので知見を共有します。なんか憑依っていうと◯川隆法みたいですね

### 目次

1. amazonで開発者アカウント作成・アプリケーション登録
2. スピーカー・マイク準備
3. デバイス登録
4. 初期設定

### 前提となる環境

- RaspberryPiが起動している
- RaspberryPiに接続できるスピーカーを持っている
- RaspberryPiに接続できるマイクを持っている

ちなみにぼくはこういう環境です。

- RaspberryPi3　ModelB+ 
 - Raspblian (Desktop)
- [amazonの格安PCスピーカー(USBでもなくBluetoothでもなく3.5mmのやつ)](https://www.amazon.co.jp/%E3%82%B5%E3%83%B3%E3%83%AF%E3%82%B5%E3%83%97%E3%83%A9%E3%82%A4-MM-SPL2N2-%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC/dp/B0111LZH68/ref=sr_1_8?s=computers&ie=UTF8&qid=1531054672&sr=1-8&refinements=p_n_price_fma%3A2150391051)
- どこかで買った300円のusbマイク
 - 多分中華製

## 1. amazonで開発者アカウント作成・アプリケーション登録

まずこちらから。https://developer.amazon.com/ でアカウントを作成してください。

今回僕は日本のamazonのアカウントでAmazonPrimeに入会しているので、そのアカウントのemail/passで登録しました。

:warning: amazon.comとamazon.co.jpで複数アカウントを持つ人は、どのアカウントを使用するか注意してください。まじでハマります。

>https://dev.classmethod.jp/voice-assistant/solution-of-a-problem-amazon-com-account-conflict/

まず、トップ右上の`Developer Console`に飛びます
<img width="1440" alt="スクリーンショット 2018-07-08 20.42.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/158393/038ef58f-533b-ff08-d1b3-e8dbe956705f.png">


次に、AlexaVoiceServiceに飛びます

<img width="1399" alt="スクリーンショット 2018-07-08 20.43.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/158393/cba1f8a9-9263-3b7a-40c7-ce854609bce6.png">

`製品を作成する`に飛びます、



| 項目   | 入力内容                                                     |
| ------ | ------------------------------------------------------------ |
| 製品名 | 任意の製品名です、後から参照しないのでなんでもok。ぼくは`raspberry_alexa`にしました |
| 製品ID | 任意の製品IDです。後から参照するのでメモを忘れず |
| 製品はアプリやデバイスを使用しますか ? | 必ずアプリケーションを選択。はまりますので  :warning: |
| 商品カテゴリ | なんでもok,ぼくはワイヤレススピーカを選びました |
| 製品概要 | 参照しないのでなんでもok。ぼくは`alexa  on raspberrypi`って書きました|
| エンドユーザーは、商品とどのようにやり取りするのでしょうか ? | ハンズフリーとファーフィールドを選択 |
| 画像  | しなくてもよい |
| この製品を商品として配信する予定ですか ? | プライベート用なので `no` |
| これは子供向け商品、それ以外は13歳以下の子供向けですか ? | よくわからんので`no`を選択 |

これで`次へ`を選択

#### セキュリティプロファイルを選択する

初めての人はセキュリティプロファイルを作成してから、それを商品に登録します。特に難しいことないです

#### プラットフォーム情報

プラットフォームを作成する必要があります。`他のデバイスやプラットフォーム`を選択し `Download`ボタンからバックアップを取っておきましょう。


<img width="1190" alt="スクリーンショット 2018-07-08 20.54.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/158393/481c9b26-88e1-6616-4c86-11e308e56e80.png">

:thinking:ちなみにこの`一般ID`ってgenerate idって意味なのだろうか  :thinking:

<img width="1206" alt="スクリーンショット 2018-07-08 20.55.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/158393/4837bc3e-24a8-f5aa-d667-759dc703e6f9.png">


そのファイルには以下の様なフォーマットでデータが入っています、必ず保管しましょう

```
{
 "deviceInfo": {
  "clientId": "amzn1.application-oa2-client.XXXXXXXXXXXXX",
  "productId": "raspberry_alexa"
 }
}
```

規約にチェックをつけて進むと完了するはずです。

## 2. スピーカー・マイク準備

RaspberryPiのssh環境を用意します。

まずはスピーカー。つなぐ前にスピーカーの状況を確認

```
# スピーカーデバイス一覧表示
aplay -L
```

スピーカーをつなぎもう一度実行すると項目が増えているはずです。


そしたら出力確認です

```
# スピーカーテスト
speaker-test -t sine -f 1000
```

音が聞こえなかったら徐々に音量あげましょう。

```
amixer sset PCM 100% 
```

次にマイクです。同じ様にデバイスとして認識されてるかチェックします

```
# マイクデバイス一覧
arecord -l 
```

んで。テスト。今回は、マイクで入力された音声がスピーカーから出力されるか確認します。

```
arecord -f S16_LE -r 44100 -D hw:1 | aplay
```

おうむ返しみたいな感じになりましたか？okなら次に行きましょう！

## 3. デバイス登録

いよいよラズパイにAlexaをインストールしていきます。

今回使うライブラリは [こちらのalexa/avs-device-sdk](https://github.com/alexa/avs-device-sdk/wiki/Raspberry-Pi-Quick-Start-Guide-with-Script)です

ライブラリ選定にはこちらの記事が非常にわかりやすく書かれていました。ありがとうございます :bow:
>https://qiita.com/Dimeiza/items/182c4847d7c1ead7df54

```
# ディレクトリ作成
mkdir ~/raspberry_alexa
cd ~/raspberry_alexa

# 環境構築スクリプトインストール
sudo wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/setup.sh && sudo wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/config.txt && sudo wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/pi.sh

```

ここで、`config.txt`というファイルを開くとこんな感じ

```
#NOTE: The Device Serial Number can be any unique number
DEVICE_SERIAL_NUMBER="alexa_raspberry"
CLIENT_ID=""
PRODUCT_ID=""
```

先ほど、1でダウンロードしたファイルに書いてある`client_id`と`product_id`をここに入力します、。`DEVICE_SERIAL_NUMBER`は適当でok

```
{
 "deviceInfo": {
  "clientId": "amzn1.application-oa2-client.XXXXXXXXXXXXX",
  "productId": "raspberry_alexa"
 }
}
```

この設定を読み込んでセットアップします

```
sudo bash setup.sh config.txt
```

ビルドするんでめっちゃ時間かかります。30~60分ほどの感じです。。。次に、サンプルアプリケーションを実行します。

```
sudo bash startsample.sh
```

これまた時間がかかりますが、すばらくすると以下の様にブラウザからの承認待ちの状態になります。

```
################################################################################################
#       To authorize, browse to: 'https://amazon.com/us/code' and enter the code: B8DEA5       #
################################################################################################

2018-07-08 11:17:10.405 [  2] 5 CBLAuthDelegate:handleRequestingToken
#################################################
#       Checking for authorization (1)...       #
#################################################

2018-07-08 11:17:10.407 [  2] 5 CBLAuthDelegate:requestToken
2018-07-08 11:17:10.923 [  2] 5 HttpPost:doPostSucceeded:code=400
2018-07-08 11:17:10.923 [  2] 5 CBLAuthDelegate:receiveTokenResponse:code=400
2018-07-08 11:17:10.924 [  2] 5 CBLAuthDelegate:mapHTTPStatusToError:code=400,error=INVALID_REQUEST
2018-07-08 11:17:10.925 [  2] 5 CBLAuthDelegate:errorInLwaResponseBody:error=authorization_pending,errorCode=AUTHORIZATION_PENDING
2018-07-08 11:17:10.925 [  2] 5 CBLAuthDelegate:setAuthError:authError=AUTHORIZATION_PENDING
2018-07-08 11:17:10.926 [  2] 0 CBLAuthDelegate:receiveTokenResponseFailed:result=AUTHORIZATION_PENDING
#################################################
#       Checking for authorization (2)...       #
#################################################

2018-07-08 11:17:15.927 [  2] 5 CBLAuthDelegate:requestToken
2018-07-08 11:17:16.349 [  2] 5 HttpPost:doPostSucceeded:code=400
2018-07-08 11:17:16.349 [  2] 5 CBLAuthDelegate:receiveTokenResponse:code=400
2018-07-08 11:17:16.349 [  2] 5 CBLAuthDelegate:mapHTTPStatusToError:code=400,error=INVALID_REQUEST
2018-07-08 11:17:16.350 [  2] 5 CBLAuthDelegate:errorInLwaResponseBody:error=authorization_pending,errorCode=AUTHORIZATION_PENDING
2018-07-08 11:17:16.350 [  2] 5 CBLAuthDelegate:setAuthError:authError=AUTHORIZATION_PENDING
2018-07-08 11:17:16.350 [  2] 0 CBLAuthDelegate:receiveTokenResponseFailed:result=AUTHORIZATION_PENDING
2018-07-08 11:17:21.351 [  2] 5 CBLAuthDelegate:requestToken
#################################################
#       Checking for authorization (3)...       #
#################################################

4,5,6と続く...
```

この状態で、`https://amazon.com/us/code`にアクセスします。日本のamazon(amazon.co.jp)のアカウントでもこちらに飛んでください。

1. コードを入力します。下の例では`B8DEA5`です。
2. 次に進んでアカウントを確認します。ここで、必ず最初にdeveloperに登録したアカウントになっているか必ず確認してください。
3. 地域は日本に
4. 規約等にokをしていくと無事に登録できます、

途中で画面が進んで`Woops`みたいなこと言われた場合、考えられる原因は２つです。

- １つめは、`アカウントを間違えている`可能性です。上の手順2で必ず確認してください、違った場合は右上からサインアウトしてもう一度チャレンジしてください。(もしくは、[この問題](https://dev.classmethod.jp/voice-assistant/solution-of-a-problem-amazon-com-account-conflict/)かも)
- ２つめは、 `config.txt`を間違えている可能性です。**config.txtを修正した場合は、`sudo bash setup.sh config.txt`からやり直してください。**


ブラウザで`succeed`と表示された場合は成功しました！。sshに戻ってください。

```
########################################
#       Alexa is currently idle!       #
########################################
```

と、どこかで出力されているはずです！これでRaspberryPiとalexaアプリケーションが紐づけられました！

この状態ではすでにAlexaはあなたの言葉を待っています。

アメリカンな口調で `Alexa how about you?`と聞いてみましょう。きっと答えてくれるはずです

## 4. 初期設定

この状態だと英語の勉強にはなりますが、日本語を喋ってもらいましょう。

#### 言語設定

`i`を押してEnterでコマンド情報が見れます。

```
+----------------------------------------------------------------------------+
|                                  Options:                                  |
| Wake word:                                                                 |
|       Simply say Alexa and begin your query.                               |
| Tap to talk:                                                               |
|       Press 't' and Enter followed by your query (no need for the 'Alexa').|
| Hold to talk:                                                              |
|       Press 'h' followed by Enter to simulate holding a button.            |
|       Then say your query (no need for the 'Alexa').                       |
|       Press 'h' followed by Enter to simulate releasing a button.          |
| Stop an interaction:                                                       |
|       Press 's' and Enter to stop an ongoing interaction.                  |
| Privacy mode (microphone off):                                             |
|       Press 'm' and Enter to turn on and off the microphone.               |
| Echo Spatial Perception (ESP): This is for testing purpose only!           |
|       Press 'e' followed by Enter at any time to adjust ESP settings.      |
| Playback Controls:                                                         |
|       Press '1' for a 'PLAY' button press.                                 |
|       Press '2' for a 'PAUSE' button press.                                |
|       Press '3' for a 'NEXT' button press.                                 |
|       Press '4' for a 'PREVIOUS' button press.                             |
| Settings:                                                                  |
|       Press 'c' followed by Enter at any time to see the settings screen.  |
| Speaker Control:                                                           |
|       Press 'p' followed by Enter at any time to adjust speaker settings.  |
| Firmware Version:                                                          |
|       Press 'f' followed by Enter at any time to report a different        |
|       firmware version.                                                    |
| Info:                                                                      |
|       Press 'i' followed by Enter at any time to see the help screen.      |
| Reset device:                                                              |
|       Press 'k' followed by Enter at any time to reset your device. This   |
|       will erase any data stored in the device and you will have to        |
|       re-register your device.                                             |
|       This option will also exit the application.                          |
| Quit:                                                                      |
|       Press 'q' followed by Enter at any time to quit the application.     |
+----------------------------------------------------------------------------+
```

1. `c`押してEnter
2. `1`押してEnter
3. `6`を押してEnter

すると以下の様に日本語になりました！

```
###################################
#       locale set to ja-JP       #
###################################
```

この状態で  `Alexa 明日の天気は！？`というときちんと日本語で返してくれます！

ですが、いくら`Alexa!` `Alexa!`　`A・L・E・X・A・！`といっても反応がありませんでした。。中華製マイクだしこんなもんですかね :cry: 

こういうときは、`t`を押しましょう。呼びかけをする必要なく、スマートに`明日の天気は？`と聞くことができました（スマートとはいっていない）

#### その他環境設定

`http://alexa.amazon.com/`または `https://alexa.amazon.co.jp`(アカウントによる？？)にアクセスし、アカウント情報を入力すると、現在つないでいるAlexaの設定や命令をブラウザ上で行えます。

<img width="1343" alt="スクリーンショット 2018-07-08 21.30.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/158393/e32fda12-feae-b3ce-3d57-5654f25f14f2.png">

ぼくはAmazonPrime会員なので、ここにAmazpnMusicが自動でインポートされていました！！感動！！

<img width="1343" alt="スクリーンショット 2018-07-08 21.34.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/158393/5e121791-d318-6184-4423-7850859db295.png">

ということは、Alexaに喋りかけて、ぼくの珠玉のプレイリストをかけることもできるはず！と確信したので呼びかけました

ぼく：`アレクサ 音楽を流して`

Alexa：`この端末ではAmazonMusicに対応しておりません`

ぼく：:frowning2::frowning2::frowning2::frowning2::frowning2::frowning2::frowning2::frowning2::frowning2::frowning2::frowning2::frowning2:

ぼく：`なんでや！管理画面からはAmazonPrimeの音楽流せたやん！！！`

<img width="1411" alt="スクリーンショット 2018-07-08 21.50.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/158393/980b0d0a-fcbe-0a65-2bd9-ba9bb8396318.png">

ぼく：:angry: 

## 所管

- すごい便利
 - 一時期ゆっくりさんで、目覚ましアプリをつくってた時期を思い出した
 - それよりはるかに高機能すぎて嬉しい
- スキル選び楽しい ヽ(ﾟ∀ﾟヽ 三 ﾉﾟ∀ﾟ)ﾉ
- 自動起動の設定はまた今度かな
- AmazonMusicの件に関しては金の亡者だと思った。
 - alexaの仕様よく読めよとか言わないでください
- かわりにradikoを召喚した(代わりになってない)
- いいマイク買ったほうがいい
 - 5000円くらいの買って試してみる予定
 - だれかうまくいった機種教えてください！！！
 - 試したら追記します

## 参考サイト

>https://github.com/alexa/avs-device-sdk
>https://github.com/alexa/avs-device-sdk/wiki/Raspberry-Pi-Quick-Start-Guide-with-Script
>https://qiita.com/Dimeiza/items/182c4847d7c1ead7df54
>http://blog.saboh.net/raspberrypiusbmaiku/
>https://dev.classmethod.jp/voice-assistant/solution-of-a-problem-amazon-com-account-conflict/