6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ごきげんよう

この記事は
「するめごはんの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元年について記載していこうと考えております。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?