Googleアシスタントのマルチモーダルレスポンスの考え方と最近のレスポンスまわりの変更点

こんにちは。AIアシスタント Advent Calendar 2018の７日目を担当します、里山と申します。
普段はビデオマーケットという会社でVODサービスの事業責任者とVP of Engineeringをしています。

ひとつ言わせてください。
**「このカレンダー、過疎ってないか？」**

AIアシスタントの幕開けたばかりの今、個々の情熱で業界を盛り上げましょう!
まだまだ空いている日があるので、是非どなたか書いていただけると嬉しいです。

## Googleアシスタントの特徴は「多様なデバイス形態」

Googleアシスタントの大きな特徴のひとつは、様々なデバイスで利用できることが挙げられます。
Androidアプリ/iOSアプリ/Android TV/Google Home(スマートスピーカー)/Google Home Hub（スマートディスプレイ）などなど、導入されているデバイスは多種多様です。今年5月のGoogle I/Oでは、5億台のデバイスに搭載されているとの発表がありました。
![スクリーンショット 2018-12-06 13.44.26.png](https://qiita-image-store.s3.amazonaws.com/0/39770/7c019fad-9cd8-5f5c-ff21-257c861f373c.png)

アシスタントアプリの開発者目線で考えると、デバイスの種類が増えるとそれにともなって様々なレスポンスの形を考える必要があります。例えば、Google Homeには画面はありませんが、スマホやTV、スマートディスプレイには画面があります。また、マナーを要する場では画面は利用できても音声を利用できない場面もあるでしょう。ユーザの様々な要求に対応するのがAIアシスタントであるならば、ユーザの利用文脈に沿ったレスポンスの形を提供できなければなりません。

ユーザ文脈に沿ったレスポンスを提供するための、Googleによるひとつの回答が「マルチモーダル」という考え方です。
Google I/Oで発表された内容をおさらいしてみます。

## MultiModal Spectrum

<img width="457" alt="スクリーンショット 2018-12-06 13.59.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/39770/f007b2b4-85cd-b994-6537-875d206a6cbf.png">

これは[Google I/O 2018で発表](https://youtu.be/JDakZMlXpQo)された、Googleアシスタントのためのデザインフレームワークです。
インタラクションに基づいてデバイスを分類するのに役立ちます。

例えば上記の図ですと、
片側の端にはGoogle Homeのような聞いたり話したりする必要がある音声専用デバイスがあり、「Voice-only devices」と呼ばれます。もう片側の端には音声をミュートしたPCやスマホ、スマートウォッチのような音声が利用できない、見たりタッチしたりする必要のある画面専用デバイスがあり、「Visual only devices」と呼ばれます。

そしてその間にあるのが、Googleがマルチモーダルデバイスと呼んでいるものです。

カーナビやスマートディスプレイは、画面がありますが、音声優先の利用用途のデバイスで、「Voice forward devices」と呼ばれます。ミュートしていないスマホやPCは、スマホや画面をミックスして利用することが想定されるデバイスで、「Intermodal devices」と呼ばれます。

| 用途|呼び方 |デバイス|
|:----------|:------------------|:------------------|
| 音声専用    |Voice-only devices | Google Homeなど|
| 画面専用    |Visual only devices | ミュートしたPCやスマートディスプレイ、ウォッチ |
| 音声優先    |Voice forward devices| カーナビやスマートディスプレイ|
| 混合利用    |Intermodal devices|スマホやPC|

音声は、会話形式の入力としてはとても自然で、ITの知識も必要なく、どのような年齢層でも利用できる利点があります。一方で、お店でメニューを見るような場合、メニューのすべてを音声で聞いて頭で覚えておき、それから選ぶのは大変です。目で「スキャン」したほうが自然な行動でしょう。音声と画面は文脈にあわせて、返し方を比較する必要性があります。

## Googleアシスタントのレスポンス構成

こちらも[Google I/O](https://youtu.be/JDakZMlXpQo)からですが、Googleアシスタントのレスポンス構成は以下のように分離されます。
<img width="441" alt="スクリーンショット 2018-12-06 14.53.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/39770/3e7fe026-cdec-ea8d-c44f-21cbdf466278.png">

ユーザの文脈に合わせて自然な会話にしていくためには、会話のターン毎に、Visual Componentを含むすべての方法を検討する必要があります。例えば、prompt、cards, suggestion chipsなどです。例えば、上記の例ですと、Spoken promptですべて話しているトピックを画面上ではリストで表示し、何も興味ない場合はsuggestion chipsに誘導しています。

その後、Multimodal Spectrumのデバイス分類に合わせてマッピングしていきます。

<img width="442" alt="スクリーンショット 2018-12-06 15.17.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/39770/c8d57bdd-be85-df8e-0985-ab6468764590.png">

以上、Googleの「マルチモーダル」の考え方を整理してみました。
上記のようにしてデバイスごとの体験を考えていくと、割と抜けなく、有意義に会話のレスポンス設計ができる気がしています。

表示制御自体は、以下のように、音声と画面の利用可否などで判断します。
![スクリーンショット 2018-12-06 18.42.04.png](https://qiita-image-store.s3.amazonaws.com/0/39770/11cb0434-f0c5-d0c3-258e-cd332322361d.png)

Actions on Googleでは、[Surface Capabilities](https://developers.google.com/actions/assistant/surface-capabilities)で確認します。以下がサポートされているかを確認すると良いでしょう。
（当たり前のことなので割愛します。）
・**actions.capability.AUDIO_OUTPUT**
・**actions.capability.SCREEN_OUTPUT**

## 最近のレスポンスまわりの変更点や気づいたところ

### スマホでCarouselがタイルの縦並びに

最近コミュニティでの会話の中で知ってびっくりしたのですが、RichResponseの「Carousel」が、タイル型で縦に並ぶようなUIに変更されていました。Actions on Googleの[Responses](https://developers.google.com/actions/assistant/responses)のページでも以下の画像に差し替わっていました。

![スクリーンショット 2018-12-06 15.44.29.png](https://qiita-image-store.s3.amazonaws.com/0/39770/1b56ef9b-e317-b767-3a7a-78b14264a74a.png)

Carouselって水平方向スクロールするものという概念が覆されたんですが、これもCarouselと呼んで良いのでしょうか？
また、説明書きのところには以下の文言も書いています。

> While they are visually compelling, carousels are limited in their utility in a multimodal interface. This is because they are hard to interact with as a voice interface (for that, we favor lists). Refer to the guidelines section of the carousels to learn more.

視覚的には魅力的ですが、カルーセルはマルチモーダルインターフェイスでの使用には限界があり、これは、音声インターフェイスとしての相互作用が難しいためだそうです。

先程まで展開してきたマルチモーダルの考え方で言うと、おそらく、画面に表示されるアイテムの数が少ないため「Voice-forward」端末などでは、タッチの回数が増えるなど、利用が難しいのではないかと考えられます。

#### スマートディスプレイでは水平方向のCarousel

シミュレータのスマートディスプレイSurfaceでCarouselを動かしてみました。
スマートディスプレイ上では、Carouselは水平方向表示のままです。
そもそも上下のスクロールが想定されていないようにも感じます。

<img width="639" alt="スクリーンショット 2018-12-07 8.08.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/39770/e312eb6f-cb49-8b2d-f785-99025ee1c84d.png">

### スマートディスプレイではDisplay promptが表示されない

Google I/OのYouTubeを見て気づいたのですが、スマートディスプレイではDisplay promptの表示が想定されていないようです。

<img width="440" alt="スクリーンショット 2018-12-06 15.23.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/39770/b77d0d16-e1c0-aa85-5007-8e78549d2e3e.png">

これもシミュレータ上で試してみました。

スマホでは、以下のように、「Listを表示します」という、SimpleResponseのテキストが表示されていることがわかります。
<img width="287" alt="スクリーンショット 2018-12-07 8.19.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/39770/7161a655-e325-64b5-9c96-90006e6bb712.png">

しかし、スマートディスプレイモードでは、表示されていないことがわかります。

<img width="640" alt="スクリーンショット 2018-12-07 8.19.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/39770/53dcf137-de44-e465-68b3-05778458d692.png">

このあたりも、マルチモーダルの考え方を明確にする意図を感じます。

## おわび

ブログを書く前は、スマートディスプレイの実機検証をしようと考えていましたが、業務多忙につき、検証までにはいたらず、机上の話の展開になってしまいましたことをお詫びします。。。
Google Home Hubを手に入れたのですが、現状は、日本語の呼びかけはできず、英語のみとなっています。しかしながら、YouTubeなどを見ると、日本語の表示自体には対応していて、なかなか楽しく使っております。

![IMG_0614.jpg](https://qiita-image-store.s3.amazonaws.com/0/39770/d3273d73-4782-0636-ca93-0fd90531615d.jpeg)

ちなみに、これもCarouselですね。気づいたのですが「OK Google, Next.」で触らずにスライドできます。


## 最後に

９月にヤフーの一円くんと共著でGoogleアシスタントの入門書を出版しました。
初心者〜中級者に向けて丁寧に解説していますので、気になった方は是非お手にとってみてください！

[【Google Home対応】ステップバイステップで力がつく Googleアシスタントアプリ開発入門（ソシム社）](https://www.amazon.co.jp/%E3%80%90Google-Home%E5%AF%BE%E5%BF%9C%E3%80%91%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E5%8A%9B%E3%81%8C%E3%81%A4%E3%81%8F-Google%E3%82%A2%E3%82%B7%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%88%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E9%87%8C%E5%B1%B1%E5%8D%97%E4%BA%BA-ebook/dp/B07HMYL12G/ref=dp_kinw_strp_1)
![book.jpg](https://qiita-image-store.s3.amazonaws.com/0/39770/bc9af2dd-610f-764e-a5ad-14d6fcf3f767.jpeg)