kun432's blog

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

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

Voiceflow TIPS #13 セッションを使ってユーザの利用回数・頻度に応じた回答を返す

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

Googleスプレッドシート連携シリーズは明日に回すとして、今回はセッションを使った利用回数・頻度の話です。イメージで言うとこんな感じです。

初めての利用

アレクサ、「○○○スキル」をひらいて

はじめまして、○○○スキルです。このスキルを選んでいただきありがとうございます。・・・

2回め以降の利用

アレクサ、「○○○スキル」をひらいて

こんにちは、○○○スキルです。また呼んでくれてありがとう。最近の調子はどうかな?・・・

久しぶりの利用

アレクサ、「○○○スキル」をひらいて

お久しぶりです、○○○スキルです。ずっと呼んでくれなかったので、寂しかったです。・・・


どうですか?なんとなく親しみが持てませんか?流石に人間と同じ、というわけには行きませんが、こういった配慮や挨拶の仕方などにランダム性があると、ちょっと人間っぽさが出るし嬉しいですよね。今回はそういうのを説明します。


以前のTIPS #2, #3 でご紹介したとおり、Voiceflowには2つの変数があります。

  • プロジェクト変数
    • スコープはグローバル
    • 永続
  • フロー変数
    • スコープは対象のフロー内
    • 非永続

上記のような一定期間内の回数や頻度に応じて応答を変えるには、永続的なプロジェクト変数が必要になります。

Voiceflowではデフォルトで以下のプロジェクト変数が用意されています。

変数名 内容
sessions セッション回数。初回利用時は必ず1、スキル「起動」するたびに自動でインクリメントされる。 1
user_id AlexaのユーザID amzn1.ask.account.XXX・・・
timestamp スキル「実行」時の時刻、UNIX TIME表記 1565624078
platform スキル動作環境のプラットフォーム。現状alexaかgoogleらしい alexa
locale ロケール ja-JP
access_token アカウントリンキングで使用

これらはすべて永続になっているので、user_idをキーに、sessionsとtimestampをうまく使えばできそうですね。ちょっとやってみましょう。

スキルの全体図

結構ベタに作りました。メッセージなどは、うまく変数やGoogleスプレッドシートに外出しして分岐で処理すればもっときれいに作れると思います。まあ、あくまでも考え方のお話なので、ヨシとします。

f:id:kun432:20190813020944p:plain

ポイントだけ説明します。

起動回数に応じた分岐

sessionsにはデフォルトで起動回数が保存されます。なので、ここでIf Blockを使って分岐させます。この例では、1回目、10回目まで、それ以降、という3パターンに分岐させてますが、初回起動時か2回目以降か、みたいなよくあるチェックはこういう感じになります。

f:id:kun432:20190814012852p:plain

1回目

f:id:kun432:20190814013224p:plain

10回目まで

f:id:kun432:20190814013235p:plain

それ以降

f:id:kun432:20190814013249p:plain

前回起動時間からの差異

timestampには実行時の時間がUNIXTIME(1970/1/1からの秒数)で入っています。なので、前回実行時のtimestampをプロジェクト変数に保存しておいて、次の実行時のtimestampと比較すれば、何秒経過しているか?がわかるということですね。

まず、変数を用意します。

f:id:kun432:20190814014234p:plain

lastTimestampというのが前回実行時の時間を保存しておくための変数です。ここはセッションをまたぐのでプロジェクト変数にしておく必要があります。

curTimestampというのが起動時の時刻を保存しておくためのフロー変数です。別にtimestampをそのまま使えばいいのですが、timestampは呼び出したタイミングで時間が変わっていくので、ここでは「起動直後」の時間を保持しておくためにあえて用意してます。

あとは、この時間差異を入れるためのtimediffというフロー変数です。

フローに沿って見てみます。

まず起動直後に、timestampを取得して、curTimestampに保存しておきます。

f:id:kun432:20190814014656p:plain

そして最後にcurTimestampをlastTimestampに保存します。これで次回の起動時に前回起動した時間が取れるようになります。

f:id:kun432:20190814014931p:plain

スキルの中ではこんな感じです。

f:id:kun432:20190814015337p:plain

まず上で説明したとおり、起動回数で3分岐してますが、1回目はもちろん前回の実行時間を持っていないので、何もする必要はありません。2回目以降だけが対象になります。

次にCode Blockの中で前回実行時と今回起動時の差異を求めてます。Code Blockは2つありますが、どちらも同じです。ちょっと見にくいので、コード貼っときます。

timediff = Math.floor((curTimestamp - lastTimestamp) / 86400);

現在の時間(秒)から前回の時間(秒)を引いて、それを1日(86400秒)で割り、Math.floorで小数点以下は切り捨てます。これで「何日」経ったか?を算出します。

そして、If blockでそれをチェックして、ここでは「11日以降」だったら、という分岐にしてます。

f:id:kun432:20190814015903p:plain

で、その結果に応じて、メッセージを変えます。

f:id:kun432:20190814020254p:plain

f:id:kun432:20190814020307p:plain

f:id:kun432:20190814020319p:plain

f:id:kun432:20190814020348p:plain

はい、これで完了です。

テスト

実際に数日かけて試すわけにも行かないのでCode Blockを少し変えて秒で判定してます。なので前回実行時から10秒立ってないとスネるという、どんなデレやねんという感じになってますw

初回

初回はこんな感じで。結構よそよそしいですよね。

f:id:kun432:20190813021641p:plain

2回目以降

2回目以降は、少し丁寧に。でもまだまだよそよそしいです。しばらくスキルを使っていない場合は、下のメッセージになります。なんかこう真面目なキャラクターですね。(誤字は無視してください・・・)

f:id:kun432:20190813021657p:plain

10回目以降

10回目以降は、一気にフランクになります。しばらくスキルを使っていないと、こんな感じでちょっとスネたりします。

f:id:kun432:20190813021711p:plain

どうでしょうか?少し人間らしさが出るようにおもいませんか?


ユーザ側としても覚えてもらえるのは嬉しいし、回数に応じて親密な感じが出てくると、機械感がなくなってほんのちょっぴり人間ぽさが出ますよね。逆に、少しキャラクター性みたいなものも出てくるので、どういう性格で、どういう立ち位置なのか?みたいなのは、スキルの用途や想定している利用者にあわせて、きちんと事前に考える必要が出てくるかもしれません。

キャラクター性まで行くとちょっとやりすぎかもしれませんが、永続セッションを使った利用回数・頻度での分岐は、VUIのユーザビリティ向上に欠かせない要素なので、ぜひ活用してみてください。