【完結?】2時間でAlexaスキルを作ってみたけどできなかった話 その5

はじめに

  • 前回、これまで作成を進めてきた「面接練習」スキルをストアへ申請したところ、リジェクトされた
  • リジェクトされた理由が詳しくフィードバックされたため、対応を行う

やってみたこと

フィードバックの確認

メールでこんな感じの内容が通知された。

1.「これから面接練習をします。・・・よろしいですか?」へ「いいえ」と答えた場合の処理ができてない

ユーザー:アレクサ、面接練習をスタート
スキル :これから面接練習をします。質問に回答してください。よろしいですか?
ユーザー:いいえ
スキル :最近苦労したことはなんですか?
(セッションクローズ)

現状では上記のようなフローになっている。

これは単純に場合分けの処理漏れなので、正しく処理を直す必要があると認識した。

2.Alexa側から質問を受け付ける前にセッションがクローズされている

ユーザー:アレクサ、面接練習を開いて
スキル :これから面接練習をします。質問に回答してください。よろしいですか?
ユーザー:はい
スキル :今後やりたいことはなんですか?
(セッションクローズ)

現状では上記のようなフローになっている。

これは想定した動作である。
このスキルは、質問を投げるが、あえてユーザから回答を受け付けない作りにしている。なぜなら、面接における質問への回答として想定されるものは、Alexaスキルが受付られるテキスト量を超えてしまうためである。また、回避策が見つからなかったためである。

しかしながら、これはAlexaスキルとしてはふさわしくない振る舞いになってしまっていると自己反省した。

特に事前知識がないユーザが使った場合を考慮できていないためである。最後に質問が投げかけられるにも関わらず、ユーザの回答を待たずに終了してしまうというのは、ユーザの誤解(「あれ、回答するまえに終わっちゃった。バグだ!」みたいな)を招く可能性がある。

そのため、前後に適切な説明を追加する必要があると認識した。

3. ヘルプがテンプレのまま(未実装である)

ユーザー:アレクサ、面接練習を開いて
スキル :これから面接練習をします。質問に回答してください。よろしいですか?
ユーザー:ヘルプ
スキル :You can say hello to me! How can I help?

現状では上記のようなフローになっている。

これは単純に処理漏れなので、正しく文章を設定する必要があると認識した。

修正

コードエディタで修正を行った

1.「これから面接練習をします。・・・よろしいですか?」へ「いいえ」と答えた場合の処理ができてない

他のインテントに該当しない発話に対して、StartIntentがコールされてしまう。

そのため「いいえ」はStartIntentをコールしてしまう。

調査に時間がかかっているので、有識者に聞いてみる・・。

一旦飛ばす!

2.Alexa側から質問を受け付ける前にセッションがクローズされている

説明を修正した

const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
    },
    handle(handlerInput) {
        const speakOutput = 'これから面接練習をします。このスキルでは、質問をランダムに生成します。質問を返した時点でこのスキルは終了します。準備はよろしいですか?';

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};

const StartIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'StartIntent';
    },
    handle(handlerInput) {
        // 質問リスト
        const array = [
            "志望理由は何ですか?",
            "あなたの強みはなんですか?",
            "あなたの弱みはなんですか?",
            "最近苦労したことはなんですか?",
            "最近楽しかったことはなんですか?",
            "今後やりたいことはなんですか?",
            "何か質問ありますか?ふふふ",
            "いまのあなたの課題はなんですか?",
            "どのようなリーダーシップの経験がありますか?",
            "仕事で大事にしていることはなんですか?",
        ]
        const after = "では、お答えください。さようなら。"
        const min = Math.ceil(0);
        const max = Math.floor(array.length - 1);
        let randomInt = Math.floor(Math.random() * (max - min) + min);

        const speakOutput = array[randomInt];

        return handlerInput.responseBuilder
            .speak(speakOutput)
            //.reprompt('add a reprompt if you want to keep the session open for the user to respond')
            .getResponse();
    }
};

3. ヘルプがテンプレのまま(未実装である)

HelpIntentHandlerを修正し、適切なヘルプ文が表示されるようにした

const HelpIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.HelpIntent';
    },
    handle(handlerInput) {
        const speakOutput = 'このスキルでは、質問をランダムに生成します。質問を返した時点でこのスキルは終了します。開始する場合には、「面接練習をはじめて」と言ってください';

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};

再申請

したかったけどできなかった。。

最後に

結局の所、「どのインテントにも該当しない場合には、StartIntentにマッチしてしまう」問題が解決できないと次に進めない。

有識者に聞いてみる。

参考

コメントを残す

メールアドレスが公開されることはありません。