この記事は公開されてから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" がレスポンスで返されています
そのまま次はrepeatを入力します。
リクエストのattibutesにはハンドラでattributesにセットした内容が入っています。
レスポンスのsessionAttributesにもおなじキーと値が入っています。
ちゃんとAMAZON.RpeatIntentがハンドルされてoutputSpeechにもattributesに保持した内容が返されていますね
最後に
sessionAttributeの利用は複雑な対話を形成する際には、ほぼ必須になってきますのでいろんなシーンでの利用例をどんどん作っていければとおもいます