Raspberry Pi 3B + BluetoothスピーカでAmazon Alexaを安く構築（３　Alexa Voice Serviceインストール）

[1章](https://qiita.com/onelittlenightmusic/items/05b262c60c4889c07ca9)、[2章](https://qiita.com/onelittlenightmusic/items/05b262c60c4889c07ca9)の続きで、ラズパイをAmazon Echo化したいと思います。

# 本章：Alexa Voice Service(AVS) をRaspberry Piにインストールして、Alexaとしゃべりたい

ラズパイをEcho化した先駆者の記事。

https://qiita.com/bwtakacy/items/32226ed2406b5ebe1984

# まずはAlexa Voice Serviceにログイン

下記メインサイトの右上のサインインから、開発者として新規登録しましょう。

https://developer.amazon.com/ja/alexa-voice-service

ログインするとこんな画面に入れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/0e851bca-cf3a-570c-ba10-0cfba548dee5.png)


Alexa Voice Serviceの「始める」から

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/4cd618b3-05a3-de1e-66b6-2273c9d5bcec.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/8f4e3cf7-5831-1d3e-df09-10ef90863cf4.png)

セキュリティプロファイルにはURLを4種類登録します。「許可された出荷地」(= Allowed origin)に2種類。「許可された返品URL」(= Allowed Return URL)に2種類。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/5366ac04-0b86-f894-aa4c-bf5fe0104e71.png)

最終的には登録されてこうなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/5417f588-5c86-802f-ba55-cde6905ce824.png)

「管理する」を押すと、再度クライアントIDやクライアントのシークレットを確認することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/e3e17fb7-7ace-dfb4-fd77-4ce2e595ca08.png)


# sdkのダウンロードとクライアントIDの記載

下記記事にある通り、必要なsample-appをダウンロードします。

https://qiita.com/bwtakacy/items/32226ed2406b5ebe1984

```
git clone https://github.com/alexa/alexa-avs-sample-app.git
cd alexa-avs-sample-app-master
```

```automated_install.sh
#!/bin/bash

#-------------------------------------------------------
# Paste from developer.amazon.com below
#-------------------------------------------------------
# This is the name given to your device or mobile app in the Amazon developer portal. To look this up, navigate to https://developer.amazon.com/edw/home.html. It may be labeled Device Type ID.
ProductID=YOUR_PRODUCT_ID_HERE ←ここ

# Retrieve your client ID from the web settings tab within the developer console: https://developer.amazon.com/edw/home.html
ClientID=YOUR_CLIENT_ID_HERE　←ここ

# Retrieve your client secret from the web settings tab within the developer console: https://developer.amazon.com/edw/home.html
ClientSecret=YOUR_CLIENT_SECRET_HERE　←ここ
```

これを編集した後にインストールを実行します。

```
. ./automated_install.sh
```

下記のような質問に答えていくと、インストールが完了します。

```
====== AVS + Raspberry Pi Licenses and Agreement ======


This code base is dependent on several external libraries and virtual environments like Kitt-Ai, Sensory, ALSA, Atlas, Portaudio, VLC, NodeJS, npm, Oracle JDK, OpenSSL, Maven & CMake.

Please read the document "Installer_Licenses.txt" from the sample app repository and the corresponding licenses of the above.

Do you agree to the terms and conditions of the necessary software from the third party sources and want to download the necessary software from the third party sources?
=======================================================
[y/quit] >> y

Do you have an Amazon developer account?
[y/n/quit] >> y


ProductID >> ########
ClientID >> ##########
ClientSecret >> ##############
Is this information correct?
[y/n] >> y


Which locale would you like to use?
=======================================================
1) en-US
2) en-GB
3) de-DE
4) en-CA
5) en-IN
6) ja-JP
Please select an option [1-6] 6


==== Setting Audio Output =====
Are you using 3.5mm jack or HDMI cable for audio output?
=======================================================
1) 3.5mm jack
2) HDMI audio output

Please select an option [1-2] 1


=== Enabling Hands Free Experience using Wake Word "Alexa" ====
Do you want to enable "Alexa" Wake Word Detection?
=======================================================
[y/n/quit] >> y

(インストールが始まる)

...
[100%] Built target wakeWordAgentTest
chown: changing ownership of ‘/home/pi/alexa-avs-sample-app-master/samples/wakeWordAgent/ext/lib/libblas.so.3’: Operation not permitted

=============================
*****************************
========= Finished ==========
*****************************
=============================

To run the demo, do the following in 3 seperate terminals:
Run the companion service: cd /home/pi/alexa-avs-sample-app-master/samples/companionService && npm start
Run the AVS Java Client: cd /home/pi/alexa-avs-sample-app-master/samples/javaclient && mvn exec:exec
Run the wake word agent:
  Sensory: cd /home/pi/alexa-avs-sample-app-master/samples/wakeWordAgent/src && ./wakeWordAgent -e sensory
  KITT_AI: cd /home/pi/alexa-avs-sample-app-master/samples/wakeWordAgent/src && ./wakeWordAgent -e kitt_ai
  GPIO: PLEASE NOTE -- If using this option, run the wake word agent as sudo:
  cd /home/pi/alexa-avs-sample-app-master/samples/wakeWordAgent/src && sudo ./wakeWordAgent -e gpio
```
これでインストールは完了です。あとは端末アプリと認証です。

# 実行方法（認証とアプリ起動）

コマンドで順番に３つを実行。


```
cd alexa-avs-sample-app/samples
cd companionService && npm start & # ①
cd javaclient && mvn exec:exec & # ②
cd wakeWordAgent/src && ./wakeWordAgent -e sensory & # ③
```


それぞれのプログラムは、1.認証用のwebサービス、2. 1やAVSにアクセスする端末アプリ（画面）、3. マイクをウォッチしてwakeコマンド（「Alexa」という呼びかけ）を検出するプログラム、だそうです。

![2017-12-30 (4).png](https://qiita-image-store.s3.amazonaws.com/0/96277/482f26f2-e497-99b2-63d3-b9f579c0483a.png)


ここでYesを押し、RaspberryPi側でブラウザを立ち上げます。
私の環境ではFirefoxを使いましたが、Chromium-browserを使ってもよいです。

```
firefox &
```

ブラウザのURL入力欄に、すでに先ほどのURL（すでにYesボタンを押した結果Clipboardにコピーされているので）をCtrl+Vで貼り付けます。

![2017-12-30 (8).png](https://qiita-image-store.s3.amazonaws.com/0/96277/456232ac-0743-1518-fc6a-bd3a335ab9ce.png)

証明書エラーですが、どのブラウザでも特例として認可すれば通過できます。

![2018-01-02 (1).png](https://qiita-image-store.s3.amazonaws.com/0/96277/1e1c7220-9272-70b7-bcab-712163252340.png)

Okayを押し、

![2018-01-02 (2).png](https://qiita-image-store.s3.amazonaws.com/0/96277/20b730cc-323e-0d66-4007-0713b80d310b.png)

ここまで行けばAVSとの認証が完了しています。
JavaアプリにもどってOKを押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/5d093846-3b9e-0070-5a9f-7ed8d90a8928.png)

下記のようにトークンが入力済みでログオンされた状況になります。

![2018-01-02 (3)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/96277/e345c73a-ab05-1ccd-ff59-7fd719b7a6d5.jpeg)

ここでボタンを押して会話から話し始めてもよいですし、3.のコマンドを実行することでwakeコマンド待ちになっていますので、「Alexa」と話しかければ勝手に会話Onになります。

# 実行結果

マイクから「Alexa、明日の天気は？」と話しかけるとWestLakeの天気を教えてくれます。
履歴も下記で閲覧可能です。
https://alexa.amazon.com/spa/index.html#settings/dialogs
(日本語) https://alexa.amazon.co.jp/spa/index.html#settings/dialogs

~~注意したいのは、alexa.amazon.co.jpの同一管理画面もあるのですが、こちらにはなぜか紐づきません。~~
~~（開発者ダッシュボードのどこかでサーバ設定ができたのかもしれませんが、どこかよくわかっていません）~~
~~alexa.amazon.comにアクセスすれば履歴が見られます。~~

上記も嘘でした。amazon.co.jpのアカウントをちゃんと開発者アカウントとして登録すればいけます。
amazon.com, amazon.co.jp両方に同じメールアドレス、パスワードでアカウントがあるとまずいらしいです。（最初にamazon.comで認証してだめならamazon.co.jpに飛ばすんですね。。。へぇ）
https://qiita.com/Dimeiza/items/182c4847d7c1ead7df54#amazoncojp%E3%81%A8amazoncom%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
https://dev.classmethod.jp/voice-assistant/solution-of-a-problem-amazon-com-account-conflict/

# ~~うまくいかなかったこと~~

音声がbluetoothスピーカから出ずになぜかアナログ出力から出てきます。。。
~~いろいろ調べてみたのですが、いくつかの条件が重なってまだ未対応な部分となっています。~~
~~- もともとこのアプリがOracle JDKベースで実装されていること~~
~~- OracleJDKはLinuxのPulseAudioという仕掛けに対応できないこと~~
~~- PulseAudioを使わないとBluetoothに接続できないこと~~
~~- OpenJDKを使ってみるとこんどは別のSSL認証で失敗すること。。。~~

(修正 2018/1/3)
bluetoothから音が出ました！
[１章](https://qiita.com/onelittlenightmusic/items/05b262c60c4889c07ca9#201813%E8%BF%BD%E8%A8%98-%E3%81%82%E3%81%A8%E3%81%A7alexa%E3%82%92%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8bluetooth%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%81%8B%E3%82%89%E3%81%97%E3%82%83%E3%81%B9%E3%82%89%E3%81%9B%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEjava%E8%A8%AD%E5%AE%9A)に追記しましたが、下記を記述することでPulseAudio→Bluetoothで音がなりました。

```/usr/lib/jvm/java-8-oracle/jre/lib/sound.properties
javax.sound.sampled.Clip=com.sun.media.sound.DirectAudioDeviceProvider
javax.sound.sampled.Port=com.sun.media.sound.PortMixerProvider
javax.sound.sampled.SourceDataLine=com.sun.media.sound.DirectAudioDeviceProvider
javax.sound.sampled.TargetDataLine=com.sun.media.sound.DirectAudioDeviceProvider
```