見出し画像

Dialogモデルでの会話インタラクション

 起動するだけのスキルならば簡単なのですが、たとえば「5個の2ケタ数字を足す計算問題を出して!」というような変数付きスキルの場合、ユーザーが全ての情報をスムースに発話してくれるとは限りません。
 
『「何桁」の数字を「何個」足す』と指定する場合には次のような状態が発生します。
 ・ユーザーが桁数しか指定しない
 ・ユーザーが個数しか指定しない
 ・ユーザーが何も指定しない
 
このようにアレクサに指示を出す時の変数(スロット)が複数の場合、ユーザーから足らない情報を聞き出すための会話はとても複雑になります。そんな時に便利なのが、この記事の「Dialogモデル」です。


Node.js側のハンドラは以下のようになり、見通しの良いプログラムになります。

// ゲームレベルを指定してもらう「○桁を△個」
const askLevelStateHandlers = Alexa.CreateStateHandler(STATES.WAITING_FOR_GAMELEVEL, {
 'LevelSetIntent': function () {
  if (this.event.request.dialogState === 'STARTED') {
   var updatedIntent = this.event.request.intent;
    ・・・ここでupdatedIntentのスロットにデフォルト値を入れることもできる・・・
   this.emit(':delegate', updatedIntent);
   return;
  } else if (this.event.request.dialogState !== 'COMPLETED'){
   this.emit(':delegate'); // スロットに値が入るまでAlexaに任せる
   return;
  } else {
    // 全て必要なスロット値が揃った時は、以降の処理が走る
  }
  var ketasuu = intent.slots.ketasuu.value;
  var kosuu = intent.slots.kosuu.value;
 
    ・・・ここでゲームスタートの準備・・・
 
  this.handler.state = STATES.EXECUTE;
  this.emitWithState('GameStartIntent', true);
 },
 'AMAZON.HelpIntent': function () {・・・・・・},
 'AMAZON.CancelIntent': function () {・・・・・・},
 'AMAZON.StopIntent': function () {・・・・・・},
 'Unhandled': function () {・・・・・・},
});

DialogモデルについてのAmazon本家のASKリファレンスはこちら。

#alexa #skill #dialogmodel #code


この記事が気に入ったらサポートをしてみませんか?