Alexaスキル開発でのSessionAtributesの活用例

2017.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Alexaスキルでは対話中にユーザーとAlexaとの間で動的な情報を保持しておきたい事がよくあります。

例えばピザの注文を受け付けるスキルがあったとして、ユーザーが発話した「ピザの種類」「サイズ」「個数」などです。必要な全ての情報をスキルが取得できてるかどうか判断して、足りない情報を埋めるように促したりします。

これらの必要な情報をスキルで保持しておく方法の一つがSessionAtributesの利用です。 AlexaSDKにはSessionAtributesを簡単に利用できる仕組みがあります。 今回はAlexaSDKでのSessionAtributesの利用例を紹介したいと思います。 AlexaSDKの導入や使い方は以下の記事で紹介されています。

Alexa Skills Kit for Node.js はじめの一歩

今回の利用例ではAlexaスキルが発話した直前の内容を保持し、ユーザーからの命令で同じ内容をもう一度発話させてみます。

日常の会話でも相手の言葉を聞き逃したりした時に「ごめん、もう一回言って」などのシーンはよくありますね

IntentSchemaの定義

「repeat」や「say that again」などの繰り返しを要求する言葉をハンドルする為に、Amazon.RepeatIntentをIntentSchemaに記述します

{
  "intents": [
    {
      "intent": "AMAZON.HelpIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"
    },
    {
      "intent": "AMAZON.YesIntent"
    },
    {
      "intent": "AMAZON.NoIntent"
    },
    {
      "intent": "AMAZON.RepeatIntent"
    },
    
    ...
    
  ]
}

Amazon.RepeatIntentはAmazonが用意してくれている「Built-in Intent」の一つです 「Built-in Intent」については以下の記事でも紹介されています

Alexa Skill KitでAmazonが用意したBuilt-In IntentとBuilt-In Slot Typeをひたすらまとめてみる

ハンドラ

起動時のLaunchRequestでながれるメッセージを、this.attributes['speechOutput']で保持します。

その後にユーザーからの命令でAmazon.RpeatIntentがハンドルされた時にthis.attributes['speechOutput']を返答する内容としています

var Alexa = require('alexa-sdk');
const alexaAppId = process.env.ALEXA_APPLICATION_ID

var newSessionHandlers = {
  'LaunchRequest': function() {
    this.attributes['speechOutput'] = "Welcome to repeat sample skills";
    this.emit(':ask', this.attributes['speechOutput'], this.attributes['speechOutput']);
  },
  'AMAZON.RepeatIntent': function() {
    this.emit(':ask', this.attributes['speechOutput'], this.attributes['speechOutput']);
  },
  'Unhandled': function() {
    this.emit(':ask', "help", "help");
  }
};

exports.handler = function(event, context, callback) {
    var alexa = Alexa.handler(event, context);
    alexa.appId = alexaAppId;
    alexa.registerHandlers(newSessionHandlers);
    alexa.execute();
};

Service Simulatorで確認してみる

まず起動します
起動時のリクエストには空のattributesが含まれます。スキル側でこのattributesにキーと値のマップを入れ、対話の継続中にやり取りを行います。 LaunchRequestがハンドルされてハンドラに記述した "Welcome to repeat sample skills" がレスポンスで返されています

alexa_launch_simulator

そのまま次はrepeatを入力します。
リクエストのattibutesにはハンドラでattributesにセットした内容が入っています。
レスポンスのsessionAttributesにもおなじキーと値が入っています。

alexa_repeat

ちゃんとAMAZON.RpeatIntentがハンドルされてoutputSpeechにもattributesに保持した内容が返されていますね

alexa_repeat_intent

最後に

sessionAttributeの利用は複雑な対話を形成する際には、ほぼ必須になってきますのでいろんなシーンでの利用例をどんどん作っていければとおもいます