Alexa虎の巻(4)豆知識スキルでもAlexaと会話を続けたい

記事タイトルとURLをコピーする

https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200712/20200712033525.png  こんにちは、サーバーワークスのこけしの人、坂本(@t_sakam)です。

 さて、前回の「Alexa虎の巻」の第3回目は「Alexa-hostedスキルで豆知識スキル」をお届けしました。
 
 今回も「豆知識スキル」を使います。前回のスキルの動きをみていただくとわかるように、このスキルは「豆知識を実行して」とユーザーが言うと「Alexaが豆知識を一つ教えてくれてそのまま終了する」という動きでした。ただ、スキルの動きとして一つの豆知識を教えてもらうだけだとちょっと物足りなくはないでしょうか? もう少しAlexaと会話を続けたいなーと思いませんか? ですので、今回は「他の豆知識を知りたいときに、引き続きAlexaから教えてもらえる」ようににコードを変更していきたいと思います。

 スキルが終了してしまうのはセッションが終了してしまうからなので、セッションが続くようにコードに変更を入れていきます。今回もAlexa開発者コンソールのシュミレーターを使って、スキルから返ってくるJSONの中身を確認しながら、コードの変更をおこないます。

1. Alexa開発者コンソールのトップページ

 Alexa開発者コンソールのトップページを開きます。スキル一覧の中から「豆知識」リンクをクリックします。 https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200712/20200712033528.png

2. 豆知識スキルのトップページ

 まずは、前回と同じようにスキルを動かしていまの動作を確認してみます。画面上メニューから「テスト」を選択します。 https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200712/20200712033532.png

3. テスト

 画面左上の入力欄に「豆知識を実行して」と入力してマシンの「Enter」ボタンを押します。 https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200712/20200712033538.png

4. 「JSON出力」を確認1

 「JSON出力」を確認しておきます。「outputSpeech」オブジェクトの「text」の値は「知ってましたか?…」ではじまる、Alexaからの文言となっています。次の手順の「JSON出力」と比べたいと思いますので、なんとなくこの結果を頭の隅に入れておいていただくか、次の手順に進んだときに、またこの手順に戻って違いを確認してみてください。※↓この画像はクリックすると拡大します。

5. ヘルプ

 前回も確認したヘルプのときの動きを確認します。入力欄に「豆知識を実行してヘルプ」と入力してマシンの「Enter」ボタンを押します。 https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200712/20200712033545.png

6. 「JSON出力」を確認2

 まず、「outputSpeech」オブジェクトの「text」の値は「豆知識を聞きたい時は…」ではじまるAlexaが話す文言となっています。他、先程の手順4では無かった「JSON出力」に「reprompt」オブジェクトと「shouldEndSession」プロパティが出現しているのがわかります。
 「reprompt」オブジェクトの「text」の値は、ユーザーから返事がなかった場合、8秒後にAlexaがユーザーに聞き返してくれる文言が入っています。「どうしますか?…」となっていますね。このテスト用のシュミレーターでは聞き返してくれないので、Echo等の実機がある方はEchoで確認してみてください。※↓この画像はクリックすると拡大します。  「shouldEndSession」プロパティの値は「false」となっています。スキルのセッションを終了させたくない場合は、このプロパティの値が「false」になっていないといけません。手順4の結果では「reprompt」オブジェクトと「shouldEndSession」プロパティが出現していなかったので、スキルのセッションが終了した、ということになります。

7. 「JSON出力」を確認3

 ヘルプのメッセージで「豆知識を聞きたい時は「豆知識」と、終わりたい時は「おしまい」と言ってください。どうしますか?」と聞かれていたので、「豆知識」といってみます。手順4と同じように、「reprompt」オブジェクトと「shouldEndSession」プロパティは出現していません。スキルはここで終了しています。
 次はコードの方を確認して、この動きの違いをみていきたいと思います。画面上メニューの「コードエディタ」をクリックします。※↓この画像はクリックすると拡大します。

8. index.js

 スキルのロジックが書かれた「index.js」ファイルが表示されています。 https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200712/20200712033559.png

9. GetNewFactHandlerを確認

 まずは、スキルのセッションが終了してしまう方である「GetNewFactHandler」を確認してみます。※↓この画像はクリックすると拡大します。  .speak(speakOutput)の箇所はAlexaに話してもらいたいことを指定しています。その下に英語ですが、コメントが丁寧にかかれています。

// Uncomment the next line if you want to keep the session open so you can
// ask for another fact without first re-opening the skill
// .reprompt(requestAttributes.t('HELP_REPROMPT'))
セッションをオープンにしておきたい場合は、次の行のコメントを外してください。 スキルを開き直さずに別の事実を尋ねることができます。 .reprompt(requestAttributes.t('HELP_REPROMPT'))

 そうなんです。なんと、この「reprompt」メソッドを追加するだけで、セッションが終了しなくなり、Alexaとユーザーが会話を引き続き続けられるようになります。そして、このメソッドを追加することで得られる恩恵はまだあります。まず、8秒間ユーザーから返事がない場合に、Alexaから「どうしますか?」と聞き返してくれます。また、Alexaが聞き返したあと、更に8秒間ユーザーから返事がなかったときにはスキルを終了してくれます。この一連の動きが「reprompt」メソッドを追加するだけで実現できます。

10. HelpHandlerを確認

 先程、セッションが終了しなかった「ヘルプ」を呼び出したときのコードをみてみます。 「HelpHandler」を確認します。  ありました、「reprompt」メソッド。「.reprompt(requestAttributes.t('HELP_REPROMPT'))」と書かれています。これによって、セッションが終了せず、スキルが続けられたのですね。 ※↓この画像はクリックすると拡大します。

11. repromptメソッドを追加しコードを保存

 「GetNewFactHandler」に「HelpHandler」と同じように「reprompt」メソッドを追加します。ひとまず、Alexaが話す文言(requestAttributes.t('HELP_REPROMPT'))も「ヘルプ」のときと同じにしておきます。その後、画面右上の「保存」ボタンを押します。※↓この画像はクリックすると拡大します。

12. デプロイ

 保存ができたら、画面右上の「デプロイ」ボタンを押してスキルに反映します。 https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200712/20200712033618.png

13. デプロイ完了

 画面右下に「デプロイが完了しました。」というメッセージが表示されたら、デプロイ完了です。もう一度、シュミレーターで動かしてみましょう。画面上メニューから「テスト」をクリックします。 http://blog.serverworks.co.jp/tech/wp-content/uploads/2020/06/alexa_toranomaki_04_013.png

14. 変更点をシュミレーターで確認1

 また先程の入力欄に「豆知識を実行して」と入力してマシンの「Enter」ボタンを押します。Alexaが豆知識を教えてくれます。
 画面右の「JSON出力」を確認すると、今後は「reprompt」オブジェクトと「shouldEndSession」プロパティが出現しています。「shouldEndSession」プロパティの値は「false」となっているので、セッションは終了しません。続けて入力欄に「豆知識」と入力してマシンの「Enter」ボタンを押します。※↓この画像はクリックすると拡大します。

15. 変更点をシュミレーターで確認2

 今度も「reprompt」オブジェクトと「shouldEndSession」プロパティが出現しています。 request.type === 'LaunchRequest'(リクエストタイプがLaunchRequestだったら)もしくはrequest.type === 'IntentRequest' && request.intent.name === 'GetNewFactIntent'(リクエストタイプがIntentRequestでリクエストインテントネームがGetNewFactIntentだったら)という条件の「GetNewFactHandler」に「reprompt」メソッドを足したので、スキルを起動したときも、その後「豆知識」と言って、次の豆知識に進んだときも同じ動きになります。※↓この画像はクリックすると拡大します。

まとめ

 今回は前回「Alexa-hostedスキル」を使ってつくった「豆知識スキル」を少し変更して、スキルがすぐに終了しないようにしてみました。これで、一個の豆知識を聞いて終わりではなく、もっと豆知識を聞きたい場合は、そのままスキルを続けることができるようになりました。
 しかも、変更点は「reprompt」メソッドをコードに足すだけだったので、簡単でしたね。    いかがでしたでしょうか? なんとなく、スキルの変更も結構簡単にできることがおわかりいただけたのではないでしょうか?  次回も引き続き、同じような感じで続きを説明していきたいと思いますので、お楽しみに!    いや〜、「Alexa」って本当にいいものですね!

坂本 知子(記事一覧)

サーバーワークスのこけしの人(@t_sakam)。2020 APN AWS Top Engineers。