Serverless FrameworkでAlexa Skills Kitのサンプルコードを試してみる(City Guide編)
AlexaでCity Guideを作るサンプルコードがGitHubに公開されています。 https://github.com/alexa/skill-sample-nodejs-city-guide これをローカルで試し […]
目次
AlexaでCity Guideを作るサンプルコードがGitHubに公開されています。
https://github.com/alexa/skill-sample-nodejs-city-guide
これをローカルで試してみたかったので、Serverless Frameworkに突っ込んでみました。
準備
$ npm install -g serverless
$ serverless create \
--path cityguide \
--template aws-nodejs \
--name serverless-alexa-city-guide
$ cd cityguide
$ npm init -y
$ npm install alexa-sdk ical --save
$ touch index.js
Copy example lambda code
以下のコードをindex.js
に貼り付けます。
https://github.com/alexa/skill-sample-nodejs-city-guide/blob/master/src/index.js
exports.handler = function (event, context, callback) {
alexa = Alexa.handler(event, context);
alexa.registerHandlers(newSessionHandlers, startSearchHandlers, topFiveHandlers);
alexa.execute();
};
上記のコードを、以下のように書き換えましょう。
module.exports.hello = function(event, context, callback) {
alexa = Alexa.handler(event, context);
alexa.registerHandlers(newSessionHandlers, startSearchHandlers, topFiveHandlers);
alexa.execute();
};
Configure Serverless.yml
Serverless Frameworkでは以下のように設定します。
functions:
hello:
handler: index.hello
events:
- alexaSkill
Test local(Alexa Skill起動)
Alexa Skillを起動させた時のメッセージを確認してみましょう。
以下のようなJSONをLambaにinvokeさせることで、動作確認が簡単に行えます。
$ sls invoke local -f hello -d '{
"session":{
"application":{
"applicationId":""
},
"user":{
"userId":""
}
},
"request":{
"type": "LaunchRequest"
}
}'
以下のレスポンスが返って来ればOKです。
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "SSML",
"ssml": "<speak> Seattle Guide. You can ask me for an attraction, the local news, or say help. What will it be? </speak>"
},
"shouldEndSession": false,
"reprompt": {
"outputSpeech": {
"type": "SSML",
"ssml": "<speak> You can ask me for an attraction, the local news, or say help. What will it be? </speak>"
}
}
},
"sessionAttributes": {
"STATE": "_SEARCHMODE"
}
}
シアトルのオススメスポットを聞いてみる
せっかくなので'getTopFiveIntent
というインテントを呼び出してみましょう。
今度は以下のようなJSONを読ませます。
$ sls invoke local -f hello -d '{
"session":{
"application":{
"applicationId":""
},
"user":{
"userId":""
}
},
"request":{
"type":"IntentRequest",
"intent": {
"slots": {},
"name":"getTopFiveIntent"
}
}
}'
以下の結果が返ってくる(はず)です。
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "SSML",
"ssml": "<speak> Here are the top five things to do in Seattle. Number 5: Take a spin on the Seattle Great Wheel.\n Number 4: Breathe in the culture at the Seattle Art Museum.\n Number 3: Earn your wings at the Museum of Flight.\n Number 2: Get shopping at Pike Place Market.\n Number 1: Visit the Space Needle and see Seattle from above.\n You can tell me a number for more information. For example open number one. </speak>"
},
"shouldEndSession": false,
"reprompt": {
"outputSpeech": {
"type": "SSML",
"ssml": "<speak> You can tell me a number for more information. For example open number one. </speak>"
}
},
"card": {
"type": "Simple",
"title": "Top Five Things To See in Seattle",
"content": "Here are the top five things to do in Seattle. Number 5: Take a spin on the Seattle Great Wheel.\n Number 4: Breathe in the culture at the Seattle Art Museum.\n Number 3: Earn your wings at the Museum of Flight.\n Number 2: Get shopping at Pike Place Market.\n Number 1: Visit the Space Needle and see Seattle from above.\n You can tell me a number for more information. For example open number one."
}
},
"sessionAttributes": {
"STATE": "_TOPFIVE"
}
}
元ソースをみると配列で定義された内容が読み上げられていることがわかります。
サンプル
https://github.com/hideokamoto/serverless-alexa-city-guide
補足
リクエスト時のrequest.intent.name
にintentSchema.jsonで定義されている内容を指定すると、そのほかの会話についてもテストすることができます。
まとめ
日本にまだ来ていないにも関わらず相当な盛り上がりを見せているAmazon Alexaですが、このようにデバイスがなくとも動きを確認することが簡単にできます。
Node.jsとLambda、もしくはServerless Frmeworkが扱えれば比較的簡単にSkillの開発などもできるのではと思いますので、みんなでトライアンドエラーの情報をシェアできればいいなーと思います。