kun432's blog

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

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

Voiceflow TIPS #11 文脈に応じたヘルプインテント

Voiceflow夏休みAdvent Calendarの11日目です。

前回に引き続き、Voiceflowのヘルプについて、少し面白い使い方をやってみたいと思います。


前回のVoiceflowのヘルプインテント説明したとおり、Voiceflowのヘルプは、Flowを使っているので、「ヘルプ」を言ったタイミング(ただしくはその少し前)に戻ってきます。

f:id:kun432:20190811164058p:plain

文脈の流れを途切れさせることなく、ヘルプが動くということですね。であれば、文脈に応じてヘルプのメッセージを変えるとより人間らしくなりますよね?こんな感じのイメージです。

f:id:kun432:20190811164519p:plain

今日はこれをやってみたいと思います。


スキルの全体図

全体図はこんな感じです。前回のフローをベースに、赤枠のところを追加してます。

f:id:kun432:20190811172207p:plain

ヘルプはこんな感じ。コンバインブロックになっていたのを分解して、If Blockで分岐させてます。

f:id:kun432:20190811172148p:plain

では順に見ていきます。

メインのフロー

今回追加したところだけ説明します。それ以外のところは前回のエントリを参考にしてください。(画面キャプチャを追加しておきました!)

基本的な考え方としては、今どの文脈にいるか?を管理するために、ROOTフロー側で変数を用意して、ヘルプに行く前に文脈を表す変数をセット、ヘルプの中ではその変数を参照して分岐する、という形です。そこで再度、Voiceflowのヘルプインテント で説明したことを思い出してください。

抜粋します。

  • Flow Blockの中でしか使えないフロー変数を定義できる。他のFlow Block(ROOTフローも含めて)からも見えない。
  • ROOTフローで作成したプロジェクト変数は、グローバル変数となり、どこからでも読み書きできる。
  • ROOTフローで作成したプロジェクト変数は、永続扱いとなり、セッションを跨いでも維持される。
  • ROOTフローとFlow Blockでフロー変数の受け渡しができる

ヘルプはFlowになっています。なので、ROOTフロー内の変数の受け渡しは、グローバルであるプロジェクト変数にするか、Flowに変数を渡す必要があります。が、デフォルトで用意されているヘルプフローは変数の受け渡しができません。となると、プロジェクト変数で管理するしかありません。

また、プロジェクト変数の場合、永続扱いになります。つまりセッションをまたいでも保持されてしまいます。今回のケースでは、1セッションの中だけで管理すれば良いものなので、セッションをまたいで保持されると想定外のケースが起きる可能性もあります。その場合にはスキル起動時に初期化する必要があります。

前振りが長くなってしまいましたが、上記の点を抑えて、フローを変更していきましょう。

1. 文脈を管理するプロジェクト変数の作成

プロジェクト変数を作成します。ここでは"context"という名前にしました。ユーザの好きな色と数字を保持しておくためのフロー変数"favColor"、”favNumber”と別にプロジェクト変数として作成されているのがわかりますね。

f:id:kun432:20190811180045p:plain

2. プロジェクト変数の初期化

Homeと最初のSpeakの間に一つSet Blockを追加します。ここで”Context”を一旦初期化します。セットする値はなんでもいいんですけど、とりあえず”NONE”という値を入れておくようにしました。

f:id:kun432:20190811180541p:plain

3. 「色」の話の文脈をセット

最初のSpeakとCaptureが、ユーザの好きな「色」の話の「文脈」になりますので、この間に一つSet Blockを追加して”Context”にそれをセットします。ここでは”ASK_COLOR”という値を入れておくようにしました。

f:id:kun432:20190811181339p:plain

4. 「数字」の話の文脈をセット

上と同様にして、2番めのSpeakとCaptureが、ユーザの好きな「数字」の話の「文脈」になるので、ここにも一つSet Blockを追加して”Context”に”ASK_NUMBER”という値を入れるようにします。

f:id:kun432:20190811181137p:plain

メインのフローはこれで終わりです。ヘルプに行きましょう。

ヘルプ

最初にお伝えしたとおり、ここは一旦コンバインブロックになっているのを分解してから直していきます。

1. どの文脈から来たかをチェックして分岐

If Blockで”Context”の中身をチェックして、分岐させます。"Context"はプロジェクト変数なのでフローの中かららでも参照できます。"ASK_COLOR"なら色の文脈ということで1へ、"ASK_COLOR"なら数字の文脈ということで2へ、それ以外はElseというふうに分岐します。

f:id:kun432:20190811182035p:plain

2. 分岐に応じたメッセージの設定

あとは、分岐に応じてメッセージを変えるだけです。

f:id:kun432:20190811182620j:plain

f:id:kun432:20190811182633j:plain

f:id:kun432:20190811182643j:plain

テスト

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

f:id:kun432:20190811183030p:plain

こんな感じで文脈に応じて、ヘルプの内容が変わっているがわかりますでしょうか?ユーザがどうすればいいかわからないタイミングに応じて、適切なヘルプを返せるようにすると面白いですね。

おまけ

ただ、ちょっといちいち「続けますか?」って確認するのウザいですね。ヘルプフローのChoiceとExitは取ってしまいましょう。併せて3つのSpeak Blockから「続けますか?」という部分もカットして、代わりに少し無音を入れてみます。

f:id:kun432:20190811190042p:plain

で再度テスト。

f:id:kun432:20190811190403p:plain

自然な感じになりましたね。

Exitしなければ元の場所に戻るというFlowの特徴を逆手に取るとこういうこともできます。ただし、ブロックの並べ方によっては戻る場所が適切でない・自然な会話にならない可能性もあると思うので、そのあたりは事前に検証してみることをおすすめします。

おまけ その2

メインのフロー、ブロックが増えちゃって見づらくなりましたね。一方通行のフローなので、こういう場合はコンバインブロックを使ってまとめましょう。ブロックの上にブロックをドラッグアンドドロップすればOKです。

f:id:kun432:20190811191128p:plain

コンバインブロックを右クリックすると名前の変更ができます。

非常にスッキリしますね!

まとめ

ということで、地味だけど奥が深いヘルプの話を2回に分けて説明しました。参考になれば幸いです。