するめごはんのIT日記

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

二番目に作成そして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業界の光闇」について触れさせていただきました。