Raspberry Pi に設置したローカルサーバー(Flask-Ask + ngrok)でAlexaスキルを動かす

これまでAlexaスキルのバックエンド処理をAWS Lambdaで作成していましたが、Flask-Ask + ngrok を使って、 Raspberry Pi 上に設置したローカルサーバーでAlexaスキルを動かすことを試したので、そのメモになります。

ローカルサーバーだと身近なデータを簡単に利用することができるので便利かも!!

1.Alexa Skills Kit で Skill作成

Alexa Skills Kit (ASK) を使ってフロント側を作成します。

Alexaのスキルを自作しよう! - slideship.com

以前こちらの資料にまとめましたが、2018年3月の時点でBeta版だったものが正式リリースされていて、新しいUIになっていました。 古いUIでスキル作成していれば理解できると思うので、詳細は割愛。

1点だけ、エンドポイントの設定が、今回AWS Lambdaではないので、バックエンド側の処理を作成して動作させてから設定します。 => 4. 参照

2. Flask-Askでバックエンド処理を実装

Flask-Askとは

Python製のWebフレームワークFlaskを拡張して作成された、Alexaスキルの開発用フレームワークです。

github.com

$ 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トークンが記載されているのでコピーします。

f:id:electricSheep:20180418152000p:plain

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 でエンドポイントを設定する

f:id:electricSheep:20180418163157p:plain

上記設定したら「エンドポイントを保存」する

で、再度「モデルをビルド」します

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

で、再度テスト!

f:id:electricSheep:20180418161236p:plain

できた!

感想など

  • ngrok、無料枠でもhttps にも対応していて便利すぎる!
  • ローカルのサーバーで動かせると手軽に身近なデータ使ってスキル作れるのでよい。
  • ちょっと前まで音声認識にJulius使って一つ一つ辞書登録していた頃を思うと、Alexaの発話認識+合成音声を無料で簡単に使えてすばらしい。
  • しかし、Juliusはスタンドアロンで動作するので、それはそれで素敵です。
  • stackoverflow ありがたい。エラーつらい。