Raspberry Pi2 で Alexaに話してみる

#はじめに
Amazon Echoが気になって、「Amazon Echo Alexa」とかで検索してると
たまたま、Raspberry Pi2でも作れるということで、せっかくなので、作ってみたいと思い、
マイクとスピーカーを買って作ってみました。
実は、これを書くまでに１度失敗してます。何が失敗だったのか分からないくらいいじりすぎたので、
もう一度、さらからやりなおすことに。
そこで、メモしたので、ログ残しします。

#参考文献
参考にしたのは、[ここ](https://github.com/amzn/alexa-avs-raspberry-pi)と[ここ](http://qiita.com/sparkgene/items/4926a41fb07b078e4430)。

#今回準備したもの
- Raspberry Pi2(Model B)
- TaoTronics Bluetooth 4.0 ポータブルスピーカー　A2DP対応　（ブラック）TT-SK05
- iBUFFALO マイクロフォン USB音源 ブラック BSHSM05BK
- BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2

#Raspberry Pi2のイメージ
- 2016-03-18-raspbian-jessie.zip

#前提条件
- Raspberry Pi2は起動する状態であること
- 無線LANの設定が終わってること（通信できる状態であること、ここでは仮にIPアドレスを「192.168.0.10」とします）

#ここから設定開始
##SSHでログイン
次のコマンドを実行して、Raspberry Pi2にログインする。
`ssh pi@<Raspberry Pi2のIPアドレス>`
##VNC Serverのインストール
次のコマンドを実行して、VNC Serverをインストールします。
`sudo apt-get install tightvncserver`
##VNC Serverの設定
VNC Serverが自動起動してくるように設定します。
`cd /home/pi/.config`
`mkdir autostart`
`cd autostart`
`vi tightvnc.desktop`
でファイルを作成していきます。
> [Desktop Entry]
> Type=Application
> Name=TightVNC
> Exec=vncserver :1
> StartupNotify=false

ここで、リブートします。
`sudo reboot`

##Raspberry Pi2にVNCで接続
Finder→移動→サーバへ接続
を選択して、「vnc://192.168.0.10:5901」を入力し、「接続」ボタンをクリック

##VLCのインストール
次のコマンドを実行して、VLCをインストールします。
`sudo apt-get install vlc-nox vlc-data`
`sudo echo export LD_LIBRARY_PATH=/usr/lib/vlc > ~/.bashrc`
`sudo echo export VLC_PLUGIN_PATH=/usr/lib/vlc/plugins > ~/.bashrc`

##Node.jsインストール
次のコマンドを実行して、Node.jsをインストールします。
```sudo apt-get update
sudo apt-get upgrade
curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install nodejs
```

##Java8のインストール
※2016/06/06時点でのJavaです。
以下のURLからJava SE Development Kit 8u91をダウンロードする
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

次のコマンドを実行して、Java8をインストールします。
```sudo tar zxvf jdk-8u77-linux-arm32-vfp-hflt.tar.gz -C /opt
sudo update-alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_77/bin/javac 1
sudo update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_77/bin/java 1
sudo update-alternatives --config javac
sudo update-alternatives --config java
```

##Mavenのインストール
※2016/06/06時点でのMavenです。
以下のURLからApache Maven 3.3.9をダウンロードする
https://maven.apache.org/download.cgi

次のコマンドを実行してMavenをインストールします。
```sudo tar zxvf apache-maven-3.3.9-bin.tar.gz -C /opt
sudo echo export M2_HOME=/opt/apache-maven-3.3.9 > ~/.bashrc
sudo echo export PATH=$PATH:$M2_HOME/bin > ~/.bashrc
```

##Alexa Voice Serviceの用意（その１　: Product登録とセキュリティプロファイルの作成）
ここはこのまま参考元のページの手順を実施すればOKです。
https://github.com/amzn/alexa-avs-raspberry-pi
このURLの「3 - Getting started with Alexa Voice Service」に書かれてる
以下の章を実行してください。
- Register for a free Amazon Developer Account
- Register your product and create a security profile.

注意点としては
- amazon.comにアカウントを作っておくこと
これくらいです。

##Alexa Voice Serviceの用意（その２ : Raspberry Pi2 へのプログラム展開
以下のURLからAlexa Voice ServiceのサンプルアプリZIPをダウンロードします。
https://github.com/amzn/alexa-avs-raspberry-pi/archive/master.zip

ZIPを解凍し、/opt配下にコピーする
（以降、/opt/alexa-avs-raspberry-pi*フォルダを<< REFERENCE_IMPLEMENTATION >>とします）

##OpenSSLのインストール
次のコマンドを実行して、OpenSSLをインストールします。
`sudo apt-get install openssl`

##オレオレ証明書作成準備
次のコマンドを実行して、ファイルを開きます。
`vi << REFERENCE_IMPLEMENTATION >>/samples/javaclient/ssl.cnf`

で以下の内容のように修正してください。
> commonName              = $ENV::COMMON_NAME
> countryName             = JP
> stateOrProvinceName     = Osaka
> localityName            = OsakaCity
> organizationName        = raspi
> organizationalUnitName  = alexa

※「countryName」は「JP」にしてください。

##オレオレ証明書の作成
次のコマンドを実行して、オレオレ証明書を作成します。
```
cd << REFERENCE_IMPLEMENTATION >>/samples/javaclient
chmod +x generate.sh
./generate.sh
```

実行してる時に、いくつか入力待ちになるので、以下を入力します。
「Product ID」には、「3.4」で入力した「Device Type ID」を入れる
「Serial Number」には、「123456」と固定で入れてください（もし入力を変えた場合は、ちゃんと覚えておいてください）
「Password for Keystores」には何も入れずにEnterキーを押してください（もし入力を変えた場合は、ちゃんと覚えておいてください）


##config.jsの更新
<< REFERENCE_IMPLEMENTATION >>/samples/companionService/config.jsを開いて、以下を更新してください。

> sslKey: '/opt/alexa-avs-raspberry-pi/samples/javaclient/certs/server/node.key',
> sslCert: '/opt/alexa-avs-raspberry-pi/samples/javaclient/certs/server/node.crt',
> sslCaCert: '/opt/alexa-avs-raspberry-pi/samples/javaclient/certs/ca/ca.crt',

##config.jsonの更新
<< REFERENCE_IMPLEMENTATION >>/samples/javaclient/config.jsonを開いて、以下を更新してください。

```json
{
    "productId":"",
    "dsn":"",
    "provisioningMethod":"",
    "companionApp":{
        "localPort":8443,
        "sslKeyStore":"<< REFERENCE_IMPLEMENTATION >>/samples/javaclient/certs/server/jetty.pkcs12",
        "sslKeyStorePassphrase":"",
        "lwaUrl":"https://api.amazon.com"
    },
    "companionService":{
        "serviceUrl":"https://localhost:3000",
        "sslClientKeyStore":"<< REFERENCE_IMPLEMENTATION >>/samples/javaclient/certs/client/client.pkcs12",
        "sslClientKeyStorePassphrase":"",
        "sslCaCert":"<< REFERENCE_IMPLEMENTATION >>/samples/javaclient/certs/ca/ca.crt"
    }
}
```
※「sslKeyStorePassphrase」は「オレオレ証明書の作成」の「Password for Keystores」と同じ

##依存関係のインストール
以下のコマンドを実行して、依存関係のインストールをします。

```
cd << REFERENCE_IMPLEMENTATION >>/samples/companionService
npm install
```

##セキュリティファイルの有効
ここはこのまま参考元のページの手順を実施すればOKです。
https://github.com/amzn/alexa-avs-raspberry-pi
このURLの「6 - Enable Security Profile」に書かれてる

##コンフィグファイルの更新
ここはこのまま参考元のページの手順を実施すればOKです。
https://github.com/amzn/alexa-avs-raspberry-pi
このURLの「7 - Updating the config files」に書かれてる

##サーバの起動
Terminalを起動し、次のコマンドを実行し、サーバを起動します

```
cd << REFERENCE_IMPLEMENTATION >>/samples/companionService
npm start
```

##クライアントの起動
Terminalを起動し、次のコマンドを実行し、クライアントを起動します。

```
cd <REFERENCE_IMPLEMENTATION>/samples/javaclient 
mvn validate
mvn install
mvn exec:exec
```

##Amazon.comへのログインと承認
ここはこのまま参考元のページの手順を実施すればOKです。
https://github.com/amzn/alexa-avs-raspberry-pi
このURLの「10 - Obtain Authorization from Login with Amazon」に書かれてる

##Alexaとお話し。
「Start Listening」ボタンを押して、話してみてください。
いいお友達になれると思います。
僕はいろいろ話してみました。が、ご理解いただけないこともしばしば。
発音が悪かったんですね。精進します。