가장 먼저 작성한 Alexa 스킬 「오사카 변상 망치」

미안해.

이 기사는
「스메고 밥의 VUI・스마트 스피커 Advent Calendar 2018」
첫날 기사입니다.

올해 4월 말 저는 VUI에 전념하기 위해 회사를 그만두고 무직이 되었습니다.
지금은 프리랜서 엔지니어로서 VUI 프로듀서를 자칭하고, VUI 관련 일을 받고 생활하고 있습니다.

그런데, 최초의 기사로서는, 나 자신이 최초로 세상에 공개한 스킬에 대해 기재합니다.

내가 처음으로 세상에 출시한 VUI의 스킬 앱(액션)은 2018년 5월 7일에 공개되었다
오사카 변상 망치(오사카 벤 아이즈치)
라는 스킬입니다.



Google Home에서 개인적으로 놀고 있던 액션(앱)은 이미 있었지만, 공개된 첫 작품은 이 Alexa 스킬이 되었습니다.

움직임은 간단하고,
"알렉사, 오사카 변상 망치를 열고"
라고 말을 걸면 오사카 사투리로 말하기 때문에 사용자가 뭔가 말을 걸면 오사카 사투리로 망치를 돌려줍니다.

Alexa developer console에서는 다음과 같이되어 있으며,
하나의 인텐트, 거기에 any 슬롯입니다.

그리고는 다른 스톱이나 캔슬의 인텐트에, 오사카 밸브로서 그 움직임을 하는 대사를 등록하고 있습니다.



슬롯의 내용도 아래와 같이 「호시호게」밖에 없습니다.



즉, 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 원년에 대해 기재해 나가려고 생각하고 있습니다.

좋은 웹페이지 즐겨찾기