優れたVUIを持つGoogleアシスタント(スマートスピーカー)アプリの作り方

Googleのセミナーに参加した時に「人間は声を聞くと相手を想像する」と講師の方が仰っておりました。そして「自分が行いたいアクションに対して理想の相手を望む」とも。例えば口座振替が出来るGoogleアシスタントのアプリが出てきたとして、返事が「ちっす!100万振り込んでおくっす!たぶん大丈夫っす!」だったら誰も使わないでしょう。たとえそれが真に堅牢なプログラムだったとしても。

僕達人間は本能的にスマートスピーカを擬人化するが故にスマートスピーカにイラつくのです。是非、人をイラつかせないアプリ作って行きましょう。

ここではアプリの名前を仮に「天気くん」とし、「ユーザが喋った地域の天気を教えてくれるアプリ」を、一緒に作っていきましょう。


目次


  1. 挨拶

  2. 2回目の挨拶

  3. 天気を調べる

  4. キャッチボールを続ける

  5. 会話のエラー

  6. 本当のエラー

  7. 終了の言葉

  8. 天気くんを呼ぶ

  9. 完成


挨拶

挨拶は基本です。人生の8割は、きちんとした挨拶を毎日できるかどうかにかかっているとも言えます。

(ユーザ)「OK Google 天気くんにつないで」

(天気くん)「こんにちわ。天気くんです」

 とても元気に挨拶が出来ました。しかしこれでは天気くんが何が出来るのか分かりません。

(天気くん)「こんにちわ。天気くんです。全国の天気をお調べ致します。

       お調べしたい地名を仰って下さい。」

これで天気くんが何が出来るかも伝える事ができました。素晴らしいですね。しかし天気くんという名前なのに「お調べ致します」では固い気がします。天気くんにはもっと元気のいい性格になってもらいましょう。

(天気くん)「こんにちわ。天気くんだよ!全国の天気を調べる事が出来るんだよ!

       調べたい場所の名前を教えてね!」

元気いっぱいの天気くんになりました。このように声を発するアプリの特性としてアプリ側のペルソナを作る必要があります。google homeに初音ミクを組み込んでしまえば日本ではもっと流行るかもしれませんね。


2回目の挨拶

しかし毎回この挨拶ではいけません。リピートしてくれた人は天気くんが何を出来るのかもう知っているのです。わざわざ言ってはいけません。イラつきます。「俺のこともう忘れたのかよ」とユーザは悲しみイラつくのです。

ではどうすればいいのか。簡単です。getLastSeenという関数がありますのでそれを使用します。

const app = new DialogflowApp({request, response});

const lastSeen = app.getLastSeen();

lastSeenがnullなら初回起動、それ以外の場合は最終アクセス日のDateが帰ってきます。

え?webhook派?安心して下さい。requestにも格納されております。

request.body.originalDetectIntentRequest.payload.user.lastSeen

こちらも同様にnullかDataが格納されています。これで天気くんはユーザがリピートしてくれた事を分かるようになりました。

(2回目の天気くん)「久しぶり。天気くんだよ!調べたい場所の名前を言ってね!」

いいですね。ユーザは「自分の事を覚えていてくれた」と感極まるでしょう。


天気を調べる

ではユーザが天気を調べられるようにしましょう。

(ユーザ)「府中市の天気を教えて」

(天気くん)「府中市の天気は晴れ!最高気温は20度、最低気温は5度だよ」

Good!!ユーザは無事に府中市の天気を知る事が出来ました。しかしこれではダメな人たちがいます。東京都府中市の人と広島県府中市の人です。市同士の喧嘩に発展しかねません。ではどうするのがよいか。結果が2つ以上ある場合はどちらを聞きたいかをユーザに訪ねましょう。

(ユーザ)「府中市の天気を教えて」

(天気くん)「府中市は全国にふたつあるよ!東京都と広島県どっちの府中市かなぁ?」
(ユーザ)「東京都」
(天気くん)「東京都府中市の天気は晴れ!最高気温は20度、最低気温は5度だよ」

しかしこれにはユーザが発した内容を記憶しておく必要があります。

いわゆる文脈というものです。

(A)新宿駅はどこですか?

(B)あちらです
(A)上野駅は?
(B)そちらです

2回目の上野駅の質問には「どこですか?」はありません。文脈で分かるからです。天気くんの場合も同じです。1回目に府中市、2回目に東京都と言ったユーザに東京都府中市の情報を返す必要があります。

これはContextsと言う機能で実装ができます。一例としてwebhookでの実装ですとこうなります。

"outputContexts": [

{
"name": "projects/<project-id>/agent/sessions/<conversation-id>/contexts/weather",
"lifespanCount": 1,
"parameters": {
"東京都": value,
"広島県": value
}
}
]

これでweatherというContextsを作る事ができました。ユーザが「府中市の天気を教えて」と言った際に上記のようなContextsを作って返しておきます。その後、ユーザが東京都と言えば「東京都」と言えば"東京都"の「広島県」と言えば"広島県"のデータを返せばいいのです。


キャッチボールを続ける

天気を伝える事ができましたが、それで終わってはいけません。次のアクションをユーザに促しましょう。ぶっきらぼうになってはいけません。

(天気くん)「東京都府中市の天気は晴れ!最高気温は20度、最低気温は5度だよ!

       ほかにも知りたい場所はある?」

これでいいでしょう。ユーザは次に天気くんに何を言えばいいか分かるようになりました。


会話のエラー

会話にはエラーは存在しません。方向修正があるだけです。

(ユーザ)「オスマン帝国の天気を教えて」

(天気くん)「エラーが発生しました。終了します。」

これではダメです。1回目は聞き返し、2回目に方向修正をしてあげるのがよいでしょう。

(ユーザ)「オスマン帝国の天気を教えて」

(天気くん)「ごめんね、よく聞こえなかったよ、もう一回言ってもらっていいかな?」
(ユーザ)「オスマン帝国」
(天気くん)「東京とか大阪とか都道府県名で言ってみて!」

都道府県名を言ってもらえるように方向修正をしました。3回目はアプリを終了させてもいいかもしれません。

(ユーザ)「オスマン帝国」

(天気くん)「ごめんね、その地名は見つからなかったよ。まだ調べる?」
(ユーザ)「いいえ」
(天気くんが退室しました)

会話の方向修正は非常に難しく、一番気をつかう部分でもあります。ユーザが真に求めている事にたどり着けるように優しくリードしてあげる事を念頭に置き会話をさせましょう。


本当のエラー

会話にはエラーは存在しないと書いたばかりですが、本当のエラーというものがGoogleアシスタントには存在します。それは無言と長文です。

(ユーザ)「青森市」

(天気くん)「   」

無言の場合はどう見てもエラーですね。

(ユーザ)「青森市」

(天気くん)「本州最北の県である青森県のほぼ中央に位置する。
       県の西半部を指す津軽地方にあっては北東部に位置し、
       東津軽郡の町村と東青地域を構成する。
       青森平野を中心とし、北は陸奥湾の支湾である青森湾に面し、
       南部から東部にかけては奥羽山脈の北端部にあたる
       八甲田山・東岳山地の山が連なり、西部で市域は津軽半島の脊梁山脈である
       梵珠山地や津軽平野に広がる。市街地は青森湾沿いの中心市街地から青森平野上を
       扇状に展開しており、行政都市・商業都市・交通都市・港湾都市の性格を有する
       青森市の天気は晴れです」

by wikipedia

長文もエラーに見えますね。むしろこれを最後まで聞いてくれたユーザに敬意を払います。音声というVUIを最適化するには、簡潔にユーザが知りたい情報を話すようにしましょう。丁寧すぎる敬語も長く聞こえるためあまりオススメしません。


終了の言葉

アプリと会話をしていて「もういいよ」と言っても終わらないアプリにも人はイラつきを覚えます。ただでさえ会話の割り込みが日常的な日本人にとっては尚更でしょう。会話を終わらせたい時にすぐに終わるようにしておきましょう。

(ユーザ)「終了」

(天気くん)「またね。」

これでいいでしょう。あえて寂しさを醸し出す事によってリピートされる事を狙います。


天気くんを呼ぶ

これで一通りの機能が完成しました。しかし問題があります。天気くんの事を知らない人たちは永遠に「OK Google 天気くんと話す」とは言いません。ではどうするか。Implicit Invocationの機能を使います。この機能を使えば

(ユーザ)「OK Google 天気が知りたい」

(Google)「天気くんおすすめです。利用しますか?」
(ユーザ)「はい」
(天気くん)「こんにちわ。天気くんだよ!全国の天気を調べる事が出来るんだよ!
       調べたい場所の名前を教えてね!」

という事ができます。しかしGoogleアシスタントアプリも群雄割拠の時代、GoogleアシスタントアプリのSEOも考えねばいけない時代が来ます。やり方は謎です。


完成

ついに完成しました。最初から流してみましょう。

(ユーザ)「OK Go(ogle 天気が知りたい」

(Google)「天気くんがおすすめです。利用しますか?」
(ユーザ)「はい」
(天気くん)「こんにちわ。天気くんだよ!全国の天気を調べる事が出来るんだよ!
       調べたい場所の名前を教えてね!」
(ユーザ)「府中市の天気を教えて」
(天気くん)「府中市は全国にふたつあるよ!東京都と広島県どっちの府中市かなぁ?」
(ユーザ)「東京都」
(天気くん)「東京都府中市の天気は晴れ!最高気温は20度、最低気温は5度だよ!
       ほかにも知りたい場所はある?」
(ユーザ)「横浜市」
(天気くん)「神奈川県横浜市の天気はくもり!最高気温は15度、最低気温は2度だよ!
       ほかにも知りたい場所はある?」
(ユーザ)「カッパドキア」
(天気くん)「ごめんね、よく聞こえなかったよ、もう一回言ってもらっていいかな?」
(ユーザ)「名古屋市」
(天気くん)「愛知県名古屋市の天気は雨!最高気温は10度、最低気温は0度だよ!
       ほかにも知りたい場所はある?」
(ユーザ)「ないよ」
(天気くん)「またね。」

如何でしょうか。非常にスムーズな会話に見えないでしょうか。人が自然にストレスなくできる会話を考える事が、スマートスピーカのアプリを作る第一歩と言えます。

Let's keep brand image!あなたが作ったアプリがあなたの会社のブランドイメージを崩壊させないよう、このノウハウが、あなたのお役に立てれば幸いです。