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スプレッドシートに外出しして分岐で処理すればもっときれいに作れると思います。まあ、あくまでも考え方のお話なので、ヨシとします。
ポイントだけ説明します。
起動回数に応じた分岐
sessionsにはデフォルトで起動回数が保存されます。なので、ここでIf Blockを使って分岐させます。この例では、1回目、10回目まで、それ以降、という3パターンに分岐させてますが、初回起動時か2回目以降か、みたいなよくあるチェックはこういう感じになります。
1回目
10回目まで
それ以降
前回起動時間からの差異
timestampには実行時の時間がUNIXTIME(1970/1/1からの秒数)で入っています。なので、前回実行時のtimestampをプロジェクト変数に保存しておいて、次の実行時のtimestampと比較すれば、何秒経過しているか?がわかるということですね。
まず、変数を用意します。
lastTimestampというのが前回実行時の時間を保存しておくための変数です。ここはセッションをまたぐのでプロジェクト変数にしておく必要があります。
curTimestampというのが起動時の時刻を保存しておくためのフロー変数です。別にtimestampをそのまま使えばいいのですが、timestampは呼び出したタイミングで時間が変わっていくので、ここでは「起動直後」の時間を保持しておくためにあえて用意してます。
あとは、この時間差異を入れるためのtimediffというフロー変数です。
フローに沿って見てみます。
まず起動直後に、timestampを取得して、curTimestampに保存しておきます。
そして最後にcurTimestampをlastTimestampに保存します。これで次回の起動時に前回起動した時間が取れるようになります。
スキルの中ではこんな感じです。
まず上で説明したとおり、起動回数で3分岐してますが、1回目はもちろん前回の実行時間を持っていないので、何もする必要はありません。2回目以降だけが対象になります。
次にCode Blockの中で前回実行時と今回起動時の差異を求めてます。Code Blockは2つありますが、どちらも同じです。ちょっと見にくいので、コード貼っときます。
timediff = Math.floor((curTimestamp - lastTimestamp) / 86400);
現在の時間(秒)から前回の時間(秒)を引いて、それを1日(86400秒)で割り、Math.floorで小数点以下は切り捨てます。これで「何日」経ったか?を算出します。
そして、If blockでそれをチェックして、ここでは「11日以降」だったら、という分岐にしてます。
で、その結果に応じて、メッセージを変えます。
はい、これで完了です。
テスト
実際に数日かけて試すわけにも行かないのでCode Blockを少し変えて秒で判定してます。なので前回実行時から10秒立ってないとスネるという、どんなデレやねんという感じになってますw
初回
初回はこんな感じで。結構よそよそしいですよね。
2回目以降
2回目以降は、少し丁寧に。でもまだまだよそよそしいです。しばらくスキルを使っていない場合は、下のメッセージになります。なんかこう真面目なキャラクターですね。(誤字は無視してください・・・)
10回目以降
10回目以降は、一気にフランクになります。しばらくスキルを使っていないと、こんな感じでちょっとスネたりします。
どうでしょうか?少し人間らしさが出るようにおもいませんか?
ユーザ側としても覚えてもらえるのは嬉しいし、回数に応じて親密な感じが出てくると、機械感がなくなってほんのちょっぴり人間ぽさが出ますよね。逆に、少しキャラクター性みたいなものも出てくるので、どういう性格で、どういう立ち位置なのか?みたいなのは、スキルの用途や想定している利用者にあわせて、きちんと事前に考える必要が出てくるかもしれません。
キャラクター性まで行くとちょっとやりすぎかもしれませんが、永続セッションを使った利用回数・頻度での分岐は、VUIのユーザビリティ向上に欠かせない要素なので、ぜひ活用してみてください。