経緯
https://qiita.com/ABK28/items/1672fe26837c364a8de3
の記事で、Google-home-notifierを使って、 Google Home を自由に喋らせていて、とても便利だったんですが、 GoogleのAPIが変わったみたいで、動かなくなってしまいました。
自力で解決するスキルはなく、かといって、ライブラリを作ってくれた horihiroさんに催促するなんて 申し訳なくて とても できませんので、勉強兼ねて、今回は、Alexaを喋らせてみることにしました。
ESP8266でやるのは大変そうだったんですが、先日、別目的でラズパイを買ったので、そこで動かしてみることに・・・。
仕組み
今まで作ったESP8266の各マシンでから喋らせたものを、ラズパイを経由して喋らせたかったので、WEB-API っぽくしました。
みたいな感じ・・。
https://qiita.com/shge/items/169de61c8f246d26c110
を参考にしました。
ありがとうございます。
シェルスクリプトで、Alexaを喋らせる「alexa-remote-control.sh」ってのを使います。
自分は、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 "$(パスフレーズを導くスクリプト)"`
###認証コード
下記を控えて、記載します。
1)Amazon.co.jpにログイン
2)「アカウントサービス」→「ログインとセキュリティ」
3)「2段階認証の設定」→ 2段階ログイン
4)「新しいアプリの追加」→「バーコードをスキャンできませんか。」を押すと出てくるコード
喋るかテスト
では、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!
地道に修正しましょ・・・。
めでたしめでたし。