Alexa Skills Kit + IRKitを使って家電を操作する
前回は、IFTTTを使って家電を操作してみました。
yamano3201.hatenablog.jp
今回はAlexa Skills Kitを使って家電を操作してみます。下の2つの記事を参考にしました。
Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発 : Alexa Blogs
7. 自作した日本語のAlexa SkillをEcho dotで動かす - Qiita
設定が終わると、「Alexa、アイアールキットでテレビをつけて」と話しかけると、テレビをつけることができるようになります。
流れを書いていきます。
- Amazon DeveloperアカウントとAWSアカウントを作成
- Alexa Skills Kitを作成
- Lambda関数の作成
- Lambda関数の更新
- Alexa Skills Kitの設定
- Skills Beta TestingでEchoを動かす
- スキル有効化
- 最後に
Alexa Skills Kitを作成
まずはAmazon Developerアカウントで作業します。
スキル情報
- スキルの種類
- カスタム対話スキル
- 言語
- Japanese
- スキル名
- IRKitSkill(任意)
- 呼び出し名
- アイアールキット(任意)
ここでは呼び出し名が重要になってきます。
次に対話モデルを作成していきます。
インテントスキーマ
{ "intents": [ { "intent": "TargetOnIntent", "slots": [ { "name": "Target", "type": "LIST_OF_TARGETS" } ] }, { "intent": "TargetOffIntent", "slots": [ { "name": "Target", "type": "LIST_OF_TARGETS" } ] } ]}
Intentは機能と紐付いています。ここではターゲットをオンにするIntentと、オフにするIntentを用意しました。
slotsは項目と紐付いてます。同じオンにするIntentでも項目は複数あるので必要な分だけ用意します。ここではターゲットとしました。
カスタムスロットタイプ
- LIST_OF_TARGETS
- テレビ | リビング | エアコン
slotsを3つ用意しました。ここではslotsのtype名を指定します。
サンプル発話
TargetOnIntent {Target} をつけて TargetOffIntent {Target} を消して
Intentと呼び出し方を紐付けます。slotsを使用する場合はslotsのnameを{}で指定します。
IDを確認
Lambda関数の作成で使うのでIDを確認しておきます。左上に表示されています。
amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxx
Lambda関数の作成
ここからはAWSアカウントで作業します。
一から作成
- 名前
- IRKitSkill (任意)
- ランタイム
- Python3.6
- ロール
- IRKitSkillRole (任意)
- Lambdaに信頼関係があり、AWSLambdaBasicExecutionRoleのポリシーがついたロールを作成します。
- IRKitSkillRole (任意)
Lambda関数の更新
ローカルで作成したものをzipにしてアップロードします。
ここからはローカルで作業します。
モジュールインストール
まずはrequestモジュールをインストールします。
$ sudo /usr/bin/pip-3.6 install requests -t .
コード作成
続いてlambda_function.pyを作成します。
説明のためにコードはシンプルにしています。
import requests import json def post_message(clientkey, deviceid, data): message = { "format": "raw", "freq": 38, "data": data } params = { 'clientkey': clientkey, 'deviceid': deviceid, 'message': json.dumps(message) } res = requests.post( 'https://api.getirkit.com/1/messages', params=params, headers={'Content-Type': 'application/x-www-form-unlencoded'} ) print(res.status_code) def lambda_handler(event, context): intent = event['request']['intent']['name'] target = event['request']['intent']['slots']['Target']['value'] clientkey = 'XXXXXXXXXXXXXXXXXX' deviceid = 'XXXXXXXXXXXXXXXXXX' data_hash = { 'TargetOnIntent': { 'テレビ': [18031,8755,1190...], 'リビング': [17421,8755,1232...], 'エアコン': [6881,3341,904...] }, 'TargetOffIntent': { 'テレビ': [18031,8755,1190...], 'リビング': [17421,8755,1111...], 'エアコン': [6881,3341,904...] } } data = data_hash[intent].get(target) post_message(clientkey, deviceid, data) if intent == 'TargetOnIntent': text = f'{target} をつけました' elif intent == 'TargetOffIntent': text = f'{target} を消しました' response = { 'version': '1.0', 'response': { 'outputSpeech': { 'type': 'PlainText', 'text': text } } } print(text) return response
clientkey, deviceid, 赤外線Dataは事前に用意しておきます。
Intentとslotsによって赤外線Dataが変わるので、そのようなハッシュ値をもたせています。
zipにしてアップロード
$ zip -r lambda_function.zip . $ aws lambda update-function-code --function-name IRKitSkill --zip-file fileb://lambda_function.zip
事前にクレデンシャルかIAMロールを準備しておきましょう。
トリガー作成
- トリガーの追加
- Alexa Skills Kitを設定
- アプリケーションID
- Alexa Skills Kit作成時に確認したID
Alexa Skills Kitの設定
再びAmazon Developerアカウントで作業します。
Skills Beta TestingでEchoを動かす
実際に持っているEchoで動かすには、Skills Beta Testingに登録する必要があります。
公開情報やプライバシーとコンプライアンスを入力しないと登録できないので注意。
公開情報を入力する。
アイコンの入力が必須です。
プライバシーとコンプライアンスを入力する
入力する。
Skills Beta Testingに登録する
Echoと紐付いているAmazonアカウントのメールアドレスを登録します。
メールがくるので、JP Customersというリンクをクリックします。
スキル有効化
最後にAlexaアプリからスキルを有効化します。
最後に
内容的にも公開する予定がないものなので、Skills Beta Testingで動かせたので一旦終了。
これで「Alexa、アイアールキットでテレビをつけて」で動くようになりました。