[日本語Alexa] AMAZON.RepeatIntentを実装して「もう一回」「もう一度言って」に対応する〜より自然に会話できるスキル作成のために〜

1 はじめに

前回、前々回、「〜より自然に会話できるスキル作成のために〜」と題して、スキルで自然に対話させる要領について紹介してきました。

今回は、ユーザーがAlexaからのレスポンスを聴き逃してしまったり、聞き取れな無かった時に、「もう一回」とか「もう一度」って言って、聞き直せるようにする実装について紹介します。

Alexa: 答えは、次のうちどれですか?
Alexa: 1番 XX◯◯X
Alexa: 2番 △XX◯◯
Alexa: 3番 X◯◯◆◆

ユーザー:(うーんと・・・あれ1番は何だっけ・・・?)
ユーザー:ごめん!もう一回!

なお、これは、組み込みインテントである、AMAZON.RepeatIntentに対応させると言うだけの話で、特に、テクニックとか大袈裟なものではな無いことを予めご了承下さい。

2 AMAZON.RepeatIntent

標準インテントは、停止、キャンセル、ヘルプの表示など、共通の一般的なアクションのために予め定義されている組み込みのインテントです。

そして、この標準インテントの1つにAMAZON.RepeatIntentがあります。
参考:一般的標準インテント

3 インテントの拡張

標準インテントは、サンプル発話を定義しなくても利用できますが、追加することも可能です。より状況に合わせた聞き直しに対応することで、自然な会話に対応できるかもしれません。

次の図は、AMAZON.RepeatIntentにサンプル発話を追加している状況です。

これにより、「もう一回言って」 というような自然な聞きなおしに対して、AMAZON.RepeatIntentがリクエストされていることが確認できます。

4 実装

同じ発話をもう一度再生するためには、最後に発話した内容を保存しておくのが手っ取り早いでしょう。保存する先は、DBでも構いませんが、セッションをまたぐ必要が無いので、sessionAttributesで充分でしょう。

次のコードは、発話の内容を常に attribute['output'] に入れるようにし、AMAZON.RepeatIntentが呼ばれたら、それを再生している例です。

'StartIntent': function () {
  let output = 'XXXXです';
  this.attributes['output'] = output;
  this.emit(':ask', output);
},
'Unhandled': function () {
  this.emit('StartIntent');
},
'AMAZON.RepeatIntent': function () {
  this.emit(':ask',this.attributes['output']);
},

スキルが動作している様子です。

スキルのハンドラー部分のコードは、次のようになっています。

const handlers = {
  'StartIntent': function () {
    let output = '突然ですが、問題です。次の内、もっとも義理人情を大事にする動物は、どれでしょう。1番、くじら、2番、ぺんぎん、3番、しまうま、4番、カブトムシ、5番、ハムスター、番号でお答え下さい。';
    this.attributes['output'] = output;
    this.emit(':ask', output);
  },
  'Unhandled': function () {
    this.emit('StartIntent');
  },
  'AMAZON.RepeatIntent': function () {
    this.emit(':ask','仕方ないなぁ、もう一回いいますね。' + this.attributes['output']);
  },
  'AnswerIntent': function () {
    this.emit(':tell',"残念。また、あそんで ね〜");
  }

5 最後に

今回は、ユーザーの自然な聞き直しに対応する話でした。

最初にお断りしたとおり、これは、「標準インテントであるAMAZON.RepeatIntentに対応させる」と言うだけの話で、Alexa SDKのサンプルでも紹介されている手法です。

今後、積極的に取り入れていきたいと思います。