kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Voiceflow TIPS #20 カスタムスロットでシノニムを使う

Voiceflow夏休みAdvent Calendarの20日目です。1日ビハインドですが、なんとか追いつきたい・・・

ユーザの発話を取るのにちょうどいいスロットタイプがない場合、カスタムスロットタイプを使うと思いますが、もちろんVoiceflowでも使えます。そして、シノニム(同義語)も使えます!ということで、今日はシノニムの設定の仕方です。

例えば、お気に入りのプロ野球チームのマスコットキャラクターを教えてくれるスキルを作るとします。


アレクサ、「プロ野球のマスコットキャラクター検索」をひらいて

プロ野球のマスコットキャラクター検索」スキルです。知りたいマスコットキャラクターの球団名を言ってね。

読売ジャイアンツ

読売ジャイアンツのマスコットキャラクターは、ジャビットだよ。うさぎがモチーフになっているけど、うさぎじゃないんだってさ。


こんな感じですね。とりあえずサラッと作ってみましょう。せっかくなので、Googleスプレッドシートも使いましょう。

スプレッドシートの中身

こんな感じで作りました。スプレッドシート名は「プロ野球の球団マスコット」、シート名は「mascot」としました。データは、teamカラムに球団名、mascot_nameカラムにマスコットキャラクターの名前、mascot_descriptionにマスコットキャラクターの説明を入れてあります。

f:id:kun432:20190820231559p:plain

スキルの作成

f:id:kun432:20190821010902p:plain

最近見てきたものからすると少ないですね。順に見ていきましょう。

最初のSpeak Blockでスキル起動直後の発話です。ここでユーザにチーム名の発話を促します。

f:id:kun432:20190820231412p:plain

Interaction Blockでユーザが発話したチーム名を取得します。プロ野球のチーム名に適したスロットタイプはなさそうなので「カスタムスロットタイプ」で作りました。プロ野球の12球団の一般的(だと思われる)名称をスロット値としていれてあります。ここに合致した場合は"{team}"という変数に入ります。ここのチーム名はスプレッドシートにある球団名と一致している必要があるので注意してください。

f:id:kun432:20190821231822p:plain

あと、インテントや分岐、変数の作成等については割愛します。キャプチャをご覧ください。

f:id:kun432:20190821231834p:plain

f:id:kun432:20190821231846p:plain

Integration BlockでGoogleスプレッドシートから、球団名をキーに、マスコットキャラクターの名前と説明を取得します。ここは過去数回やってるので、説明を割愛します。画面キャプチャを参考にしてください。

f:id:kun432:20190821232233p:plain

f:id:kun432:20190820233940p:plain

f:id:kun432:20190820233952p:plain

テストもちゃんと動いてますね。

f:id:kun432:20190821232452p:plain

f:id:kun432:20190821232437p:plain

次に、If Blockで球団名が見つからない場合の処理を入れます。Retrieveでデータが見つからない場合はIntegration Blockで結果をマッピングしている変数がundefinedになるので、それをチェックします。

f:id:kun432:20190820233248p:plain

Ifの結果、データが見つからなければ、以下のように発話して、再度球団名を取得するところまで戻します。

f:id:kun432:20190821232712p:plain

最後に、きちんとスプレッドシートからデータが取れていればそれをもとに発話します。

f:id:kun432:20190820233332p:plain

テスト

ではテストしてみましょう。

f:id:kun432:20190821232900p:plain

はい、うまく行ってますね。ではこういう場合はどうなるでしょうか?

f:id:kun432:20190821233010p:plain

うまくいきませんね。カスタムスロットに登録していない言い方ですし、当然かなぁと思うかもしれません。

ではこれはどうでしょうか?

f:id:kun432:20190821233202p:plain

これは登録していない言い方ながら認識してくれるみたいですね。

シノニムとは?

このように、ものの言い方には「揺れ」が多数あります。上の例だと、「読売ジャイアンツ」の言い方には、

などなど、色んなバリエーションがあります。カスタムスロット値として登録したものはもちろん正しく認識されてますが、言い方によっては、登録していなくてもAlexa側である程度学習の結果から類推されているもの、全く認識してくれないもの、など、言い方によって結果が変わってしまいます。

今回のスキルではユーザの発話で球団名を取得して、その球団名をキーにGoogleスプレッドシートから取得しています。したがって、スキル側でそれらのパターンもカバーして、スプレッドシート側にも多数の言い方を全部用意しておけばできなくはないです。これを仮に全部カバーしようとした場合はこんな感じになるでしょう。

f:id:kun432:20190821234228p:plain

f:id:kun432:20190821234244p:plain

これ、とても大変ですね・・・12球団分、別の言い方を用意しないといけないのはしょうがないとしても、もし別の言い方を見つけたら、Voiceflowもスプレッドシートも両方更新しないといけません。さらにこのやり方だとスプレッドシートが冗長な感じになって非常に見にくくなりますよね。今回スプレッドシートでやってますけど、これIf Blockで分岐させるかと思うと・・・😱😱😱

そんなときこそ「シノニム」を使いましょう。シノニムは「同義語」という意味で、カスタムスロットに登録している言い方に「別の言い回し」を登録できるようになっています。ここで説明するよりも見たほうが早いと思いますので、やってみましょう。

Interaction Blockをクリックして、カスタムスロット値の一つをクリックしてみてください。編集できるようになったのがわかりますか?

f:id:kun432:20190821235858p:plain

ここで、現在すでに入力されている値に続けて、カンマ区切りで別の言い方を入力してみてください。

f:id:kun432:20190821235910p:plain

入力し終わったらENTERを押してください。

f:id:kun432:20190821235923p:plain

表示が変わりましたね!これ、どういうことかというと、一番最初の言い方がキーになり、その他の別の言い方はどの言い方をしても、最初の言い方と同じ意味として受け取るようになるのですね。つまり、これがシノニム、ということです。

これによって、言い方の揺れはここですべて吸収されるので、スキルのロジックからすると、1つ目のキーとなるスロット値だけを考えればよいです。非常に楽ちんですね!

では、他の球団名についても、同じように更新していきましょう。こんな感じになると思います。

f:id:kun432:20190822000421p:plain

はい、ではこれでテストしてみます。

f:id:kun432:20190822001041p:plain

いろんな言い方に対応できていますね!うまくいきました!


いかがでしたか?ユーザの発話の揺れに広く対応できて、かつ、効率的にスキル開発もできる、というシノニム、シンプルながら非常に効果が高いので、ぜひご活用ください!

なお、今回、Interaction Blockを使ったのには理由がありまして、Capture Blockでもカスタムスロットは使えるので、もっとシンプルにシノニム使えるんじゃないかと思いきや、残念ながらCapture Blockではシノニムの扱いに不具合があって正しく動作しないようなので、その点についてはご注意ください。