やーまんぶろぐ

気が向いた時にだけ書くブログ

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を作成

まずは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のポリシーがついたロールを作成します。

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

Arnを確認

arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:IRKitSkill
XXXXXXXXXXXXXXXにはAWSのアカウントIDが入ります。

Alexa Skills Kitの設定

再びAmazon Developerアカウントで作業します。

SkillとLambda関数を紐付け

エンドポイント -> サービスエンドポイントのタイプ -> AWS Lambda ARN (Amazonリソースネーム) -> Lambda関数作成時に確認したArnを指定する。

Skills Beta TestingでEchoを動かす

実際に持っているEchoで動かすには、Skills Beta Testingに登録する必要があります。
公開情報やプライバシーとコンプライアンスを入力しないと登録できないので注意。

公開情報を入力する。

アイコンの入力が必須です。

プライバシーとコンプライアンスを入力する

入力する。

Skills Beta Testingに登録する

Echoと紐付いているAmazonアカウントのメールアドレスを登録します。
メールがくるので、JP Customersというリンクをクリックします。

スキル有効化

最後にAlexaアプリからスキルを有効化します。

最後に

内容的にも公開する予定がないものなので、Skills Beta Testingで動かせたので一旦終了。

これで「Alexa、アイアールキットでテレビをつけて」で動くようになりました。