公開用のアレクサスキル作成
特典のTシャツを貰うためだけにアレクサスキルを開発する活動、第2回。
前回は、公式トレーニングに沿って、一通りアレクサスキルを完成させることが出来ました。
しかし、サンプルスキルに微修正を加えて完成した、「今日のわんこ」スキル。
実用性は皆無、そもそも権利的にNG。
これを公開しようとしても、
恐らく審査は通らない。
何か公開用の新しいスキルを
作る必要があります。
どんなスキルを作る?
- ひとまずは、ランダムに文字列を返す系
- 自分的には役に立つと思うもの
- 調べるのが面倒なので豆知識系はNG
この条件で少し考えて、「献立提案」スキルに決定。
夕飯何食べよう、とか悩む事って
結構あると思うんです。
アレクサが答えてくれたら、
ちょっと便利かも、ということで。
はげしくn番煎じ、の予感はしますが。
既に類似のスキルがあった場合、
リジェクトされるのだろうか?
それ含めて実験か。
スキル設定
スキル名:献立提案 に決定。
対話モデル
使用したインテントは以下の通り。
<標準インテント>
AMAZON.CancelIntent: 終了、キャンセル...など
AMAZON.HelpIntent:ヘルプ、使用方法を教えて...など
AMAZON.StopIntent:止めて、ストップ...など
AMAZON.YesIntent:OK、それにする、分かった...など
AMAZON.NoIntent:嫌、他には、もう一回...など
<カスタムのインテント>
kondate_suggestion:献立を提案して...など
モデルをビルドしてAWSへ移る。
lambda関数作成
前回のサンプルプログラムの流用だが、
ちょっとずつ変更している。
'use strict'; var Alexa = require('alexa-sdk'); var APP_ID = undefined; var SKILL_NAME = "献立提案"; var GET_FACT_MESSAGE = "はいかがでしょうか?"; var HELP_MESSAGE = "「献立を提案して」、とご依頼頂ければ、本日のおススメの献立を提案します。"; var HELP_REPROMPT = "どうしますか?"; var STOP_MESSAGE = "さようなら"; var YELL_MESSAGE = "良かったです。頑張ってください。"; var data = [ "ハンバーグ", "オムライス", "カレーライス", "から揚げ", "チャーハン", "お寿司", "豚のしょうが焼き" ]; exports.handler = function(event, context, callback) { var alexa = Alexa.handler(event, context); alexa.APP_ID = APP_ID; alexa.registerHandlers(handlers); alexa.execute(); }; var handlers = { 'LaunchRequest': function () { this.emit('AMAZON.HelpIntent'); }, 'kondate_suggestion': function () { var factArr = data; var factIndex = Math.floor(Math.random() * factArr.length); var randomFact = factArr[factIndex]; var speechOutput = randomFact + GET_FACT_MESSAGE; var cardContent = randomFact; this.emit(':askWithCard', speechOutput,HELP_REPROMPT, SKILL_NAME, cardContent); }, 'AMAZON.HelpIntent': function () { var speechOutput = HELP_MESSAGE; var reprompt = HELP_REPROMPT; this.emit(':ask', speechOutput, reprompt); }, 'AMAZON.CancelIntent': function () { this.emit(':tell', STOP_MESSAGE); }, 'AMAZON.StopIntent': function () { this.emit(':tell', STOP_MESSAGE); }, 'AMAZON.YesIntent': function () { this.emit(':tell', YELL_MESSAGE); }, 'AMAZON.NoIntent': function () { this.emit('kondate_suggestion'); }, 'SessionEndedRequest': function () { // Nothing to do } };
少し頭を悩ました点が、
サンプルスキルだと
セッションが全く維持出来ない点。
待機状態に出来ないため、対話にならない。
これについては、レスポンスアクションを
tell じゃなくて ask にすれば解決。
(例)ヘルプを回答した後はセッションを維持したいのでaskを使用
'AMAZON.HelpIntent': function () { var speechOutput = HELP_MESSAGE; var reprompt = HELP_REPROMPT; this.emit(':ask', speechOutput, reprompt); },
(例)停止命令時は、セッションを終了したいのでtellを使用
'AMAZON.StopIntent': function () { this.emit(':tell', STOP_MESSAGE); },
エンドポイント設定してスキル完成。
スキルの動作確認
シミュレータで動作確認。
料理名を吐き出すだけで、あまりに投げっぱなしなので、 スマホ画面で「[料理名] レシピ を検索する」的なリンクを表示しようと思いましたが、断念。
さらっと調べた感じ、hyperlink埋め込みについて リクエストはあるが今はムリ、という状況のよう。
まとめ
一旦、それなりに使えそうなスキルが完成しましたが、レパートリーが少なすぎて、物凄く偏った食生活になりそうなので、もう少し献立の候補を増やしてから、公開したいと思います。