kun432's blog

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

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

#VUIchallenge #011 - Training

f:id:kun432:20210711001052p:plain

#VUIchallengeの第11回です。テーマは「Training」。

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

お題

The challenge

Think about a HIIT training and design the explanation for the full 15 minutes training, and the specific prompt for the first exercise. Your users will start doing jumping jacks for 30 seconds.

Jesús' Tips

Two main things to consider here:

  1. Cognitive load (yep, again): You need to balance here the amount of information you share about the full training and the one about the specific exercise. It can get crazy for your users to understand a single thing!
  2. Training without visuals: Explaining how to do an exercise without any visual support is super tricky. I recommend you to test your prompt with a user to see if they are able to properly do the exercise.

DeepLによる日本語訳

課題

HIITトレーニングを考えて、15分間のトレーニングの説明と、最初のエクササイズの具体的な指示をデザインしてください。ユーザーは30秒間、ジャンピングジャックを始めます。

Jesúsのヒント

ここで考えるべきことは主に2つ。

  1. 認知的な負荷(そう、またです)。トレーニング全体に関する情報と、特定のエクササイズに関する情報の量のバランスをとる必要があります。ユーザーが1つのことを理解するのはとても大変なことです。
  2. ビジュアルのないトレーニング。視覚的なサポートなしにエクササイズのやり方を説明するのは非常に難しいことです。ユーザーが適切にエクササイズを行えるかどうかを確認するために、プロンプトのテストを行うことをお勧めします。

前提

そもそも「HITTトレーニング」というのがよくわかってないのでまずはここからw

  • "High-Intensity Interval Training"の略で、短時間に負荷の高いインターバルトレーニングを行う
  • 20〜30秒トレーニングを行って10〜20秒休む、のサイクルを繰り返す

というものだそうです。で、そのエクササイズの一つとして「ジャンピングジャック」というのがあり、こういうやつのようです。

via GIPHY

これ、ビジュアルなしに伝えるのはかなり難しいですね・・・とりあえずやってみましょう。

デザイン

認知的な負荷

ヒントにあるとおり、

  • トレーニング全体に関する情報
  • 特定のエクササイズに関する情報

を1回で伝えるのは難しいので、それぞれ分けて説明するようにしましょう。

はじめまして、このスキルではあなたのHIITトレーニングをナビゲートします。HITTトレーニングは、30秒間のおすすめエクササイズと20秒間のインターバルを1セットとして、これを15分間繰り返して行うというものです。準備ができたら、今日のおすすめエクササイズについて説明します。よろしいですか?

うん、準備OK!

わかりました。今日のおすすめのエクササイズは「ジャンピングジャック」です。「ジャンピングジャック」の説明を聞きますか?

おねがい

では「ジャンピングジャック」のやり方について説明します。・・・やり方はわかりましたか?

わかったー

いいですね!ではエクササイズを始めましょう!

上記のように都度都度確認を挟むようにすれば、一度の情報量を制限しつつ、かつ、ユーザに理解するための時間を与えることができますね。

ビジュアルのない説明

ここは少しむずかしいですね・・・こういう感じかなぁ。

わかりました。今日のおすすめのエクササイズは「ジャンピングジャック」です。「ジャンピングジャック」の説明を聞きますか?

おねがい

では「ジャンピングジャック」のやり方について説明します。まず、リラックスした状態でまっすぐ立ちます。次に、軽くジャンプしながら手と足を広げます。着地したら、もう一度ジャンプして、今度は手と足を閉じます。これをリズムよく繰り返すのが「ジャンピングジャック」というエクササイズです。やり方はわかりましたか?

うーん、もう一度お願い

わかりました。もう一度「ジャンピングジャック」について説明します。まず、リラックスした状態で・・・

理解したかどうか?を確認して、ユーザが理解できていない場合は再度説明するようにしました。ただこの状態でも認知的過負荷なのかもしれないですね・・・

ここでも一度に与える情報を少なくして、ステップ・バイ・ステップ的な説明に変えてみましょう。

わかりました。今日のおすすめのエクササイズは「ジャンピングジャック」です。「ジャンピングジャック」の説明を聞きますか?

おねがい

では「ジャンピングジャック」のやり方について、ステップごとに説明しますので一緒にやってみましょう。まず、ステップ1では、リラックスした状態でまっすぐ立ちます。できましたか?

はい

いいですね。ステップ2では、次に、軽くジャンプしながら手と足を広げて着地します。大の字になっていればOKです。できましたか?

はい

順調ですね。ステップ3では、もう一度ジャンプして、今度は手と足を閉じます。これで最初の真っすぐ立っている状態になります。できましたか?

はい

これを順番に繰り返すのが「ジャンピングジャック」です。やり方はわかりましたか?

わかったー

いいですね!ではエクササイズを始めましょう!

はい、これなら音声だけでもなんとか伝わるかもしれないですね。

まとめ

音声では、情報量が多いと認知的過負荷になりやすく、ユーザがついてこれない状態になりがちです。うまく小分けにして、都度確認することで、ユーザの負担を減らして、徐々に進めるようにすればよいかなーと思いますが、都度の確認を挟むと会話のターンが増えて、逆に面倒に感じる場合も出てきます。

そういった場合は、例えばユーザのエクササイズ実施履歴を記録しておいて、

  • はじめてのエクササイズの場合は説明する、そうでない場合は省略する
  • 久しぶりのエクササイズの場合は説明する、そうでない場合は省略する

というような工夫も必要になりそうですね。

さぁ、今日もトレーニングを始めましょう。今日のおすすめエクササイズは「ジャンピングジャック」です。「ジャンピングジャック」は前回もやったのでやり方は覚えていますよね?

うん、準備OK!

いいですね!ではエクササイズを始めましょう!

#VUIchallenge #010 - Info details and SSML

f:id:kun432:20210711001052p:plain

#VUIchallengeの第10回です。テーマは「Info details and SSML」。

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

お題

The challenge

Create an interaction where you inform customers about the address and telephone of a restaurant called Lion's House (you can change the name if you want). You can decide to use a single or multi turn experience. Play special attention to SSML tags where needed.

Jesús' Tips

Are you familiar with the term cognitive load? Our brains are incredibly limited and there's always a limited amount of information we can handle. For this challenge, think about what your users want to achieve and share the information so it is easier for them to be successful.

DeepLによる日本語訳

課題

「ライオンの家」というレストランの住所と電話番号をお客様に知らせるインタラクションを作成してください(名前は変えても構いません)。1ターンまたは複数ターンのエクスペリエンスを使用することができます。必要に応じてSSMLタグに特別な注意を払ってください。

Jesúsのヒント

認知的負荷という言葉を知っていますか?私たちの脳は信じられないほど限られていて、扱える情報の量は常に限られています。今回の課題では、ユーザーが何を達成したいのかを考え、情報を共有することで、ユーザーが成功しやすくなります。

デザイン

まずはシンプルにレストランの住所・電話番号を教えてくれるスキルを考えてみましょう。

レストラン検索スキルです。レストラン名を言うと住所と電話番号をお伝えします。レストラン名を言ってください。

ライオンの家

「ライオンの家」ですね。住所は650-0042神戸市中央区◯◯町1-2-3です。電話番号は078-123-4567です。

※住所はと電話番号はデタラメです。

そんなに難しくないですよね。どこに工夫する要素があるのでしょうか?

実際にスキルで発話させてみましょう。Alexa開発者コンソールから、どのスキルでも良いので開いて、テストの「音声と語調」にまるっとコピーして再生してみます。目をつぶって聞いてみてください。

<speak>
「ライオンの家」ですね。住所は650-0042神戸市中央区丸丸町1-2-3です。電話番号は078-123-4567です。
</speak>

どうでしょうか?これでレストランの住所と電話番号わかった気になりますか?

ユーザの本当の目的を考える

レストランの住所と電話番号を教えてくれるというのがスキルのメイン機能ですが、ユーザが実際に求めている目的を考えてみましょう。

  • レストランに行きたい(ので住所を知りたい)
  • レストランを予約したい(ので電話したい)

つまり、最終的にレストランに行きたいので、そのための情報がほしいんですよね。この場合、ユーザは、スキルの応答結果を(何らかの方法で)一時的に記憶しておいて、次のアクションにそれを持っていく必要があります。

住所や電話番号を音声で、しかもこのスピードで聞いてその場でサッと場所がわかったり電話番号を記憶できたりするわけはないですよね。それに住所と電話番号のどちらかだけ知りたければ、両方の情報は過剰です。つまり、認知的負荷が生じます。

これを回避するためにいくつかのアプローチを試してみましょう。

情報を絞る

まず最初に、情報を絞るというアプローチを試してみましょう。住所と電話番号をそれぞれ別に取得できるようにしてみます。

レストラン検索スキルです。レストラン名を言うと住所や電話番号をお伝えします。住所と電話番号のどちらかを知りたい場合は、例えば「ライオンの家の住所を教えて」「ライオンの家の電話番号を教えて」といってみてください。両方を知りたい場合は、単にレストラン名を言ってください。どうしますか?

ライオンの家の住所を教えて

「ライオンの家」ですね。ライオンの家の住所は650-0042神戸市中央区◯◯町1-2-3です。電話番号も知りたいですか?

これで少し認知的負荷が下がりますね。

もっと聞きやすくする

今日のテーマはこちらかなと思います。先ほどのスピードで話されると覚えるのも難しいですし、メモするにも早すぎますね。そこで少しSSMLを使って聞き取りやすくしてみましょう。以下のSSMLを試してみます。

<speak>
  「ライオンの家」ですね。住所は<prosody rate="x-slow">650-0042神戸市中央区丸丸町1-2-3</prosody>です。
  電話番号は<prosody rate="x-slow">078-123-4567</prosody>です。
</speak>

音声のサンプルはこちら

住所と電話番号のところはゆっくりしゃべるようになりましたよね。これならメモできそうです。このようにSSMLを使うと発話の仕方を調整することができます。今回のように発話のスピードを変えるア場合は<prosody>タグを使ってrateを指定します。

あと、ちょっと言葉の間の切れ目がなくて聞きづらいですね。こういう場合はbreakタグを使います。(わかりにくいのでprosodyタグは一旦外しました。)

<speak>
  「ライオンの家」ですね。住所は<break time="300ms" />650-0042<break time="300ms" />神戸市中央区<break time="300ms" />丸丸町1-2-3<break time="300ms" />です。
  電話番号は<break time="300ms" />078-123-4567<break time="300ms" />です。
</speak>

随分と聞き取りやすくなった気がしませんか?breakタグを使うと、発話の間に休止を入れてくれてくれます。今回は0.3秒の休止を入れてみました。

ちなみに、休止の場合、実はSSMLをつかわなくても、句読点をきちんと入れてあげればちゃんと休止を入れてくれます。

<speak>
  「ライオンの家」ですね。住所は、650-0042、神戸市中央区、丸丸町1-2-3、です。
  電話番号は、078-123-4567、です。
</speak>

ちなみに、郵便番号は間に"-"が入っていると「XXXのXXXX」というふうに言い換えてくれました。これはAlexaが発話内容を認識して自動的に最適な読み方で読み上げているからです。ただし、これがうまく行かない場合もあります。この例だと電話番号のところはうまく読み上げてくれていません。こういう場合は、発話の仕方を明示的に指定することができます。

<speak>
  「ライオンの家」ですね。住所は<say-as interpret-as="address">650-0042神戸市中央区丸丸町1-2-3</say-as>です。
  電話番号は<say-as interpret-as="telephone">078-123-4567</say-as>です。
</speak>

電話の"-"に少し休止が入ったのがわかるでしょうか?これで聞き取りやすくなりますね。なお、住所のところは何も変わっていませんが、これはもともと住所と認識して発話してくれているからです。

これらをまとめると少し調整をしてみました。

<speak>
  「ライオンの家」ですね。住所は、<prosody rate="slow"><say-as interpret-as="address">650-0042</say-as><break time="200ms" /><say-as interpret-as="address">神戸市中央区</say-as><break time="200ms" /><say-as interpret-as="address">丸丸町1-2-3</say-as></prosody>、です。
  電話番号は、<prosody rate="x-slow"><say-as interpret-as="telephone">078-123-4567</say-as></prosody>、です。
</speak>

最初に比べるとだいぶ聞き取りやすくなりましたよね!

別のアプローチ

ややテーマからそれるかもしれませんが、そもそもこれって覚えておかないといけないのでしょうか?いくつかのアプローチが考えられます。

一つの方法は画面付きデバイスに出してしまうというものですね。

レストラン検索スキルです。レストラン名を言うと住所と電話番号をお伝えします。レストラン名を言ってください。

ライオンの家

「ライオンの家」ですね。ライオンの家の住所と電話番号はこちらです。 f:id:kun432:20210723004937p:plain

これなら情報量が多くても大丈夫ですね。画面が表示されている間に電話したりすればいいでしょう。ただデバイスのそばじゃないと使えません。

さらに別のアプローチとしては、例えばユーザにこの情報をメールで送ってしまうというのも一つの手です。

ライオンの家の住所を教えて

「ライオンの家」ですね。登録されているメールアドレスに送信しましたので、ご確認ください。

こちらの場合、スマホのメールなどに送っておけば、レストランに向かう途中などでも見ることができますね。ただし、メールアドレスを事前に取得しておく必要があります。

これをどんどん突き詰めていくと、レストランの予約ぐらいならスキルでやっちゃってもいいということになったりしてwwww

まとめ

SSMLを使って発話内容を調整することで、伝えたい情報に合わせた聞き取りやすさをコントロールできます。音声インタフェースとしてはこれはとても重要なことです。ただし、情報を伝えることがゴールなのではなく、ユーザの真の目的やユースケースを踏まえた上で、最適なものを提供することが重要ですね。

#VUIchallenge #009 - Multi-turn experiences

f:id:kun432:20210711001052p:plain

#VUIchallengeの第9回です。テーマは「Multi-turn experiences」。

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

お題

The challenge

Create a multi-turn experience for a voice service that gives information about trips. For getting the right information you need to know origin, destination, date and time.

Jesús' Tips

With this exercise I want you to practice several things:

  1. Wording: Depending on the verbiage you use you will get different answers from your users. Make it easy for them to say what you need.
  2. Multi-turn and slot filling: Users hate when it takes too long to get what they want and the might want to skip steps. Can you help them do that with your prompts?
  3. Trips: It's a popular use case and you better have experience on it.

DeepLによる日本語訳

課題

旅行に関する情報を提供する音声サービスのために、マルチターンエクスペリエンスを作成すること。正しい情報を得るためには、出発地、目的地、日付、時間を知る必要があります。

Jesúsのヒント

このエクササイズでは、いくつかのことを練習してほしいと思います。

  1. 言葉遣い。使用する言葉によって、ユーザーから得られる答えは異なります。ユーザーが必要なことを簡単に言えるようにしておきましょう。
  2. マルチターンとスロット収集。ユーザーは、欲しいものを手に入れるのに時間がかかりすぎることを嫌い、ステップをスキップしたいと思うかもしれません。あなたのプロンプトを使って、ユーザーがスキップできるようにしてみませんか?
  3. 旅行。よく使われるユースケースなので、経験があるに越したことはありません。

デザイン

ユーザのゴールを達成するために、複数の情報が必要な場合、会話はマルチターンになることが多いです。お題にあるような、航空券の予約を行うようなやり取りを考えてみましょう。航空券の予約に情報は以下の4つです。

  • 出発地
  • 目的地
  • 日付
  • 時間

エアーチケットにようこそ。このスキルでは航空券の予約が行なえます。どうしますか?

沖縄に行きたい

目的地は沖縄ですね。出発地はどこですか?

神戸

出発地は神戸ですね。いつご出発されますか?

明後日

7/22のご出発ですね。ご出発時刻は何時ですか?

10時

わかりました。7/22 10時神戸から沖縄までの航空券を予約します。よろしいですか?

はい。

7/22 10時神戸から沖縄までの航空券を予約いたしました。よい旅を!

必要な情報が複数ある場合は、このように複数回のやりとりで順に情報を集めていけばよいわけですね。

言葉遣い

「言葉遣い」というとちょっと違和感がありますね。これは、ユーザがどういう言い方でどの情報を与えるかはわからない、ということに対してどうアクションするか?ということだと思います。

旅行券を予約するには複数の情報が必要ですが、ユーザはどんな情報が必要なのかをわかっていないという前提に立つと、いろんな言い方が考えられます。例えば、

7/22沖縄に行きたい

神戸から沖縄に行きたい

旅行に行きたい

こういう感じですね。必要な情報がいくつか指定されていたり、全く指定されていなかったり、組み合わせもバラバラです。このような場合は、必要な情報の収集状況を把握して、足りない情報をユーザに発話するように促す必要があります。例えば、2番目のケースだと、目的地と出発地はすでにわかっているので、あとは日付と時間がわかればよいわけです。

神戸から沖縄に行きたい

ご出発地は神戸、目的地は沖縄ですね。いつご出発されますか?

明後日

7/22のご出発ですね。ご出発時刻は何時ですか?

10時

わかりました。7/22 10時、神戸から沖縄までの航空券を予約します。よろしいですか?

はい。

7/22 10時神戸から沖縄までの航空券を予約いたしました。よい旅を!

同じようにして、1番目の場合は日付と目的地がわかっているので出発地と時間を、3番目の場合はすべての情報が足りないのでそれぞれ順に確認していくようにすればよいですね。

マルチターンの難しいところ

ユーザが使い方をわかってないうちは、マルチターンで必要な情報を一つづつ順に集めていけば、迷いもないので良いでしょう。ただ実際に体験してみるとわかるのですが、マルチターンのやり取りは時間もかかるしだんだん面倒になってきます。ある程度使い方になれたユーザであれば、発話の仕方もわかっているので早くゴールに向かいたくなります。そういった場合は1回でやり取りが済むようにもしておく必要があります。

7/2210時に、神戸から沖縄への飛行機を予約して/span>

わかりました。7/22 10時、神戸から沖縄までの航空券を予約します。よろしいですか?

はい。

また、なるべくユーザが発話しないといけないことを減らすことも重要です。今回の例だと、多くの場合、出発地はおなじになることが多いと思います。であれば、過去のやりとりからそれを蓄積しておく、ユーザ情報からそれを取得する、ということを行えば、これをスキップすることができます。

7/2210時に、沖縄への飛行機を予約して

(ユーザ情報を見ると神戸にお住まいなので、出発地は神戸として考えればよいですね。)

わかりました。7/22 10時、神戸から沖縄までの航空券を予約します。よろしいですか?

はい。

マルチターンの実装

こういったマルチターンの実装、ターンの最中はコンテキストを維持しないといけないので普通にやるととても面倒なのですが、Alexaであれば、

  • ダイアログモデル
  • Alexa Conversations(現時点では日本語未対応)

を使うことで、容易に実装できます。

Voiceflowでもダイアログモデルには対応しており、とてもかんたんに実装ができます。これについては以下の記事でまとめてます。今回の例とほぼ同じようなサンプルでご紹介していますので、よろしければご覧ください。

マルチターンが必要になるユースケース

旅行の予約は、マルチターンが必要になるユースケースとしてはとても一般的です。それ以外にも以下のようなケースでもマルチターンが必要になると思います。

  • 食べ物の注文
    • マクドナルド
      • セットで、サイドにポテトを選ぶかナゲットを選ぶか、飲み物は何にするか。
    • サブウェイ
      • パンの種類や野菜、ドレッシングの選択など
  • 銀行の振り込み
    • 入金先、金額、入金日など

こうやって見ると、マルチターン≒トランザクションという感もありますね。

まとめ

人間の会話ではシンプルな一問一答で完結するようなやり取りはまれです。常にコンテキストがあって、その中でそのコンテキスト特有のいろいろな情報が流れていきます。複数の情報をもとに何かしらのゴールを達成するようなコンテキストの場合、情報の取得状況に応じてユーザに発話を導くようなマルチターンでのやりとりが多くなる反面、マルチターンによる煩雑さも考慮する必要があります。

ダイアログモデルやAlexa Conversationsなど、マルチターンに柔軟に対応できるようなしくみが整備されているので、積極的に活用していくのがよいでしょう。