Raspberry Pi に設置したローカルサーバー(Flask-Ask + ngrok)でAlexaスキルを動かす
これまでAlexaスキルのバックエンド処理をAWS Lambdaで作成していましたが、Flask-Ask + ngrok を使って、 Raspberry Pi 上に設置したローカルサーバーでAlexaスキルを動かすことを試したので、そのメモになります。
ローカルサーバーだと身近なデータを簡単に利用することができるので便利かも!!
1.Alexa Skills Kit で Skill作成
Alexa Skills Kit (ASK) を使ってフロント側を作成します。
- Webブラウザでhttps://developer.amazon.com/ja/にアクセス
Alexaのスキルを自作しよう! - slideship.com
以前こちらの資料にまとめましたが、2018年3月の時点でBeta版だったものが正式リリースされていて、新しいUIになっていました。 古いUIでスキル作成していれば理解できると思うので、詳細は割愛。
1点だけ、エンドポイントの設定が、今回AWS Lambdaではないので、バックエンド側の処理を作成して動作させてから設定します。 => 4. 参照
2. Flask-Askでバックエンド処理を実装
Flask-Askとは
Python製のWebフレームワークFlaskを拡張して作成された、Alexaスキルの開発用フレームワークです。
$ pip install flask-ask
pipでインストールしてバックエンド処理をかくだけ! 使い方の詳細は上記のgithub上に書かれています。
処理を書いたらローカルでサーバーを立ち上げます。
$ python3 alexa_skill_calc.py * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
3. ngrok を使って外部からRaspberry piのローカルサーバーにアクセスできるようにする
ngrokとは
ローカルで動いているサーバーを、LANの外からアクセスできるようにできるツール
使い方
1) ngrok のダウンロード https://ngrok.com
2) 任意のディレクトリにLinux(ARM)版をダウンロードして、解凍します。
$ mkdir ngrok $ cd ngrok/ $ mv ~/Downloads/ngrok-stable-linux-arm.zip . $ unzip ngrok-stable-linux-arm.zip
3) 無料枠があるので、アカウント登録します。 - 「Get Started for free」ボタンをクリックしてアカウント作成
4) 作成したアカウントログインすると、下記ページにアカウントに紐づけられたAuthトークンが記載されているのでコピーします。
Raspberry pi上でページに書かれているコマンドを実行します。
$ ./ngrok authtoken MpRxwKGG7Hn(省略)
5) ngrok を起動します
上記2のflask-askの実行 python3 alexa_skill_calc.py
により、現在ローカル環境(localhost)のポート5000番でWebアプリケーションが動作している状態で実行します。
$./ngrok http -region=ap 5000
ngrok by @inconshreveable (Ctrl+C to quit) Session Status online Account masako sugita (Plan: Free) Version 2.2.8 Region Asia Pacific (ap) Web Interface http://127.0.0.1:4040 Forwarding http://54f4263f.ap.ngrok.io -> localhost:5000 Forwarding https://54f4263f.ap.ngrok.io -> localhost:5000 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00
- 上記コマンドにて、 ポート
5000
を指定すると、ngrokが提供するURL(http(s))を通してローカル上のWebアプリケーションにアクセスすることができます。 - コマンドラインのオプションで、リージョン Asia Pacific (ap)
-region=ap
を指定することができます。 - ngrokの停止は、Ctrl + C で行います。
4. Alexa Skills Kit でエンドポイントを設定する
- HTTPSのチェックボックスにチェック
- デフォルトの地域
- ngroku起動で ngrokuから提供されたURLを設定
- 「開発者のエンドポイントは、証明機関が発行したワイルドカード証明書をもつドメインのサブドメインです」を選択
上記設定したら「エンドポイントを保存」する
で、再度「モデルをビルド」します
5.Alexaシュミレータでテスト!
が、なんかエラーになった;;;
flask-askを実行しているところで、スキルを呼び出すと下記エラーが・・・。
;;(省略) File "/home/pi/.local/lib/python3.5/site-packages/OpenSSL/crypto.py", line 740, in _subjectAltNameString method = _lib.X509V3_EXT_get(self._extension) AttributeError: module 'lib' has no attribute 'X509V3_EXT_get'
とりあえず、stackoverflowに同じような問題があったので、pyOpenSSLを一旦削除して再インストール。
$ pip3 freeze pyOpenSSL==17.0.0 $ pip3 uninstall pyOpenSSL $ pip3 install pyOpenSSL cryptography==2.2.2 pyOpenSSL==17.5.0
で、再度テスト!
できた!