Amazon Echo 自由に喋らせる

## 経緯

https://qiita.com/ABK28/items/1672fe26837c364a8de3
の記事で、Google-home-notifierを使って、 Google Home を自由に喋らせていて、とても便利だったんですが、 GoogleのAPIが変わったみたいで、動かなくなってしまいました。
自力で解決するスキルはなく、かといって、ライブラリを作ってくれた horihiroさんに催促するなんて 申し訳なくて とても できませんので、勉強兼ねて、今回は、Alexaを喋らせてみることにしました。

ESP8266でやるのは大変そうだったんですが、先日、別目的でラズパイを買ったので、そこで動かしてみることに・・・。

## 仕組み
今まで作ったESP8266の各マシンでから喋らせたものを、ラズパイを経由して喋らせたかったので、WEB-API っぽくしました。

http://raspberrypi.local/speak.sh?mes=こんにちわ

みたいな感じ・・。

https://qiita.com/shge/items/169de61c8f246d26c110
を参考にしました。
ありがとうございます。
シェルスクリプトで、Alexaを喋らせる「alexa-remote-control.sh」ってのを使います。

https://github.com/thorsten-gehrig/alexa-remote-control

自分は、Plain バージョン （alexa_remote_control_plain.sh）を使いました。


## ラズパイでWEBサーバ構築

先ず、nginxを入れます。
以下、 ``sudo su`` した状態で作業してます。

### パッケージでいろいろインストール

```
# apt install nginx
```

次に、fcgiwrap　を入れます。

```
# apt install fcgiwarp
```

次に、spawn-fcgi を入れます。

```
# apt install spawn-fcgi
```

漢字変換のために、nkfも入れます。

```
# apt install nkf
```

このくらいだったかな・・・。
実際には試行錯誤しながら入れました(^^;

### fcgiwrapの設定

fcgiwrapを使うと、シェルスクリプトをCGIとして実行することができます。

fcgiwrapをインストールすると、``/etc/nginx/nginx.conf`` の先頭に、

```
user www-data;
```
が挿入されていました。このユーザーで動作するようです。
又、``/etc/nginx``フォルダに、関連するファイルがインストールされていました。

この設定を、nginxのコンフィグに書き足します。


```
# cd /etc/nginx/sites-available
# vi default
```

下記を、いい感じのところ（serverの中）に、書き足します。

```
	location ~ \.sh$ {
		try_files $uri =404;
		root   /var/www/html/;
		fastcgi_split_path_info	^(.+\.sh)(/.+)$;
		fastcgi_pass      unix:/var/run/fcgiwrap.socket;
		include           /etc/nginx/fastcgi_params;
		fastcgi_param     DOCUMENT_ROOT /var/www/html;
		fastcgi_param     SCRIPT_FILENAME   $document_root$fastcgi_script_name;
		fastcgi_intercept_errors	on;
	}
```

servernameも書き換えておきました。
別投稿の通り、mDNSで名前解決するようにしてあります。

```
	server_name raspberrypi.local ;
	# server_name _;
```

### nginx 実行

nginx と fcgiwrap  を 起動します。

```
/etc/init.d/fcgiwrap start
/etc/init.d/nginx start
```

ブラウザーで、nginx の画面がでればOKです！

```
http://raspberrypi.local/
```

## alexa-remote-control.sh の導入

自分のMacで、下記にアクセスして、クローンをダウンロードしました。
``https://github.com/thorsten-gehrig/alexa-remote-control``

展開したファイルのうち、今回は、``alexa_remote_control_plain.sh``を使いました。

ターミナルから、ラズパイにアップしました。

```
% scp alexa_remote_control_plain.sh pi@raspberrypi.local:
```

ラズパイで、``/var/www/html`` にコピーします。権限も変えておきます。

```
# cp /home/pi/alexa_remote_control_plain.sh /var/www/html/alexa.sh
# chmod 755 alexa.sh
```

中身を書き換えます。

```
SET_EMAIL: Amazonのログインメールアドレス
SET_PASSWORD: Amazonのパスワード　
SET_MFA_SECRET: Amazonの認証コード　
SET_LANGUAGE: ja-JP
SET_TTS_LOCALE: ja-JP
SET_AMAZON='amazon.co.jp'
SET_ALEXA='alexa.amazon.co.jp'
```

###パスワード
平文で書くのはイヤですよね？
なので、下記の方法で、暗号化することにしました。
「パスフレーズ」は、いろんな方法があると思いますので、おまかせします・・。
自分は、式を組み合わせてパスフレーズを導くようなスクリプトにしました。

```
# 暗号化
echo 平文のパスワード | openssl enc -e -des -base64 -k パスフレーズ
```

ちなみに、下記で復号できるか確認します。

```
# 復号化
echo 暗号化したパスワード | openssl enc -d -des -base64 -k パスフレーズ
```

``SET_PASSWORD: Amazonのパスワード`` のところは、この復号化の式を入れます。

```
SET_PASSWORD=`echo 暗号化したパスワード | openssl enc -d -des -base64 -k "$(パスフレーズを導くスクリプト)"`
```


###認証コード
下記を控えて、記載します。
１）Amazon.co.jpにログイン
２）「アカウントサービス」→「ログインとセキュリティ」
３）「2段階認証の設定」→　2段階ログイン
４）「新しいアプリの追加」→「バーコードをスキャンできませんか。」を押すと出てくるコード

### 喋るかテスト
では、Amazon Echo が、喋るか試してみます。

```
# ./alexa.sh -e "speak:テスト"
```

しゃべったー！
すげー！


## CGI（シェル）の作成
わかりやすい名前ですが・・、``speak.sh``を作りました。
先ずは、実験で、下記（``cgi-test.sh``）を作りました。権限は755で。

```
#!/bin/sh
echo 'Content-type: text/html'  
echo ''
echo '<html>'
echo '<head>'
echo '<meta http-equiv="content-type" charset="utf-8">'
echo '</head>'
echo '<body>'
echo 'This is test.'
echo '</body>'
echo '</html>'
#
```

```
# curl http://raspberrypi.local/cgi-test.sh
```
動きました！
OK！

では、これを修正して、``speak.sh``を作ります。

```
#!/bin/sh
key=`echo "${QUERY_STRING}" | sed -e "s/\(.*\)=.*/\1/"`
value=`echo "${QUERY_STRING}" | sed -e "s/.*=\(.*\)/\1/"`
value=`echo ${value} | tr '%' '=' | nkf -WwmQ`
MSG=`./alexa.sh -e "speak:${value}"`
echo $MSG
echo 'Content-type: text/html'  
echo ''
echo '<html>'
echo '<head>'
echo '<meta http-equiv="content-type" charset="utf-8">'
echo '</head>'
echo '<body>'
echo "Speaking... ${value}"
echo '</body>'
echo '</html>'
#
```

ブラウザーからのパラメータは、``${QUERY_STRING}``　に入ります。
例えば、``mes=テスト``みたい入ります。
それを、keyとvalueに分離します。
さらに、valueは、URLエンコードされているので、デコードしました。

### ブラウザからのテスト

```
http://raspberrypi.local/speak.sh?mes=こんにちわ
```

喋ったあと、
画面には、
Speaking... こんにちわ
と出ます。

##完成
あとは、ESP8266で作ったマシンのなかで、これまで Google Home を喋るように記載していた部分を、このhttpを呼ぶように変更すればOK!
地道に修正しましょ・・・。

めでたしめでたし。