10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Amazon Echo 自由に喋らせる

Last updated at Posted at 2020-12-15

経緯

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!
地道に修正しましょ・・・。

めでたしめでたし。

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?