はじめに
本記事は以下の内容が前提なので,まだ読まれていない方はまずそちらをご覧ください.
概要
いよいよTelloドローンをAlexaを使って声で操作してみましょう.インフラはPart1からの続きで同様にAWSを使用します.まず動画で完成形を見てみましょう.
システム構成図
前回まででIoTCoreとTelloの通信を確認したので,今回は実際にドローン操作用のスキルを開発し,lambdaでAlexaスキルのエンドポイントをホスティングするところまでやりましょう.
スキル開発
スキル作成
alexa developer console (以下ADC)にログインし,カスタムスキルを作成します.
スキルのバックエンドに「ユーザー定義のプロビジョニング」を選択すると自前でlambda関数を用意する必要があります.「Alexa-Hosted」を選択するとADC上のコードエディタを使えて初学者に易しく取っ付き易い気がします.IoTCoreとの通信するので今後の拡張性も考え,ここでは自前でlambda関数を用意する前者のやり方で行います.
というわけでlambdaを新しく用意します.lambdaのARNは控えといてスキルのエンドポイントでデフォルトの地域の箇所に設定します.
スキル用語集
スキルの基本用語を再確認します.後ほど詳しく触れます.
呼び出し名 | 対話(セッション)を始める合言葉 |
インテント | 対話の意図(開発者が自由に設定することができます) |
ビルトインテント | デフォルトで組み込まれているインテント(キャンセル・ストップ・ヘルプなど) |
サンプル発話 | セッション内で特定のインテントを呼ぶための合言葉 |
スロット | サンプル発話で保持させられる変数のようなもの |
ビルトインスロット | 既に用意されているスロット |
カスタムスロット | 開発者が自由に設定できるスロット |
スキル詳細
今回のドローン制御システムで設定したスキルの詳細です.(参考までに)
呼び出し名: 「コントローラー」
インテント: Controller/Land
ドローンを動かしたい時にControllerインテント, 着陸したい時にLandインテント(Flipインテントなんか面白そう)
サンプル発話:Contorollerインテントの場合
ビルトインスロット: num(数字)
カスタムスロット: direction(方向)
つまりControllerインテントでは,進む方向と距離の二つの情報が必要になります.好みになりますが,実際のスキルで方向しか声で入力されなかった場合に距離を聞き返す工夫をするべきです.
バックエンド
先程作ったlambdaをいじります.ここで「Alexa Skills Kit SDK」を使った方が絶対良いです.使わなくてもできますが,リクエストパラメータのjsonのネストが深くて処理がめんどくさいです.
言語はPythonにします.Nodejsを使う人が多くてPython使う人が少ないのでここではあえてPythonにしました.
Alexa Skills Kit SDK for Python
まずlambdaでask_sdk_coreをimportしてください.
$ import ask_sdk_core
ただそのままだと外部ライブラリは読み込めないのでask_sdk_coreをlayerとして追加しましょう.(ローカルでプロジェクトにpip installして,プロジェクト全体をzip化してlambdaにアップロードする方法もあります.以下のリンクではその方法およびlambdaのローカル開発のエコシステムをまとめましたので気になる方はご覧ください).
ask_sdk_coreはPurePythonなライブラリなのでlayer用のzipファイルを作る環境はどれでも大丈夫なはずです.MacOSで行いました.(python3.7の例)
$ mkdir -p build/python/lib/python3.7/site-packages $ pip3 install ask_sdk_core -t build/python/lib/python3.7/site-packages/ $ cd build $ zip -r ask_sdk.zip .
生成されたask_sdk.zipをlayerに追加し,lambda内でlayerを適応させればライブラリが読み込まれます.
lambdaトリガーの設定
今回のlambdaトリガーはもちろんAlexa Skill KitでスキルIDは先程作ったスキルのIDを貼り付けます.
まとめ
Alexaのスキルの対話モデルとlambdaとの連携ができました.次はlambdaのコード開発とIoTCoreの連携を行います.