はじめに
この記事は スマートスピーカー Advent Calendar 2019の16日目の記事です。
背景
Alexaスキルのスロットの値にユーザーからの入力をそのまま格納したい場合があります。
実装は可能なのか?自分でググったりもくもく会で質問したりしてきましたが結局はっきりしていなかったのでこの論争(?)に終止符を打ちたいと思います。
結論
できます。
いくつか方法はあるものの現実的にはほぼ一択になっています。つまずきポイントもあるので注意が必要です。
方法その1:キャリアフレーズを活用する
一番簡単な方法は キャリアフレーズ
をうまく使う方法です。
キャリアフレーズ
というとピンと来ませんが、例えば これは {demo_slot} です
のようなサンプル発話があったとしたら、**「これは」と「です」**がそれに当たります。インテントのスロットにはこのキャリアフレーズが必須となっています。
例えば今の気分をユーザーに話してもらいそれを全てスロットの値に格納したい場合は、今の気分は {feeling}
のような感じでサンプル発話を設定しておけば目的は実質達成できそうです。
ただこれだと完全な自由入力とは言えず、尚且つキャリアフレーズが入れやすい場合は問題ないですが、オウム返しの様なスキルを作る時に これから話すよ。 {demo_slot}
などとしてはユーザー体験が下がってしまう気がします。
ただ実装難易度は低いので、スキル開発歴が浅い人はこの方法で妥協してみるのもありません。
方法その2:前後に半角スペースを入れる(非推奨)
インテントのサンプル発話をスロットだけにする事はできませんが、スロットの前後に半角スペースを入れる事で自由入力を許容させることができる裏技があります。予期せぬ入力があってもここに落ちてきてくれるのでフォールバックインテントの様な役割も出来ます。
ちょっとわかりずらいですがこんな感じです。
{demo_slot}
← 前後に半角スペースが入っています
結構有名なハック?でよく聞くやり方です。自分も最近この方法で途中までスキルを作っていましたが開発段階でのテストなどでは問題ありませんが公開審査は通りませんでした。
その時のコメント。
ビルトインスロットタイプのAMAZON.SearchQueryを使用したスロットのみのサンプル発話が含まれています。
AMAZON.SearchQueryを使用するすべてのサンプル発話にはキャリアフレーズを含める必要があります。
テストスキルだけ開発して個人的な目的でしたスキルを使用しない場合はこの方法でも良いかと思いますが、公開を目指す場合は次に紹介する方法一択になるかと思います。
方法その3:ダイアログをデリゲートする
最もオススメなのがダイアログモデルを作成してダイアログをデリゲートする方法です。ダイアログのデリゲートをインテントに設定するとスロットを収集が完了するまでメイン処理を行わないようにしたりできます。
今回はモデルの設定さえすれば自動でやってくれるオートデリゲートを使って説明を進めます。
一番簡単なダイアログの設定方法は開発者コンソール上でモデルを編集する方法かと思います。ask cli
を使って開発している場合は編集後に必ずget-modelサブコマンド
を使ってローカルにモデルの変更を反映します。
以下の手順で設定します。
- 任意のインテントを選択し、インテントスロットの**「ダイアログを編集」**をクリック
-
「このインテントを完了させるために、このスロットは必須ですか?」 をオンにする
-
**「Alexa の音声プロンプト」**にスロットの入力を促す文章を入力して追加
-
**「ユーザーの発話」**に
{demo_slot(任意のスロット名)}
を設定して追加 -
インテントの画面を戻ると**「ダイアログデリゲートのルール」を選べる様になっているので「オートデリゲートを有効化」**を選択(手動で設定する場合は「オートデリゲートを無効」を選択しLambdaのコードも編集する)
-
モデルの保存とビルド
-
テストしてみる
設定した通りにオートデリゲートされている
JSONのリクエストにもスロットの値が入っている
"intent": {
"name": "HelloWorldIntent",
"confirmationStatus": "NONE",
"slots": {
"demo_slot": {
"name": "demo_slot",
"value": "アイウエオ",
"confirmationStatus": "NONE",
"source": "USER"
}
}
},
設定した通りにオードデリゲートされスロットの値が収集されています。
ダイアログの「ユーザーの発話」にはキャリアフレーズは含んでいないため、自由入力がスロットの値に設定できることが確認できました!
どんなことに使える?
自分の場合はユーザーの気分を自由入力で取得し、最近日本語対応したAmazon Comprehendを使い感情分析する際にオートデリゲートを使いました。先日**「ネガポジ判定」**というスキル名で公開したので気になる方は遊んでみてください。
まとめ
色々調べているうちにAlexa開発の知見がたまりました。
スキル開発経験がある方からすると当たり前な情報な気もしますが、インテントのスロットに自由入力が使えないことでAlexa開発を諦める人もいるっぽいので記事にしてみました。
ダイアログのデリゲートはスキル開発の鬼門の様な気もしているので、この辺りを理解するとより気持ちよくスキルが作れそうです。