kun432's blog

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

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

#VUIchallenge #015 - Say my age

f:id:kun432:20210711001052p:plain

#VUIchallengeの第15回です。テーマは「Say my age」。

過去の#VUIchallengeの記事はこちら

お題

The challenge

Design a say my age voice interaction. The service will ask users the birth date and it will give the age back. Take into account every probable error and deviation from the happy path.

Jesús' Tips

You need to get the information for 3 slots: day, month, and year. Your wording will help your users stay on track and share what you need, but you will need to be prepared for all the possible combinations.

DeepLによる日本語訳

課題

年齢を答える音声インタラクションをデザインしてください。このサービスは、ユーザーに生年月日を尋ねると、年齢を返してくれます。起こりうるエラーやハッピーパスからの逸脱をすべて考慮しましょう。

Jesúsのヒント

日、月、年の3つのスロットの情報を得る必要があります。あなたの文言は、ユーザーが軌道に乗り、必要なものを共有するのに役立ちますが、ありとあらゆる組み合わせに備えておく必要があります。

デザイン

今回は日付の表現ですね。ふと考えてみると、英語の場合に比べると、日本語はそれほど表現の幅がない気がしますので、多少楽な気がしました。とりあえずやってみましょう。

誕生日をいうとあなたの年齢を答えます。誕生日を言ってください。

1989年5月6日

1989年5月6日生まれだと、32歳ですね

はい、とてもシンプルですね。

ちなみに日付については、AlexaだとAMAZON.Date、Googleだとactions.type.Dateという予め用意されたスロットタイプがあり、ユーザの発話からよしなにスロットを抽出してくれます。 上記の場合、Alexaだと1995-08-01としてスロットに値が入ります。(Googleはちょっと試したことがないのでわかりません。)

では、特にイレギュラーは考えなくていいでしょうか?いくつかのパターンを見ていきましょう。

イレギュラーなパターン

うるう年

便利なAMAZON.Dateですが、残念ながら「うるう年」をよしなに考慮はしてくれません。2001年2月29日は存在しないのですが、

2001年2月29日

2001年2月29日生まれだと、・・・

このように普通に受け取ってしまいます。。。年齢計算のためにこの日付をそのままプログラミング処理に渡すと、多分2001年3月1日と認識するか、エラーになるのではないかなと思います。厳密さが必要になるケースだとちょっとまずいですね。

なので、2月29日の場合に限り、うるう年かどうかのチェックを行ってその結果を伝える必要があります。

2001年2月29日

あれれ、2022年はうるう年じゃないので2月29日は存在しませんよ。もう一度誕生日を言ってください。

年がない場合

仮に今日が2021年8月4日だったとしましょう。以下のようにユーザが年を言わなかった場合どうなるでしょうか?8月4日の前後と8月4日当日の3パターンでみてみましょう。

パターン①

8月3日

2022年8月3日生まれだと・・・

パターン②

8月4日

2021年8月4日生まれだと・・・

パターン③

8月5日

2021年8月5日生まれだと・・・

AMAZON.Dateを使う場合、月と日だけで、年を言わなければ、当日または未来の最も近い日付と認識します。そう、つまりこのパターンだと、まだ生まれていない、もしくは0歳、という可能性が出てしまうのですね。また、厳密に言うと0歳の場合はありえなくはない(親御さんが代わりに聞いている、とか?)ので、少なくともまだ生まれていない、というのだけはチェックで弾いてあげる必要があります。上の例だとパターン①です。

8月3日

あれれ、2022年8月3日生まれだとまだ生まれていませんよね?もう一度誕生日を言ってください

うーん、この場合はちょっとイマイチですね。

これを回避するには、ヒントにあるように年・月・日を別々に分けて取得して個別にチェックする方法があります。次以降で見てみましょう。

年・月・日を別々に取得して、個別にチェックする場合の注意

年・月・日を別々に取得する場合、Alexaだとダイアログモデルを使って、足りないスロットをマルチターンで収集すればよいです。

誕生日をいうとあなたの年齢を答えます。生まれた年を言ってください。

1989年

1989年ですね。何月生まれですか?

5月

5月ですね。何日生まれですか?

6日

1989年5月6日生まれだと、32歳ですね

ダイアログモデルを使うと、必要なスロットの収集状況に応じて、足りないものだけを取得するようにしてくれます。先程の「年」がない場合だと、こうなります。

誕生日をいうとあなたの年齢を答えます。誕生日を言ってください。

8月5日

何年の8月5日ですか?

またスロット値の検証もできますので、先程のように年が未来になっていればエラーにするというようなこともできます。

また、月・年・日を分ける場合、それぞれに適したスロットタイプはありませんので、単純な数値として認識するAMAZON.Numberを使うことになりますが、月は1〜12まで、日は1から概ね31といったチェックも必要になります。これについてもスロット値の検証でチェックできるのではないかと思います。うるう年だけは自分でやるしかないかなと思いますが。

詳しくは公式ドキュメントをご覧ください。

developer.amazon.com

まとめ

今回はめんどくさい日付の取り扱いについてでした。英語に比べると日本語はだいぶ表現が少ないんじゃないかなと思います。それでもエラーハンドリングは必要ですし、年齢計算のロジックは自分で書かなければいけません(日付処理を行うライブラリ等を使えばいろいろ効率良くできると思いますが、それでもやっぱり面倒ですね)。プラットフォーム側の機能としてこのあたりをよしなにやってくれるものをうまくつかって楽をするのが良いかなと思います。

うん、VUIというよりは実装の話になってしまいましたw