Alexaスキル開発をお試ししてみた

我が家にも話し相手(Amazon Echo)が来ましたので、Alexaスキルで遊んでみました。




1. アカウント作成

ここを見ながら進めるよ。
Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発

Alexaスキルを開発するためには、2つのアカウントが必要です。
  • Amazon Developer アカウント
  • AWS アカウント
どっちも持ってなかったので、新規作成しました。

デベロッパーアカウントは以下のページの左上のハンバーガーを押して、「サインイン」をクリックすると取得できる。US Amazonの方から一部情報が引っ張られてきてる感があるので、買い物したことある人なら入力するべき欄は少ないかもしれない。
Amazon Developer Services and Technologies

AWSアカウントは以下サイトを参照しつつやった。電話によるアカウント認証は、携帯電話番号の初めの ”0” を抜かないと電話かかってこないので注意。
AWS アカウント作成の流れ


2. スキル作成

ここを見ながら進めるよ。
ALEXAで開発する流れ(日本語UI)

基本的には上のサイトの通り進めれば大丈夫。途中、AWS Lambdaで関数を作るときのフォームが今のものとは違うので、そこだけ補足。
  • ロールは「規定のロールを選択」が無くなっているので、「新規~」を選択
  • ロール名は適当に設定。 myColorRole とかでいい。
  • アプリケーションIDは、開発者コンソールの画面上部、アプリ名の下に書いてある
    "amzn1.ask.skill.xxxxxxxxx" みたいなやつをコピペする
違いはそのくらいでした。


3. トラブルシューティング

すごく丁寧なサイトを見ながらやってもエラーは起きるものです。対話モデルもAWS Lambdaの関数も作り終わって、サービスシミュレータでテストしてみると、こんなエラーが出た。

The remote endpoint could not be called, or the response it returned was invalid

エラーメッセージでググった感じだと、(当然ながら)何か入力を間違えていて、Lambda側でエラーになっているらしい。Lambda側の関数のテストを実行してみましょう。

  1. サービスシミュレータの左側のJSONを丸っとコピー
  2. Lambdaの方で、関数ページの右上に「テスト」があるので押す
  3. ダイアログが出てきたら、コピーしたJSONをペーストして、適当な名前でイベントを保存
  4. 「テスト」を押す
すると、Javascriptのどこでエラーになったのかを丁寧に教えてくれます。


index.jsの170行目でエラーはいてるみたいですね。見に行ってみましょう。該当する index.js というのは、AWSのページ下部のエディタから見れます。

170行目を含む関数はこんな具合のコードでした。この中では、処理すべきIntent名がハードコーディングされているわけですが、僕のSkill側の設定がミスってて、条件のどれにも引っかからずにエラールートに入っているようでした。

/**
 * Called when the user specifies an intent for this skill.
 */
function onIntent(intentRequest, session, callback) {
    console.log(`onIntent requestId=${intentRequest.requestId}, sessionId=${session.sessionId}`);

    const intent = intentRequest.intent;
    const intentName = intentRequest.intent.name;

    // Dispatch to your skill's intent handlers
    if (intentName === 'MyColorIsIntent') {
        setColorInSession(intent, session, callback);
    } else if (intentName === 'WhatsMyColorIntent') {
        getColorFromSession(intent, session, callback);
    } else if (intentName === 'AMAZON.HelpIntent') {
        getWelcomeResponse(callback);
    } else if (intentName === 'AMAZON.StopIntent' || intentName === 'AMAZON.CancelIntent') {
        handleSessionEndRequest(callback);
    } else {
        throw new Error('Invalid intent');
    }
}

スキル側のIntent名を修正すると、ちゃんと応答を返してくれるようになりました。


4. 日本語化

実はこのままだと英語で喋ってくれるみたいです。というのも、index.js の中に応答フレーズが書き込まれているのですが、全部英語なのです。なので、ちまちまと日本語化してきます。例えばこんな具合に。

/**
 * Sets the color in the session and prepares the speech to reply to the user.
 */
function setColorInSession(intent, session, callback) {
    const cardTitle = intent.name;
    const favoriteColorSlot = intent.slots.Color;
    let repromptText = '';
    let sessionAttributes = {};
    const shouldEndSession = false;
    let speechOutput = '';

    if (favoriteColorSlot) {
        const favoriteColor = favoriteColorSlot.value;
        sessionAttributes = createFavoriteColorAttributes(favoriteColor);
        speechOutput = `キミの好きな色は ${favoriteColor} だね?`;
        repromptText = "よくわからん。好きな色は赤です、とか言って。";
    } else {
        speechOutput = "よくわからんから、もっかい言って。";
        repromptText = "よくわからん。好きな色は赤です、とか言って。";
    }

    callback(sessionAttributes,
         buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession));
}


5. 実機でテストする

自分の作ったスキルを実機で試すには、ベータテストとして配布しなければならないようです。で、配布するためには公開情報とかコンプライアンスの云々とか入力する必要があるみたい。きちんとしたスキルを開発して公開するならともかくとして、今回はお試ししたいだけなので、カテゴリ "Novelty & Humor" を選び、適当にしのいだ。

スキルのアイコンは必ず設定しなければならず、小さいアイコン(108x108)と、大きいアイコン(512x512)を用意しないといけない。アップロード前にサイズをサイズを調整しておかないとなので、注意が必要。

「スキルのベータテスト」のボタンが押せるようになったら押す。テスターのメールアドレスを指定するページに飛ぶので、Alexaとつながっている(=Alexaを買ったアマゾンアカウントのメールアドレス?)を指定して、送信。


すぐに招待メールが届くので、メールに従って "Enable Alexa skill XXXX" のリンクを押す。リンクを押すとアレクサの管理画面に飛ぶので、スキルを有効化して、自分のスキルを使ってみましょう。



感想

畑違いすぎてめっちゃ難しかった。今回の作ったスキルはザックリいうと

僕「私の好きな色はです」
アレクサさん「あなたの好きな色はですね?」

という具合にオウム返しするスキルなのですが、ここで色以外の適当なことを言うと

アレクサさん「あなたの好きな色はundefinedですね?」

なんて感じで、完全にバグってる応答をしちゃいます。ここでぬるぽにならないだけマシなのかしら。index.jsを見直しても、なんでundefinedって喋っちゃうのか分からない。

あと、AWSと開発者コンソールを行ったり来たりしないといけないのが割と面倒かなと思った。何かこう一元管理できるものがあればいいのだけれど…。

でもなかなか面白いですね。自分でスキルを組み立てて、自分の言葉でその通りにモノが動くのはなかなかの感動です。最近 eRemote mini も買ってアレクサさんで家電操作もできるようになったので、スキル開発も含めて色々試していこうかなー。


コメント