the invention of t88

工作、資格取得、データ分析のことなど

公開用のアレクサスキル作成

特典のTシャツを貰うためだけにアレクサスキルを開発する活動、第2回。

前回は、公式トレーニングに沿って、一通りアレクサスキルを完成させることが出来ました。

www.t88.work

しかし、サンプルスキルに微修正を加えて完成した、「今日のわんこ」スキル。
実用性は皆無、そもそも権利的に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);
    },

エンドポイント設定してスキル完成。

スキルの動作確認

シミュレータで動作確認。

f:id:take213uv:20180812205557p:plain
こんな感じ

f:id:take213uv:20180812205722p:plain
スマホ画面表示。付加情報なし!

料理名を吐き出すだけで、あまりに投げっぱなしなので、 スマホ画面で「[料理名] レシピ を検索する」的なリンクを表示しようと思いましたが、断念。
さらっと調べた感じ、hyperlink埋め込みについて リクエストはあるが今はムリ、という状況のよう。

まとめ

一旦、それなりに使えそうなスキルが完成しましたが、レパートリーが少なすぎて、物凄く偏った食生活になりそうなので、もう少し献立の候補を増やしてから、公開したいと思います。



前の記事:アレクサスキル開発を始めてみる

次の記事:Beautiful Soupでwikipediaのページから料理名を抽出

Tシャツの為だけにアレクサスキル開発 目次