WordPress
AWS
EC2
Alexa
AlexaSkillsKit

WordPressでAlexaスキル開発&公開してみた(6:RepeatIntent)

はじめに:

スキル第一弾:Alexaスキル名:「美浜区の避難場所探してみよう」で無事リリース出来たので,調子に乗って, 同じ仕組みを使って,

  • スキル第ニ弾:Alexaスキル名:「花見川区の避難場所探してみよう」(2018/07/07現在,審査中)

を開発した際の顛末をメモしておきます.

●追記:Alexaスキル名:「花見川区の避難場所探してみよう」は無事,2018/07/09に公開されました*

初回申請結果:

AmazonAlexaチームから,「この度は残念ではございますが」メール が届き,申請却下の理由が記載されていました.

指摘事項ですが,

  • 指摘事項の1つ目:ヘルプをしっかり作ろうね
  • 指摘事項の2つ目:ユーザのリクエストに対して,AMAZON.RepeatIntentで,しっかり応答してね

でした.スキル第一弾の時と同じ仕組みをそのまま流用していたのですが・・・・.

AMAZON.RepeatIntent対応:

気を取り直して,指摘事項の1つ目は,文言の修正だけなので,すぐに対応しました.指摘事項の2つ目:ユーザのリクエストに対して,AMAZON.RepeatIntentで,しっかり応答してね,ですが,具体的には,

ユーザー:もう一度
スキル :(無言・・・・・・)=>セッションが開いたママ

となってしまっているので,きちんと応答させてね,とのこと,AMAZON.RepeatIntentのリクエストに対して無応答なので,応答してあげればOKなので,まずは調査をしてみました.

調査してみた:

調査項目ですが,下記3つです.

  • WordPress側のREST-API のログ調査
  • WordPressのプラグイン(voicewp)のソースコード調査
  • WordPressのDBのテーブル内容を調査:

REST API のログ調査:

Alexaとの対話の際に,スキルが無応答になる箇所ですが,

ユーザー:もう一度
スキル :(無言・・・・・・)=>セッションが開いたママ

の部分のREST-APIログを見たところ,

REST-APIログ(抜粋)

"request":{"type":"IntentRequest","requestId":"xxxxxxxxxxxxxxxx",
"timestamp":"2018-07-06T11:59:39Z","locale":"ja-JP",
"intent":{"name":"AMAZON.RepeatIntent","confirmationStatus":"NONE"}

となっており,AlexaのAPIからWordPressのエンドポイントへのリクエストが記録されていました.
(WordPressプラグイン:REST API Logを利用しています)

WordPressのプラグイン(voicewp)のソースコード調査:

次に,AMAZON.RepeatIntentの処理がどうなっているか,WordPressのプラグイン(voicewp)のソースコードを調査してみたところ,該当箇所を発見しました.

news.phpの16行目近辺
    public $intents = array(
        'Latest',
        'LatestTerm',
        'ReadPost',
        'AMAZON.StopIntent',
        'AMAZON.HelpIntent',
        'AMAZON.CancelIntent',
    );

news.phpの128行目近辺
        case 'AMAZON.StopIntent':
        case 'AMAZON.CancelIntent':
            $this->message( $response, 'stop_intent' );
            break;
        case 'AMAZON.HelpIntent':
            $this->message( $response, 'help_intent' );
            break;
  • AMAZON.StopIntent
  • AMAZON.HelpIntent
  • AMAZON.CancelIntent

はあるものの,AMAZON.RepeatIntentだけ見当たらず・・・・・.

もうひとつのPHPソースでは,

fields.phpの254行目近辺
        'help_intent' => new Fieldmanager_TextArea( array(
            'label' => __( 'Help message', 'voicewp' ),
            'description' => __( "This is the message a person hears when they ask your skill for 'help'", 'voicewp' ),
            'default_value' => __( "{put your skill name here} provides you with the latest content from {your site name}. You can ask me for the latest articles, and then select an item from the list by saying, for example, 'read the 3rd article' Or you can also say exit... What can I help you with?", 'voicewp' ),
            'attributes' => array( 'style' => 'width: 95%; height: 70px;' ),
        ) ),
        'list_prompt' => new Fieldmanager_TextArea( array(
            'label' => __( 'List Prompt', 'voicewp' ),
            'description' => __( 'This message prompts the user to select a piece of content to be read after hearing the headlines.', 'voicewp' ),
            'default_value' => __( 'Which article would you like to hear?', 'voicewp' ),
            'attributes' => array( 'style' => 'width: 95%; height: 50px;' ),
        ) ),
        'stop_intent' => new Fieldmanager_TextArea( array(
            'label' => __( 'Stop message', 'voicewp' ),
            'description' => __( 'You can optionally provide a message when a person is done with your skill.', 'voicewp' ),
            'default_value' => __( 'Thanks for listening!', 'voicewp' ),
            'attributes' => array( 'style' => 'width: 95%; height: 50px;' ),
        ) ),

  • AMAZON.StopIntent
  • AMAZON.HelpIntent

は記述されているものの,AMAZON.RepeatIntentは記述されていませんでした.
AMAZON.CancelIntentStopIntentと同じ応答内容にしている様子)

WordPressのDBの中身調査:

次に,WordPressのDBのテーブル名:wp_optionsを見てみたところ,voicewp-settingsのデータが登録されていました.

wp_optionsテーブルの内容(抜粋)
voicewp-settings,
a:9:{
s:10:"skill_name";s:45:"花見川区の避難場所探してみよう";
s:14:"launch_request";s:628:"これは、花見川区の避難場所を学ぶことができる学習コンテンツです。千葉市花見川区には指定緊急避難場所、指定避難所、広域避難場所、津波避難ビルの4種類の避難場所がありますが、「そういえば,どこにあったかなあ・・・」という時に、お住まいの地域名で避難場所を探すことができます。まずは、お住まいの「地域名」や、「最寄りの駅名」を、話しかけてみてください。操作方法を知りたい場合は、「操作方法を教えて」と,話しかけてみてください。";
s:11:"help_intent";s:451:"このスキルは、音声で花見川区の4種類の避難場所を探すことが出来ます。例えば「こてはし台の避難場所を教えて」とか「新検見川駅周辺の避難場所を教えて」というふうに、お住まいの「地域名」や「最寄りの駅名」を、話しかけてみてください。もういちど聞く場合は「もういちどまるまるを教えて」と話しかけてみてください。";
s:11:"list_prompt";s:66:"があります。番号を選んで話しかけてください。";
s:11:"stop_intent";s:78:"終了する場合は、「終了して」、と話しかけてください。";

(本来は1行ですが,見やすくしています)

やはりAMAZON.RepeatIntentに関しては見当たりません.WordPress管理画面で登録した設定内容をDBにぶち込んでいるようです.

プラグイン改造作業:改造は自己責任でお願いします

それにしても,voicewpの開発者の皆さん,何故にAMAZON.RepeatIntentの処理を記述しなかったのでしょうか・・・・・.ということで,プラグイン改造作業を行いました.

news.phpの16行目近辺
    public $intents = array(
        'Latest',
        'LatestTerm',
        'ReadPost',
        'AMAZON.StopIntent',
        'AMAZON.HelpIntent',
        'AMAZON.CancelIntent',
        'AMAZON.RepeatIntent', /**追加分**/
    );
news.phpの128行目近辺
        case 'AMAZON.StopIntent':
        case 'AMAZON.CancelIntent':
            $this->message( $response, 'stop_intent' );
            break;
        case 'AMAZON.HelpIntent':
            $this->message( $response, 'help_intent' );
            break;
        /**追加分start**/
        case 'AMAZON.RepeatIntent':
            $this->message( $response, 'repeat_intent' );
            break;
        /**追加分end**/

fields.phpの254行目近辺
        'list_prompt' => new Fieldmanager_TextArea( array(
            'label' => __( 'List Prompt', 'voicewp' ),
            'description' => __( 'This message prompts the user to select a piece of content to be read after hearing the headlines.', 'voicewp' ),
            'default_value' => __( 'Which article would you like to hear?', 'voicewp' ),
            'attributes' => array( 'style' => 'width: 95%; height: 50px;' ),
        ) ),

        /**追加分start**/
        'repeat_intent' => new Fieldmanager_TextArea( array(
            'label' => __( 'Repeat message', 'voicewp' ),
            'description' => __( 'This is repeat message fields', 'voicewp' ),
            'default_value' => __( 'Repeat Message', 'voicewp' ),
            'attributes' => array( 'style' => 'width: 95%; height: 50px;' ),
        ) ),
        /**追加分end**/

        'stop_intent' => new Fieldmanager_TextArea( array(
            'label' => __( 'Stop message', 'voicewp' ),
            'description' => __( 'You can optionally provide a message when a person is done with your skill.', 'voicewp' ),
            'default_value' => __( 'Thanks for listening!', 'voicewp' ),
            'attributes' => array( 'style' => 'width: 95%; height: 50px;' ),
        ) ),

動作確認:

諸々作業が終わったので,動作確認を行いました.確認項目は下記の3つとなります.

  • WordPressのvoicewpプラグイン管理画面の確認:
  • WordPressのDBのテーブル内容を再調査:
  • Alexa応答の検証:

●WordPressのvoicewpプラグイン管理画面の確認:(赤丸のところ)
無事に,repeat_intentの入力フィールドが追加されましたので,AMAZON.RepeatIntentのリクエストのレスポンスに,自分好みの文言を追加しました.

dashboard20180706.jpg

●WordPressのDBのテーブル内容を再調査:
無事にrepeat_intentの文言の内容が追加されていました.

wp_optionsテーブルの内容(抜粋)
voicewp-settings,
a:10:{
s:10:"skill_name";s:45:"花見川区の避難場所探してみよう";
s:14:"launch_request";s:628:"これは、花見川区の避難場所を学ぶことができる学習コンテンツです。千葉市花見川区には指定緊急避難場所、指定避難所、広域避難場所、津波避難ビルの4種類の避難場所がありますが、「そういえば,どこにあったかなあ・・・」という時に、お住まいの地域名で避難場所を探すことができます。まずは、お住まいの「地域名」や、「最寄りの駅名」を、話しかけてみてください。操作方法を知りたい場合は、「操作方法を教えて」と,話しかけてみてください。";
s:11:"help_intent";s:451:"このスキルは、音声で花見川区の4種類の避難場所を探すことが出来ます。例えば「こてはし台の避難場所を教えて」とか「新検見川駅周辺の避難場所を教えて」というふうに、お住まいの「地域名」や「最寄りの駅名」を、話しかけてみてください。もういちど聞く場合は「もういちど●▲■を教えて」と話しかけてみてください。";
s:11:"list_prompt";s:66:"があります。番号を選んで話しかけてください。";
s:13:"repeat_intent";s:114:"もういちど聞く場合は「もういちどまるまるを教えて」と話しかけてみてください。";
s:11:"stop_intent";s:78:"終了する場合は、「終了して」、と話しかけてください。";

(repeat_intentが追加されています)

●アレクサ応答:
無事に,管理画面で登録した文言での応答がありました.

ユーザー:もう一度
スキル :もういちど聞く場合は、「もういちど●▲■を教えて」、と話しかけてみてください。

まとめ:

申請前の動作確認作業を念入りに行ったつもりだったのですが,AMAZON.RepeatIntentの無応答の件は,完全に見落としていました.Alexaチームの皆さん,ご指摘ありがとうございました.