するめごはんのIT日記

主にITネタを書いていくのさ

SDKをいじってまで、三番目に公開したスキル「IT業界の深い闇」の話

ごきげんよう

この記事は ADVENTARの 「するめごはんのVUI・スマートスピーカー Advent Calendar 2018」 の3日目の記事であり、 同じくADVENTARの「Alexa Skills Kit SDK Advent Calendar 2018」の3日目の記事でもあるので、SDKについて自分なりに語ります。

今回もQiiitaの 「するめごはんのVUI・スマートスピーカー Advent Calendar 2018」 の3日目の記事と若干異なりです。

3つほぼ同時はどうなのか。
よろしくない気がしますが、そういうやり方も可能なのか検証にも使います。

以前、このはてなブログに経緯などは記載済みの面もある

f:id:surumegohan:20181203080926p:plain
IT業界の深い闇

このスキルは公開後に、はてなブログに既にいろいろ書いています。

surumegohan.hatenablog.com

なお、この記事に記載している「IT業界の深い闇」というスキルは既にソースコードを以下に公開しています。

■VUIアプリケーションのフィードバック機能をAlexaスキルで公開した https://qiita.com/surumegohan/items/af700c96df5ccf1a1a74

「IT業界の深い闇」のdeveloper console画面

f:id:surumegohan:20181203082010p:plain
IT業界の深い闇のconsole画面

このスキルでは、IT業界の深い闇の話を流した後に、ユーザーに対して「いいね」「いまいち」「ストップ」の判断を依頼します。

そのためにgoodIntentとbadIntentがあり、goodIntentは以下の7つにしています。

  1. 深い
  2. 最高
  3. いい
  4. よいですね
  5. いいですね
  6. よかった
  7. いいね

これらの言葉は「いいね」として見なすようにしています。

なぜ今またこの記事を書くか

まず、Alexaで「状態」を管理する方法はいくつかあり、大雑把に言うと

  1. リクエスト単位(話しかけるごと)
  2. セッション単位(一度の起動から終了まで)
  3. 永続化(スキルを終了しても保存しておく)

のレベルがそれぞれあります。

Alexaスキルでユーザーの起動が2回目以降の場合などにおいて、3の永続化 として、DynamoDBにユーザーIDを記録しておくのはよくあるやり方だと認識しています。

AlexaのSDKの場合、

handlerInput.attributesManager.setPersistentAttributes(attribute)

とすると、DynamoDBにPutされます。

けれど、このスキルは DynamoDBにPutする部分のSDKを改編している ので、そこについて少し触れようと思います。

ここでのユーザーIDとは

本記事でのユーザーIDとは、Alexaでやり取りする際に発生するJSONに含まれるuserIdを示します。

この記事を書いている12月頭時点で、このスキルを起動すると以下のようなJSONが流れます。

AlexaのuserIdはスキル内では同じユーザーは、いつ同じスキルを起動しても同じユーザーIDです。 このユーザーIDの人は、他のスキルを起動すると、そこでは別のユーザーIDになります。

※一部マスキングしているのと、略しています。

{
    "version": "1.0",
    "session": {
        "new": true,
        "sessionId": "amzn1.echo-api.session.955d0538-a464-4beb-b2ac-AAAAAAAAAAA",
        "application": {
            "applicationId": "amzn1.ask.skill.76274913-c2f8-4159-8d0e-XXXXXXXX"
        },
        "user": {
            "userId": "amzn1.ask.account.AECCNHCZ53P2CLATS4ZQZKHWBT3ZCOOZKISGGPP4KTEBFEUANDGZ4OL4WPLBHYRMIHYVIWVYTBHJ6MNRMJJ3YN7NSGKMY3L4TL3XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
        }
    },
    "context": {
        "System": {
            "application": {
                "applicationId": "amzn1.ask.skill.76274913-c2f8-4159-8d0e-XXXXXXXX"
            },
            "user": {
                "userId": "amzn1.ask.account.AECCNHCZ53P2CLATS4ZQZKHWBT3ZCOOZKISGGPP4KTEBFEUANDGZ4OL4WPLBHYRMIHYVIWVYTBHJ6MNRMJJ3YN7NSGKMY3L4TL3XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
            },
            "device": {
                "deviceId": "amzn1.ask.device.AEFHK3CB56PBTMR6NHFZ3MNIJ5RPZLKWIG3DKSOV4PDM3UWNKN553JXDJF2FOF7NPZMCWHUSWYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY",
                "supportedInterfaces": {}
            },

以降、略

今のところ、日本のAlexaSDKのV2だと、上記のようなJSON形式であり、userIdはsessionの中でも、contextの中でも同一となっています。 ※僕が認識している限り。

SDKの中身

再掲ですが、SDKで僕がいじった箇所は以下となります。 これを読むと上記のJSONのcontextの方のuserIdがPutされる対象になることがわかります。

本来はそうなるはずですが、「IT業界の深い闇」では何がなんでもuser1という文字列ををPKとしてDynamoDBにPutするコードにしました。 ちなみにdeviceIdも同じようにしています。

'use strict';

/*
 * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
var AskSdkUtils_1 = require("../../utils/AskSdkUtils");
/**
 * Object containing implementations of {@link PartitionKeyGenerator}.
 */
exports.PartitionKeyGenerators = {
    /**
     * Gets attributes id using user id.
     * @param {RequestEnvelope} requestEnvelope
     * @returns {string}
     */
    userId: function (requestEnvelope) {
        if (!(requestEnvelope
            && requestEnvelope.context
            && requestEnvelope.context.System
            && requestEnvelope.context.System.user
            && requestEnvelope.context.System.user.userId)) {
            throw AskSdkUtils_1.createAskSdkError('PartitionKeyGenerators', 'Cannot retrieve user id from request envelope!');
        }

        //何がなんでもキー値を user1 という文字列で返すように書き換え
        return 'user1';

        //本来書いてあった戻り値
        //return requestEnvelope.context.System.user.userId;
    },
    /**
     * Gets attributes id using device id.
     * @param {RequestEnvelope} requestEnvelope
     * @returns {string}
     */
    deviceId: function (requestEnvelope) {
        if (!(requestEnvelope
            && requestEnvelope.context
            && requestEnvelope.context.System
            && requestEnvelope.context.System.device
            && requestEnvelope.context.System.device.deviceId)) {
            throw AskSdkUtils_1.createAskSdkError('PartitionKeyGenerators', 'Cannot retrieve device id from request envelope!');
        }

        //何がなんでもキー値を device1 という文字列で返すように書き換え
        return 'device1';

        //本来書いてあった戻り値
        //return requestEnvelope.context.System.device.deviceId;
    },
};
//# sourceMappingURL=PartitionKeyGenerators.js.map

なぜこんなことをしたのか

SDKなどのライブラリを読む人と読まない人は別にどちらでも構わないのですが、それはおいておいて、これでDynamoDBにどのようにPutされるのか。

答えは以下となります。

f:id:surumegohan:20181203082131p:plain
DynamoDBのテーブル内は2行しかない

DynamoDBで、SDKの通りに何も考えないで永続化を試みると、userIdがidとしてPKになります。

上記に記載しましたが、もう一度、記載します。

AlexaのuserIdはスキル内では同じユーザーは、いつ同じスキルを起動しても同じユーザーIDです。 このユーザーIDの人は、他のスキルを起動すると、そこでは別のユーザーIDになります。

つまり、僕のLambdaのコードの書き方だと、ユーザーごとにidが異なるので、DynamoDBのデータ量がユーザー単位でどんどん増えていきます。

このスキルの目的は、IT業界の深い闇を伝えることよりも、「いいね」「いまいち」などを集計することが主目的です。 なので、ユーザーのIDはどうでもよくて、「いいね」「いまいち」の数が管理できればそれで良いのです。

DynamoDBはトランザクションに対応していないので、必ずしも正確な数字が記録されるとは限らないかもしれないですが、そこまでの厳密性は求めていませんでした。

※ 12月2日追記 トランザクション対応が発表されたみたいですね。。

なので、ユーザーのIDはそもそも管理したくない、かつ、数字の集計がめんどくさいという2つの理由から、本来は自分のスキルのLambdaを書き直せばよいものを、あえてSDKをいじっても審査が通るのかもチャレンジ してみました。

実はかなり審査員とバトルやりとりした

このスキル、Amazonの方々とものすごくやりとりしました。

当初、実はこのスキルは当初「スキルフィードバック」という名前のスキルで、ユーザーにいきなり「ストップと話しかけてください」と問うスキルで、その後に「いいね」「いまいち」を伝えてもらうモノだったためです。

もちろん、何度もリジェクトを頂きました。

・テスト目的のスキルにみえる ・ユーザーを困惑させる ・ストップの後で終了しないのはなぜなのか

これらのようなコメントをガンガンもらいました。 今までのスキルはせいぜい2~3営業日で初回の審査結果が来ていましたが、このスキルは当初で約5営業日かかりました。

Amazonの中でもいろいろあったと思います。

そして、僕としては ・開発者がユーザーのフィードバックを何も得られないのはおかしい ・テスト目的ではない、スキル作成者全体に関わることだ などなどと、激しく抵抗した結果・・・

何か他のスキルのようなやりとりをした後に、このスキルの機能を組み込むなら承認します

というコメントを頂きました。

なので、「IT業界の光闇」の際に、ボツにしていた、闇としては深いネタをランダムで選び、そして「ストップ」と話しかけたら、ユーザーに「いいね」「いまいち」を伝えてもらうようになっています。

結果的にSDKの改編については、一切の言及がなかったです。

このスキルはAxel Gadgets様に特集された

このスキルはAxel Gadgets様にリリース後すぐに特集記事を書いていただきました。 ※サイト画像の提示は以前許可をもらってます。

https://gadget.axelmedia.info/it%E6%A5%AD%E7%95%8C%E3%81%AE%E6%B7%B1%E3%81%84%E9%97%87/

f:id:surumegohan:20181203082101p:plain
Axel Gadgets様

気づいた方は気づいたかも

ここまできて、気づいた方は気づいたかもしれません。

僕がこのスキルの後にリリースした「ヒロインの告白」として美少女から告白されるスキルは、この「いいね」「いまいち」を★の数のレビューとフリーコメントの機能として継承されることになります。

そしてさらに、そこから特許出願に至る「「音声レビュー・ログデータ収集・分析システム」へと進化していきます。

ここからはQiitaにない話

もちろん?このスキルを公開した時、僕は無職でした。

今では個人事業主申請をして、フリーランスのVUIプロデューサー兼エンジニアとなっています。

そして、このスキルの「いいね」「いまいち」に目をつけた方々は実は当時からそれなりにおりまして、僕にお声がけがありました。

そのうちの1人というか1社がSmartHacks社です。

smarthacks.jp

SmartHacks社の山本さん(現:スマモト)から連絡がありました

日本中のAlexaスキルおよびGoogleのActionについてすべて録画公開している、SmartHacks社がこのスキルを見つけたとき、ものすごい熱量でいろいろありました。

要するにTシャツ目的のスキルが多いが、さらには本当にどうしようもないスキルが残念ながら存在する。

そういうのを、このスキルのような「声」でのフィードバックにてどうにかできないか。

という話になっていきます。

はい、3日目はここでおしまいです。 以上!

二番目に作成そしてVUILTで初登壇することになった「IT業界の光闇」

ごきげんよう

この記事はADVENTARの するめごはんのVUI・スマートスピーカー Advent Calendar 2018」 の2日目の記事です。

今回もQiiitaの 「するめごはんのVUI・スマートスピーカー Advent Calendar 2018」 の2日目の記事とほぼ同じです。

自作のスキルに関しては、Qiitaほぼ同じ内容で書いていこうかと。
さすがに50記事は無理ぽでした。。

IT業界の光闇

前日は

surumegohan.hatenablog.com

として、初めて公開したスキルについて触れました。

本日は2回目に公開したスキル「IT業界の光闇」の話です。

f:id:surumegohan:20181201192911p:plain
IT業界の光闇

このスキルは Qiitaだと @zono_0 と名乗っているNISHIZONOマスターのハンズオンイベントで思いつきました。

ハンズオンでは「とっさの豆知識」というランダムで豆知識を披露するスキルを作ることになっておりましたが、 factスキルが原形だったので、ハンズオンでは宇宙の話でした。 僕はそこでIT業界の豆知識を入れられないかなと考えて生まれたスキルです。

ただ、さすがにIT業界の豆知識というスキル名だとあんまりにもあんまりなので IT業界のよろしい面を光、よろしくない面を闇として、IT業界の光と闇をお届けすることとしました。

ネタはもうたくさんあるので・・・w

IT業界の光闇のdeveloper console画面

f:id:surumegohan:20181201193031p:plain
IT業界の光闇のコンソール画面

前日の大阪弁相槌で用いた any をここでも用いています。

また、光の話と、闇の話のためにインテントをわけて、当時のAlexaの1つの基準となる6つ以上のサンプル発話を含めました。

光の話のサンプル発話

光の話はhikariIntentなわけですが、以下のようになっています。

  1. 光の話で
  2. 光で
  3. 光を
  4. 光にして
  5. 光がいい
  6. 光の話が聞きたい
  7. 光をお願い
  8. 光を聞きたい
  9. 光の話をして
  10. 光の話をお願い
  11. 光の話

の12パターンを当時作成しました。 闇も同じように作成しています。

今思うと、「もっとスロット使えよ」って思いますが、成長の足跡みたいなもんだと認識しています。

ソースコード

このスキルのソースコードは以下のようになっています。

なお、現段階で公開されているスキルのうち光と闇の話はここに記載されている内容のみではありません。 実際はもっと収録されています。

たいした実装はしてなくて、ランダムで光か闇の話をします。

※ ブログとしての見やすさのため、ここでは1つのindex.jsにまとめたと認識していただけると助かります。

'use strict';
var Alexa = require('alexa-sdk');

//スキルID
var APP_ID = 'amzn1.ask.skill.XXXXXXXXXXXXXXXXXXXXXX';

//定型文
var SKILL_NAME = 'IT業界の光闇';
var WELCOME_MESSAGE = 'ようこそ。<break time="0.2s"/>IT業界の、光と闇の世界へ。<break time="0.2s"/>このスキルでは、IT業界の光と闇を垣間見ることができます。<break time="0.2s"/>「光」ならIT業界のいい話、<break time="0.2s"/>「闇」ならIT業界のよろしくない話を伝えます。「光」<break time="0.2s"/>もしくは「闇」<break time="0.2s"/>と話しかけてください。どうしますか?';
var HELP_MESSAGE = 'へるぷですね<break time="0.2s"/>このスキルでは、IT業界の光と闇を垣間見ることができます。<break time="0.2s"/>光<break time="0.2s"/>もしくは闇<break time="0.2s"/>と話しかけてください。光ならIT業界のいい話、<break time="0.2s"/>闇ならIT業界のよろしくない話を伝えます。<break time="0.2s"/>終わりたい時は「ストップ」<break time="0.2s"/>と話しかけてください。<break time="0.2s"/>それでは「光」と「闇」<break time="0.2s"/>どちらの話を聞きたいですか?';
var HELP_REPROMPT = 'このスキルでは、IT業界の光と闇を垣間見ることができます。<break time="0.2s"/>光<break time="0.2s"/>もしくは闇<break time="0.2s"/>と話しかけてください。光ならIT業界のいい話、<break time="0.2s"/>闇ならIT業界のよろしくない話を伝えます。<break time="0.2s"/>終わりたい時は「ストップ」<break time="0.2s"/>と話しかけてください。<break time="0.2s"/>それでは「光」と「闇」<break time="0.2s"/>どちらの話を聞きたいですか?';
var STOP_MESSAGE = 'IT業界に光があらんことを。<break time="0.2s"/>またね。';
var CONTINUE_MESSAGE = '<break time="1s"/>続けて<break time="0.1s"/>ほかの話を聞きたい場合は<break time="0.2s"/>「光」<break time="0.2s"/>もしくは「闇」<break time="0.2s"/>と話しかけてください。<break time="0.2s"/>終わりたい時は、「ストップ」<break time="0.2s"/>と話しかけてください。<break time="0.2s"/>どうしますか?';
var UNDEFINED_MESSAGE = 'すいません。聞き取れませんでした。<break time="0.2s"/>「光」<break time="0.2s"/>もしくは「闇」<break time="0.2s"/>と話しかけてください。光ならIT業界のいい話。<break time="0.2s"/>闇ならIT業界のよろしくない話を伝えます。<break time="0.2s"/>終わりたい時は「ストップ」<break time="0.2s"/>と話しかけてください。<break time="0.2s"/>それでは「光」と「闇」<break time="0.2s"/>どちらの話を聞きたいですか?';

//光と闇の話をし出す冒頭部分
var HIKARI_PREFIX = '光の話ですね。<break time="0.2s"/>';
var YAMI_PREFIX = '闇の話ですね。<break time="0.2s"/>';

//光のネタ
var hikariData = [
    '自分が関わった、システムやサービスが、世の中にでていくのは、いいものだよ。自分が作った、システムやサービスを、使ってくれている人を見かけると、嬉しくなることもあるよ。',
    'アイデアを、こうしてスマートスピーカーに、しゃべらせたりできるよ。まぁ、IT業界じゃなくてもできるけどね。',
    'カッコイイWebページを、作ることができるよ。パソコンはもちろん、携帯電話でもWebページは大切だからね。',
    'リモートワークができるところなら、家で仕事ができることもあるよ。家で集中できるかは別の話だけどね。',
    'フレックスタイム制だと、満員電車に乗らなくてもいいこともあるよ。',
    'スマートスピーカーに限らず、コミュニティーに入ると、いろんな人と出会えるし、それがきっかけで新しい発想が得られたりするよ。'
    
];

//闇のネタ
var yamiData = [
    'お客様の職場に、一人だけで派遣されることもあるよ。孤独感がすごいよ。人によるけどね。',
    '経験年数をごまかされることがあるよ。嘘は良くないよね。',
    'システム障害が発生すると、夜中でも休日でも連絡がきて、対応しないといけないこともあるよ。',
    '忙しいと、終電での帰宅や、会社に泊まることもあるよ。',
    'ローンを組んで自宅を購入しても、転勤しないといけないこともあるよ。',
    '最初のうちは終電にくわしくなれるよ。そのうちに深夜タクシー代にくわしくなって、最後は始発の時間を覚えるよ。',
    '腕が上がると、賞味期限の切れそうな、大盛りスパゲティが運ばれてくるよ。腕の見せ所だよ',    
    '裁量労働制とは言っても、早朝から呼ばれたりするよ。',
    '一次請け、二次請け、三次請け、よん、ご、ろく、なな。おっと。誰か来たようだ。',
    '技術がわからない人に人事評価されることもあるよ。それだと、お給料が、あがりにくいこともあるよ。',
    'ゴールデンウイークに、休みがまったくないこともあるよ。年末年始も同じだね。',
    'ノー残業デーがあるということは、いつもは忙しいということもあるよ。',
    '年単位や、年度の単位で、残業時間の制限があっても、としが明けたり、年度が替わると突然残業制限の時間がリセットされて、結局、制限がなくなることもあるよ。',
    '横須賀。リサーチ。プリズン。',
    '納期が近いのに、急な仕様変更を、無償でやれ、と言われることもあるよ。なんでIT業界は、それがまかり通るのかな。',
    '試験結果のエビデンスで嘘を言われることもあるから、本当に、要注意。',
    'クラウドを使えば、インフラが必要なくなると、勘違いしている人がいるよ。そんなわけないのにね。',
    'テストを自動化すれば、テスト工程が不要になると、勘違いしている人がいるよ。自動化のための、ソースコードの作成やメンテナンスコストを考えてくださいよ。',
    'RDBで、データを削除しないで、削除フラグをカラムに入れる設計、後でデータ量が増えたり、痛い目にあう、アンチパターン。'
    
];


//以下、実装部分
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 () {
        
        var speechOutput = WELCOME_MESSAGE;
        var reprompt = HELP_REPROMPT;
        this.emit(':ask', speechOutput, reprompt);

    },
    'hikariIntent': function () {
        var factArr = hikariData;
        var factIndex = Math.floor(Math.random() * factArr.length);
        var randomFact = factArr[factIndex];
        var speechOutput = HIKARI_PREFIX + randomFact + CONTINUE_MESSAGE;
        var reprompt = HELP_REPROMPT;
        this.emit(':ask', speechOutput,reprompt)
    },
    'yamiIntent': function () {
        var factArr = yamiData;
        var factIndex = Math.floor(Math.random() * factArr.length);
        var randomFact = factArr[factIndex];
        var speechOutput = YAMI_PREFIX + randomFact + CONTINUE_MESSAGE;
        var reprompt = HELP_REPROMPT;
        
        this.emit(':ask', speechOutput, reprompt)
    },
    '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);
    },
    'SessionEndedRequest': function () {
        this.emit(':tell', STOP_MESSAGE);
    }, 
    'Unhandled': function () {

        var speechOutput = UNDEFINED_MESSAGE;

        var reprompt = HELP_REPROMPT;

        this.emit(':ask', speechOutput, reprompt);
    }
};

VUIのイベント初登壇のスキル

このスキルは VoiceUIライトニングトーク!/VUILT vol.2 at Google で登壇したスキルです。

https://iotlt.connpass.com/event/86989/

今では各種VUIのイベントで話させていただいておりますが、このスキルがVUI関連のイベントでの初登壇のスキルです。

めっちゃスベると思ったんですけど、非常に好評でして、ボイスアップラボのコバヤシトールさんをはじめ、現在VUI業界で活躍なさっている方々から懇親会でつながることになった思い出のあるスキルです。

実は5回バージョンアップしている

上記イベント時にも話したのですが、このスキルはTwitter、友人、知人、そしてまったくの他人から、ネタを都度提供いただきまして、ネタの追加を5回実施し、Ver1.5ということになっています。

みなさん、ありがとうございます。

ただ、、VUILTでも話した通り、闇ばかりが深くなっていくという状態に陥りました。 さすがにこれはコンプライアンスとかでヤバイだろという内部告発レベルの話題もきました。

Alexaのエンドポイントを更新したらAmazonさんに再申請するべきかどうかという話がありますが、このスキルというか僕の場合は修正したら再申請を一応実施しています。

ただ、Lambdaで何も考えずに直接書いているなら、審査も何も動いてしまっているので意味があるのかは微妙なところ。

ただし、 以前は指摘しませんでしたが●●を変更してください

という、既に公開しているのに、審査通過した箇所を修正しろと言われることがあります。 経験上、これはロジック面でも、スキルストアの説明文でもあり得ます。

え?リジェクト理由はそこなの??

このスキル、IT業界をディスっているので、そもそもAmazonさんが認めてくれるのかどうなのか という勝手な不安が当時あり、1回目はリジェクトを頂きました。

やっぱこういうのはダメかーー

と思ったら

スキル名(呼び出し名前)の「IT業界の光と闇」で当初申請していたのですが がNGという理由でした。

なので、無理やり感がありますが、「あいてぃぎょうかいのひかりやみ」になっています。

というわけで

2日目の記事として、「IT業界の光闇」について触れさせていただきました。

一番最初に作成したAlexaスキル「大阪弁相槌」

ごきげんよう

この記事はADVENTERの するめごはんのVUI・スマートスピーカー Advent Calendar 2018
の1日目の記事です。

今回はQiiitaの するめごはんのVUI・スマートスピーカー Advent Calendar 2018」 の1日目の記事とほぼ同じです。

今年の4月末、僕はVUIに専念するために会社を辞めて無職になりました。 今ではフリーランスエンジニアとしてVUIプロデューサーを名乗り、VUI関連のお仕事を頂いて生活しております。

さて、最初の記事としては、僕自身が最初に世の中に公開したスキルについて記載します。

僕が初めて世の中にリリースしたVUIのスキル・アプリ(アクション)は2018年5月7日に公開された 大阪弁相槌(おおさかべんあいづち) というスキルです。

大阪弁相槌アイコン.png

Google Homeで個人で遊んでいたアクション(アプリ)は既にありましたが、一般公開された1作品目はこのAlexaスキルとなりました。

動きは単純で、 「アレクサ、大阪弁相槌を開いて」 と話しかけると、大阪弁で話してくるので、ユーザーが何かしら話しかけると、大阪弁で相槌を返します。

Alexa developer consoleでは以下のようになっていて、 インテントが1つ、そこにanyのスロットのみです。

あとは他のストップやキャンセルのインテントに、大阪弁としてのそれらの動きをするセリフを登録しています。

大阪弁相槌インテント.png

スロットの中身も以下のように「ほげほげ」しかありません。

大阪弁相槌スロット.png

つまり、Alexaのビルドインインテント以外の場合は、この「ほげほげ」として処理されるようになっています。

当時のオウム返し系のスキルは、このような作成方法が散見されました。

そして、そのソースコードが以下です。

'use strict';
const Alexa = require('alexa-sdk');

const APP_ID = 'amzn1.ask.skill.XXXXXXXXXXXXXXXXXXXX';

const SKILL_NAME = 'おおさかべんあいづち';
const HELP_MESSAGE = 'へるぷやな<break time="0.2s"/>何か話しかけてみい<break time="0.2s"/>大阪弁で相槌を返すでぇ<break time="0.2s"/>終了するには<break time="0.2s"/>もうええわ<break time="0.2s"/>とか<break time="0.2s"/>やっぱやめ<break time="0.2s"/>とかゆうてくれたら終わるでー<break time="0.2s"/>ほな<break time="0.2s"/>会話を始めよか<break time="0.2s"/>話しかけてみ?';
const HELP_REPROMPT = 'へるぷやな<break time="0.2s"/>何か話しかけてみい<break time="0.2s"/>大阪弁で相槌を返すでぇ<break time="0.2s"/>終了するには<break time="0.2s"/>もうええわ<break time="0.2s"/>とか<break time="0.2s"/>やっぱやめ<break time="0.2s"/>とかゆうてくれたら終わるでー<break time="0.2s"/>ほな<break time="0.2s"/>会話を始めよか<break time="0.2s"/>話しかけてみ?';
const STOP_MESSAGE = 'ほな<break time="0.2s"/>さいなら';
const WELCOME_MESSAGE = '何か話しかけてみい<break time="0.2s"/>大阪弁で相槌を返すでぇ<break time="0.2s"/>何かわからへんことあったり<break time="0.2s"/>ヘルプを呼び出したいときは<break time="0.2s"/>わからへん<break time="0.2s"/>どしたらええねん<break time="0.2s"/>ヘルプを開いて<break time="0.2s"/>とかいうてや';
const WELCOME_MESSAGE2 = '<break time="0.2s"/>終了するには<break time="0.2s"/>もうええわ<break time="0.2s"/>とか<break time="0.2s"/>やっぱやめ<break time="0.2s"/>とかゆうてくれたら終わるでー<break time="0.2s"/>ほな<break time="0.2s"/>会話を始めよか<break time="0.2s"/>話しかけてみ?';

const FEEDBACKS = [
    'なんでなんで',
    'しらんしらん',
    'そやねんそやねん',
    'まじで?',
    'うそやん',
    'そうなん?',
    'せやな',
    'まあ<break time="0.2s"/>それはアレやな',
    'そやな',
    'やばいな',
    'せやなぁぁ'
];

const PROMPTS = [
    'ほんでほんで?',
    'そんでそんで?',
    'それからどしたん?',
    'どないしたん?'
];

const WAIT = '<break time="0.2s"/>';

const handlers = {
    'LaunchRequest': function () {
        const speechOutput = WELCOME_MESSAGE + WELCOME_MESSAGE2;

        this.response.cardRenderer(SKILL_NAME, speechOutput);
        this.response.speak(speechOutput);
        this.emit(':ask', speechOutput);
    },
    'inputAnyIntent': function () {
        
        const speechOutput = FEEDBACKS[Math.floor(Math.random()*FEEDBACKS.length)] + WAIT + PROMPTS[Math.floor(Math.random()*PROMPTS.length)]; 

        this.response.cardRenderer(SKILL_NAME, speechOutput);
        this.response.speak(speechOutput);
        this.emit(':ask', speechOutput);
    },
    'AMAZON.HelpIntent': function () {
        const speechOutput = HELP_MESSAGE;
        const reprompt = HELP_REPROMPT;

        this.response.speak(speechOutput).listen(reprompt);
        this.emit(':responseReady');
    },
    'AMAZON.CancelIntent': function () {
        this.response.speak(STOP_MESSAGE);
        this.emit(':responseReady');
    },
        'SessionEndedRequest': function () {
        this.emit(':tell', STOP_MESSAGE);
    }, 
    'AMAZON.StopIntent': function () {
        this.response.speak(STOP_MESSAGE);
        this.emit(':responseReady');
    },
        'SessionEndedRequest': function () {
        this.emit(':tell', STOP_MESSAGE);
    }, 
    'Unhandled': function () {

        var speechOutput = HELP_MESSAGE;

        var reprompt = HELP_REPROMPT;

        this.emit(':ask', speechOutput, reprompt);
    },
};

exports.handler = function (event, context, callback) {
    const alexa = Alexa.handler(event, context, callback);
    alexa.appId = APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
};

今はもう懐かしい、SDKのV1ですが、100行にも満たない非常にシンプルな内容です。

ただ、セリフに関しては、 大阪生まれ、大阪育ち、大阪在住の大阪ネイティブの方 に監修して頂きました。 関西弁と大阪弁は違うと熱弁されて、もう半年以上経つことになります。

そして、このスキルを公開するために5回のリジェクトを頂いたのを今でも覚えています。

このスキルを皮切りに、この記事を書いている11月末現在では、多くの人に支えられ、VUIで招待講演や特許出願ができるようにまでなりました。

僕のアドベントカレンダーでは、そんな僕のVUI元年について記載していこうと考えております。

NOID スマートスピーカー ハンズオンNIGHTに参加したよ

ごきげんよう

本日(2018年11月19日)は
NOID スマートスピーカー ハンズオンNIGHT
に参加してきました。

アイリッジ社のロゴかっこいいです。

f:id:surumegohan:20181119235357j:plain

NOIDすげー便利なやつ。
前に画面見たときは英語だったような気がしたんですけど、日本語になってました。
国産万歳。

このイベントでした

noid.connpass.com

参加者層

18時受付開始、18時半から本番開始だったんですけど、18時10分くらいについた僕が1番乗りでした。

で、参加者はビジネス層が結構いたように思います。
VUI・スマートスピーカーに興味はあるんだけど、技術的に専門にできない という方が多かった気がします。

また、冒頭で「スマートスピーカーを持ってない人」を挙手してもらってましたが、3分の1から半分くらいは該当でした。

企業で何名かでまとまってきている方々もいらっしゃいました。
良いことだと思います。

NOIDすげぇ

画面がめっちゃヌルヌルうごく。
なめらかです。

mp3ファイルをドラッグ&ドロップでAlexa対応フォーマットにしてサーバにあげてくれます。まじかよ。

GUIなので本当に最初は慣れが必要ですが、かといって触っていればすぐ使えます。

参加者が楽しんでた

Amazonのアカウント作成からスマートスピーカーで声をださせるまで、ハンズオンです。

本当に初めての方々が何名もいらっしゃって、その人たちが自分でスキルを作って
「おおおお!!」
「しゃべったーー!!」
とか会場でワイワイ。

僕も最初はこんな感じでした。
GUIのツールで、ノンコーディングでスキル作成できるのは本当に便利です。

個人はもちろん、企業でも。

モック作成がスキル開発を依頼する側が作成できて、そこからどう発展させましょうという流れが作りやすそうです。
VUIビジネスのサイクルが早くなってとても良いと思います。

こんな動きをしてる

NOIDでスキルのプロジェクトを立ち上げて「保存」をすると2~3分待つことになります。

これ何やってるんだろうと思って、自分のコンソール開いたらキルビルドまでやってくれたんですよ。
エンドポイントが専用のLambdaになっているので、アイリッジさんの管理するサーバに生成されているんだろうなぁ。

Alexaの音声でどこで話すか、どこで音声ファイルを流すかが、ドラッグ&ドロップでサクサク設定できる。
ということは、たぶん、Node.jsならResponseBuilderで呼び出す前に、
NOID画面で選ばれて保存された順で1つのに相当する部分を生成してるんだろうかと思った次第です。

僕が気づいたこと

0.
ファシリテーターの岩屋さんの進行がめっちゃ良かったです。
ハンズオンは、もくもくしがち。
そこを盛り上げるようにしてて、進行がすごい良かった。
あれはハンズオン系のイベントですごく参考になると思います。

1.
mp3の90秒問題が管理できない。
これはとても難しい。
僕がNOIDを創る側だとしても、Alexaのmp3ファイル90秒の壁の管理はかなり厳しいと思います。
マルチスレッドとかで、音声ファイルの長さを調べつつ、アップロードとかうまくできたりするかも?

2.
レスポンス1つのmp3ファイルは5つまでの制限が厳しそう。
画面でポチポチできると積極的に音をいれたくなると思いました。
けど、レスポンス1つで5ファイルまでしか繋げられない認識でいます。
そこはフロントエンドで対応するのだろうか。
かといって、条件分岐をもっと複雑にできるようにしたりすると、、、すごく大変そう。

3.
何ができて、何ができないのかを明確化した方がいいかもしれない。
そもそもスマートスピーカーで何ができるのか、できないのか。
その上でNOIDでは何ができて、何ができないのか。

それはどこかに一覧の記載があっても良かったかもしれないです。
かといってそれを明文化するのはとても難しい。
アイリッジさん、がんばってください!

一番感じたこと

とにかく動くモノをリリースする!
そしてバックエンドより、フロントエンドの動きに力を入れてノンプログラミングでかっこよくできることを強調しているところが、すごく良いと勝手に思いました。

完璧なモノを創ってからではなく、まずはできる範囲でリリースしてフィードバックを集める。
これは本当に勝手に共感してました。

ハンズオンやって、ユーザーがどう操作するのか、どこで躓くのかを生で感じるのはすごい大事だと思います。

SHAもハンズオンやろう。

Alexa Salon SP @東京〜秋のNLT(Not LT)大会〜で登壇したよ

ごきげんよう

11月15日に登壇することができました。
ってか当初、本当に他の登壇者をconnpassが出る少し前まで聞いてなかったんですよ。

イベントはこれ

classmethod.connpass.com

運営はクラスメソッド社

AlexaSalonはクラスメソッド社が開催しているAlexa関連のイベントです。
以前、Google、LINEについても話している回が東京開催されました。

オープニングトークする、クラスメソッド社の清野さん(せーのさん) と、きのこの帽子。

f:id:surumegohan:20181118215616p:plain

まさかAlexaSalonで話せると思ってなかった

このイベントは、せーのさんから登壇依頼が
「技術的な話を話せるだけ話してください」
ということでありまして、
ソッコーで「やらせてください」と返事したんです。

その時、他の登壇者の情報を知らなかったんですけど、いざ共有されたら

いつもお世話になってるAlexaSalonだったし、
ってか「Alexaに精通している方々のディープなお話」ってなんだ・・
っておおいいいい 

Alexaに精通してる扱いなので、Alexaに精通しないといけなくなりました。
ちきしょう謀ったな、せーのさん!

まぁ、これから精通していけばいいです。

Amazon公式イベント以外ではなかなかお会いできない
Alexaのデベロッパエバンジェリスト 畠中さん

サーバーレスで超有名な
セクションナイン社CEO 他にも様々な企業で活躍している 吉田さん

日本人2人しかいない
Alexa Champion 岡本さん   ※技術書典でもご挨拶させていただきました

そして、僕個人はとてもよくしてもらっている
Alexaスキルアワード2018ファイナリスト 田中みそさん

なんで、僕がここにいるんだ!??

って感じでしたが、この上なく大変ありがたい話です。

なので、全力プレゼンしてきました。

何を話してきたの?

資料は上記のconnpassで公開されてますが100ページ超えてしまったのは結果論として
VUI LTで話した、特許出願の「音声レビュー、ログ収集・分析システム」である
SHA(SmartHacks Analytics)の名前発表と、
AWSトーシローの僕がめっちゃ検証して形にしたよ って話をしました。

コア機能部分とはいえ、あそこまでAWSの構成図を開示できたのは、
もちろんSmartHacks社の代表取締役である山本さん(スマモトさん)のOKをもらっており、むしろ
「話してきてください」
という流れでした。

さすがに企業秘密じゃね?ってレベルな気がしますが
僕も山本さんもVUI業界を盛り上げるためのシステムであり、その中のロジックは最大限公開すべき
という考えをもっていて、あのようなプレゼンになりました。

スタートアップでVUI業界のためにRedShiftの運用宣言する経営判断をするスマモトさんめっちゃカッコよくないですか?

で、登壇メンバー構成およびイベントの性質上、ちゃんとした?、丁寧な説明をして、行動を促すプレゼンをすべきだとも考えておりましたが

「あのメンバーでスライドの量を作りこんでパンパン流す人はいないだろう」
「思い付きの適当システムではなく、いろいろ検証した上での結果だと伝えたい」
「話せるだけ話してくださいとの依頼だった」

ということで、VUI LTのようなペースでガンガン話していきました。

そして伝えたかったのは、
トーシローでも行動すれば特許出願までいけるんだぞ
と伝えたかった意図もあります。

別に会社辞めろとかは言いませんが、
「やりたいこと駆動開発」
が、僕としてはかなり相性がいいと思ってて、ともかく行動しようよとも伝えたかった。

よーするに やりゃあできるよ という話です。

もちろん1人で開発できたわけじゃない

僕は10月2日にAWS Loft Tokyoに初めて入って、3日の朝から目黒までの定期券を買って、ほぼ毎日AWS Loft Tokyoにいます。

作業環境として知る限り最高なのと、AWS Loft TokyoのAsk an Expertで、中の人に助言してもらいながら形になりました。

AWS Loft Tokyoはあくまで、スタートアップとデベロッパーのための場です。
でもって、エキスパートの方々はデバッグ屋さんではありません。

アドバイスはしてくれますが、調査・検証は自分でやります。

いや、他の人がどう使ってるかは知りませんけども。。あくまで僕はそうしてます。

イベントで言われて嬉しかったこと

いくつもありますが、特に嬉しかったことは

畠中さんが登壇時に名指しで
「showさんにコミュニティを盛り上げてもらって・・」
とその場で言ってくれたこと
※ 大人の都合で動画撮影されてないです

吉田さんが
「本当に会社辞めてやったんですか!」
とその場およびツイートしてくれたこと

岡本さんが
「めっちゃ勢いある話でしたね。というか、よく噛みませんねw」
と言ってくれたこと
そういえばたしかに登壇で噛んでない

田中みそさんがobnizについていろいろ教えてくれたこと。
ちょうどポチった後でした。

そして、今回のお話をくれたクラスメソッド社せーのさんから
「登壇ありがとうございました!」
と、ストレートにお礼を言われたこと

などなど、登壇者・運営者からたくさんコメントをいただけました。

もちろん参加者の方々からも
「どうやったらああいうアイデアというか発想がでるんですかね」
「めっちゃ元気でしたね」
「笑いましたww」
「資料もらっていいですか?参考にしたいです」
とかとか、コメントをいただけました。

褒められると伸びる子なんで、今後も頑張ります。

イベント関連のツイート

おわりに

あとこれは記載しておかないといけないと思っているんですけど
別に僕自身はすごい人でもないし、ガンガン絡んでもらって構わないです。
というか絡んでください。

他の各種イベントの登壇者はわからないですけど、僕は基本ウェルカムです。
別に雲の上の人ではないです。

そしてそもそも、イベントで登壇することは困難ではないです。
VUI LTみたいな5分間からスタートしてみれば良いと思います。
それを繰り返していれば、今回の僕のように登壇依頼がくるかもですし。

仮にひっどいプレゼンをしても5分なので、他の人の順番になります。
むしろ、打席に立たないことの方がもったいないです。

いいじゃないですか、三振しまくっても。
そのうち打てますよ。

以上!

VoiceUIライトニングトーク!/VUILT vol.7で登壇したよ

ごきげんよう

VUI LT、抽選の運がよくて4回目の登壇ができました。

今回で7回目の開催ですね。早いもんだ・・・

イベントページ

iotlt.connpass.com

togetter.com

早めに会場入り

登壇者なので早めに会場入り。

サイボウズさんの会場が素敵すぎた。
森かよっ という感じです。

この日の朝に開封したEcho Dotの第三世代を持参しました。

登壇者は接続確認のために早めに到着することがイベント系では多く見受けられますが、
VUI LTって登壇者の人たちも会場設営を自分から進んでやってくれることがとても多いんです。

なんかねー
みんなで楽しもうぜ

ってノリがあって好きなんですよ。

会場のスライド投影や音声などの接続確認は順番待ちになるので、その間に椅子を並べたり、受付を用意したり。

僕は普段レッツノートを持ち歩いているので、HDMIとアナログRGB(ってPanasonicのページに書いてある)それぞれで接続確認をして、
ケーブルや会場設備そのものに問題がないか確認。
それとEcho Dotの設定をしてました。

その間に早めに到着した登壇者のimajoさん、NOIDの岩屋さんが自分から「やりますよー」って受付やってるんですよ。

もうねー
なんかねー
みんなでVUI LTを作り上げてる感じが僕は好きなんですよホント

5月にGoogle社で開催されたVUI LTがVUI業界での僕の初登壇だったはず。
そしてその回はimajoさんの人生初登壇でもあったわけです。
半年くらい前なのかぁ。。。
早いんだか遅いんだか。。

自分の登壇

VUI LTは慣習として、登壇者枠確定となると、先着順で登壇の順番が選べます。
登壇者同士の交渉での入れ替えはOKです。

僕自身の登壇は前回と同様に最後のトリをあえてソッコーで狙いました

僕は最後が一番よいポジションだと思ってて、その日一日の他の人たちの話した内容をプレゼン内容に反映できるからです。

で、資料は公開してるから良いとして、特許出願している「音声レビュー、ログ収集・分析システム」の話をしました

5分って短いんですよねー
上記のGoogle社での開催の時みたいに、余裕持って話したいんですけど、今回はデモと特許アピールが必要だったのであんな登壇になってしまった・・・
聴く人の立場になれてないのでぶっちゃけ負けた感がしてます。

僕が今回発明、開発したシステムは、僕としても想いがあって

・VUIでスキル・アプリを作ってる人が、ちゃんとアピールできる場
・VUIのスキル・アプリの開発を依頼をしたい人が、開発者を見つけるマッチング

とかできたらいいなと考えてます。

スマホのアプリでGoogle Playとかだとそれなりに評価されてるけど、VUIってユーザーのフィードバックがものすごく少ないんですよね。

Alexaが最近、開発者が意図しないタイミングで★いくつか聞いてくるようになってきてますが、それは開発者が制御できる方が絶対いい。
また、VUIのデザインとしてもスキル・アプリの性質によってレビューなりコメントなりをするタイミングやセリフは変化されるべきだと考えてます。

そういう場を提供したくて、あのシステムを創りました。

他の人の登壇

やっぱgoogle homerさんが一番面白かったと思います。

ジャービス」でスマモトさんを意識、
「バックフリップ」で田中みそさんを意識していると思われるプレゼンをしてました。

前々からそのようなツイートを見てましたが。

表彰?された

今回のVUI LTからアンケートをとりはじめたようで、誰のセッションが面白かったか(だっけ?)をチェックボックスで選べるようになってました。
Googleフォーム便利すぎる。

で、
1位がgoogle homerさん
2位が僕
3位がimajoさん

僕個人の勝手な感想だと

・google homerさん
imajoさん
・しのやん(篠崎敦)さん

の内容が面白かったから、3人選ぶならこの3人だと思ったんだけどなぁ。

懇親会

上記の表彰?で2位になったので、コメントを壇上で話すことができました。

それとは別に、今回はいつもよりもかなり多くの人が話しかけてきてくれました。
登壇者になると話しかけられるので懇親会困らない理論です。

と、ここで懇親会で受けたコメント・質問をいくつか記載します。

1.
「どこまで行くねん!ここまで来たらどこまでも突き抜けていってくれや!!」

2.
「こういう方法があったんですね、、いやぁ、、すごい・・」

3.
「しょーさん、VUIにいくらリソースを注ぎこんでるんですかw」

4.
「LINEのアワードだしてないと思ってたんですけど、これやってたんですね」

僕としては
「VUI・スマートスピーカーやりたくてガチ無職になって遊んでたらこうなった」
としか言いようがないんですけども、みなさんいつもありがとうございます。

1000万円狙うより、あのシステムを作った方がVUI業界の発展につながる可能性があると踏んで行動しました。
まぁ「いもうと」が表彰されてたので、予定通り「ヒロインの告白」のかなりバージョンアップしたやつを送り出してれば、ひっかかったかもですが。。。

いけるところまで行ってくれみたいな話を結構言ってもらえるので、とりあえずアドベントカレンダー1人完走を登録しました。
クソ記事になる場合もあるかもしれませんが、25日間完走したいと思います。

こっちは技術以外の話もしたい

adventar.org

こっちは技術的な話をしたい

qiita.com

告知

以下のイベントを告知します。

■#ma_2018 プロが選ぶヒーロー賞 決勝審査会(VUI部門、IoT部門)

こちら、予選審査員をさせていただきました。
尖った音声アプリ満載で審査めっちゃ面白かったです。
応募してくれた方々、本当にありがとうございました。

mashupawards.connpass.com

スマートスピーカーを遊びたおす会 vol.4

たぶん、僕のホームスタジアム??な遊びたおす会をまた開催します。
6月にduelしたのがVUI界隈で
「なんかヤバイ奴がいる」
みたいな扱いになった流れなので大変ありがたい限りです。

狙ってなかったのですが、たまたま3か月ごとに実施しているので、今回も前回が9月だったので12月にやりましょうとなりました。

今回は諸事情で、申し訳ないですがネット配信がありません。会場に是非お越しください。

ぶっちゃけ、謎に包まれていたGoogle Homerさんのプロフィールにビビりました。
やはり只者でななかった・・・大変楽しみです。

connpass.com

はい、以上です

Alexaハンズオントレーニング(中級者向け)に参加してきたよ

ごきげんよう

昨日に引き続き、Amazonさんのビルでのイベント
Alexaハンズオントレーニング(中級者向け)
に参加してきました。

f:id:surumegohan:20181109202044p:plain

■イベント情報

alexahandson181109.splashthat.com

とは言いつつも、内容はASK CLIのインストール&お試しと、ダイアログモデルの2つでした。

■会場入り

いつものようにAWS Loftにいたので、そこから会場へ。

早めについたら、Alexaイベントではお馴染みクラスメソッド社の方々がいらっしゃいました。
全員知った顔です。
というか、新しく入った人も知人でした。

で、今後のイベント開催について話してたらAlexaエバンジェリスト畠中さん登場です。

畠中さん「あ、今日運営やってくれるの?」
僕「違いますよw 一般参加者ですよw」
畠中さん「( ´゚д゚`)エー スタッフやってよー こっち側の人でしょー」

なんてやりとりしながら、でてきたモノ

f:id:surumegohan:20181109202705p:plain

まず物理的にでかいんですけども、重低音を響かせるスピーカーがでてきました。
Echoシリーズとペアリング?していい感じの音を響かせてました。

■セッション1 ASK CLIのインストール&設定

公式リンクはこちら。
配れた資料は別にあります。

developer.amazon.com

この設定が結構躓くわけですが、1回設定してまえば、後は大変便利です。

Visual Studio Codeプラグインがあるので、サクサクとスキルが作れちゃいます。

Lambdaを開いて、Alexaコンソールを開いて、いったりきたりしなくて良くなります。
ソースコード管理できるのでgitとかチーム開発もできるし、でかいライブラリも含めることができます。
デプロイもコマンド一発です。

VS CodeでLambda相当の画面を開いて、askと入力すると補完候補がでてきてコードのスニペットが選べます。
いままでIntentごとにハンドラーとか作ってたのが瞬殺で作成できちゃいます。

これはもう大変すばらしいです。

ただ、新規作成すると強制バージニアリージョンになってしまいますので注意。
東京リージョンには今のところできないらしい。

また、過去の公開済みスキルのコード編集もgit cloneみたいなask cloneで落としてくることができて、そいつはリージョンが東京でいけます。

これは画期的ですね。

が、やはり躓きポイントがあったので、それをブログにしてくださいとのことなので記載します。

●ASK CLIインストール&設定の躓いた箇所

1.ユーザ設定の画面でリンククリックすると戻れなくなる

f:id:surumegohan:20181109204120p:plain

手順通りやっていると、ポリシーを設定したユーザが作成されますが、そこでコンソール画面のURLがでてきます。
で、この画面の下にキー類が記載されたCSVファイルをダウンロードするボタンがあるんですけど、それを押す前にこのリンクを押すと、画面遷移されます。

新規作成ユーザとして画面遷移するので、開いてたページが一旦サインアウトされちゃったりすることがあります。
そうなると、新規作成したユーザだとAWSコンソールにそもそも権限がなくて入れない。
かといって、今まで利用してたユーザで入りなおすと別画面になるわけです。

つまり、設定に必要なキー情報を取得できるページに二度と戻れなくなります

こうなったら仕方ないので新しくユーザ作成しちゃいましょう。

2.文字コード

WindowsでASK CLIを使ってask newとかすると新しいプロジェクトが作れますが、そこで生成されるひな形類を日本語対応させないといけません。
が、この時、文字コードSJISだとデプロイとかできないし、できてもスキルとして流れる音声がバグります

落としてきたファイルはUTF8に変換してあげましょう。

3.Node.jsのバージョン

僕は大丈夫だったんですけど、どうも人によってはNode.jsのバージョンが新しいとASK CLIのインストールや設定でコケるらしいです。

■セッション2 ダイアログモデル

公式ドキュメントはこことかになります。
配られた資料は別にあります。

developer.amazon.com

ほとんどの時間をセッション1に割いていたので、セッション2は聞いてるだけな状態でした。
けれども、ここは中級編なので、スキル開発経験者しか基本的に参加していないのです。

なので、
ダイアログモデルを使うとスロットの内容を逐一 if-elseしなくても楽に書けますよ
というのが即時わかりました。

これ結構便利なやりかたなので、活用できると強いと思います。
コード量が減るので大変良い感じです。

参加した所感

事前に展開されてた内容とは異なっていたものの、ASK CLIはすごいです。
存在は知ってたけど放置プレイしてました。

今後使いまくりたいと思います。

それにしても、VUIのスキルをGUIではなくCLIで作成するというのも中々面白いですね。