Alexaスキル開発でのSessionAtributesの活用例
はじめに
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の利用は複雑な対話を形成する際には、ほぼ必須になってきますのでいろんなシーンでの利用例をどんどん作っていければとおもいます