Alexa スキルを作ろう ( 1 )

January 10, 2018

開発する Alexa Skill について

最近、ようやく Amazon Echo Dot が届いたので、折角なので Alexa Skill を開発してみました。
とりあえず、ぱっと欲しいスキルが思いつかなかったので、Alexa にお願いしたらインスタンスを起動してくれるスキルを作ることにしました。

こちらの記事が大変参考になりました。
この記事では、Alexa Skill を開発するにあたり必要なそれぞれの概念については説明を省きます。

Step 1. Lambda 関数の作成

まずは、Alexa Skill のバックエンドとして稼働する Lambda 関数の作成です。
alexa-skill-kit-sdk-factskill っていうテンプレがあるのでそこから作るのが良いです。

実際に作成したコードは以下。

const AWS = require('aws-sdk');  
const Alexa = require('alexa-sdk');  
AWS.config.region = 'ap-northeast-1';  
  
const ec2 = new AWS.EC2();  
const params = {  
  MaxCount: 1,   
  MinCount: 1,   
  DisableApiTermination: false,  
  DryRun: false,  
  EbsOptimized: false,  
  ImageId: 'ami-xxxxxxxx',  
  InstanceInitiatedShutdownBehavior: 'stop',  
  InstanceType: 't2.micro',  
  Ipv6AddressCount: 0,  
  KeyName: 'YourKeyName',  
  Monitoring: {  
    Enabled: true  
  },  
  SecurityGroupIds: [  
    'sg-xxxxxxxx'  
  ],  
  SubnetId: 'subnet-xxxxxxxxx',  
  TagSpecifications: [  
    {  
  
      ResourceType: 'instance',  
      Tags: [  
        {  
          Key: 'Name',  
          Value: 'FromAlexa'  
        }  
      ]  
    },  
  ],  
};  
  
const APP_ID = undefined;  
const languageStrings = {  
    'ja': {  
        translation: {  
	        ANSER_MESSAGE: "インスタンスを起動しました。",  
            HELP_MESSAGE: "このスキルは、インスタンスを起動するスキルです。",  
            STOP_MESSAGE: "スキルを終了します。"  
        },  
    },  
};  
  
const handlers = {  
    'LaunchRequest': function () {  
	this.emit("AMAZON.HelpIntent");  
    },  
    'AMAZON.HelpIntent': function () {  
        const speechOutput = this.t('HELP_MESSAGE');  
        this.emit(':tell', this.t('HELP_MESSAGE'));  
    },  
    'AMAZON.CancelIntent': function () {  
	this.emit("AMAZON.StopIntent");  
    },  
    'AMAZON.StopIntent': function () {  
	const speechOutput = this.t('STOP_MESSAGE');  
	this.emit(":tell", speechOutput);  
    },  
    "RunInstanceIntent": function() {  
        const speechOutput = this.t("ANSER_MESSAGE");  
        const test = this;  
	ec2.runInstances(params, function(err, data) {  
	    if (err) console.log(err, err.stack);   
	    else {  
		test.emit(":tell", speechOutput);  
	    }  
	});  
    }  
};  
  
exports.handler = function (event, context) {  
    const alexa = Alexa.handler(event, context);  
    alexa.APP_ID = APP_ID;  
    alexa.resources = languageStrings;  
    alexa.registerHandlers(handlers);  
    alexa.execute();  
};  

RunInstanceIntent で実行する ec2.runInstances() 内では this.emit() が使えないので、一旦別のオブジェクトに代入したりしてる以外は特に気をつけるところはありません。

あとは Lambda 関数のトリガーを “Alexa Skills Kit” にしてあげましょう。

f:id:shiro_kochi:2018××××××××:plain:w100:left

あ、あと作成した Lambda 関数の ARN を控えておきましょう。

Step 2. Amazon 開発者ポータル

Amazon 開発者ポータルから、いよいよ Alexa Skill の登録を行います。

まずは、以下のように Skill Inforamtion より、開発するスキルの名前、呼び出し名などを決めます。

f:id:shiro_kochi:2018××××××××:plain:w100:left

上記の例だと、「Alexa、“コンソール” を開いて」でスキルが使用されることになります。

次に、Intent Schema で、それぞれの機能の詳細を決定して行きます。
今回、インスタンスを起動するための Intent として RunInstanceIntent を定義してます。
先ほどの Lambda 関数でも使われていたやつですね。

f:id:shiro_kochi:2018××××××××:plain:w100:left

さらに Sample Utterances で Intent を呼び出すためのパターンをいくつか書いておきます。

f:id:shiro_kochi:2018××××××××:plain:w100:left

あとは Configuration で作成した Lambda 関数を指定すれば準備完了です。

f:id:shiro_kochi:2018××××××××:plain:w100:left

Test タブよりテストができるので、やってみましょう。

f:id:shiro_kochi:2018××××××××:plain:w100:left

実際に想定されるレスポンスが得られていることがわかりますね。

実機テスト

折角作ったので、やはり実機で試したいですよね。
Skills Beta Testing で、自分のアカウントのみにスキルをβ公開し、試すことが可能です。Skills Beta Testing を有効にするには、Publishing InformationPrivacy & Compliance で必要事項を記入する必要があります。
これを記入すると(?)、開発したスキルが公開されるかどうかの審査が入ります。もし審査に通ってしまったら自分のアカウントにインスタンスが乱立する恐れがあります。スキル名を「テストスキル」とかにしておけば、審査で「公開用のスキルじゃないんだなぁ」と判断され、一般公開されることはありません。
βテストの設定が終了したら、自分の Alexa アプリからスキルを有効化し、試してみましょう。

「Alexa、コンソールを開いてインスタンスを起動して」

と言うと、

「インスタンスを起動しました」

と言われ、実際に自分のアカウント内でインスタンスが起動されていることが確認できました!(誰得)


 © 2023, Dealing with Ambiguity