独自のカスタム Google Chat ボットの開発は、ユーザーやチームが直接、または Chat で共同作業するコンテキストの中で、ソリューションやサービスと連携できる優れた方法です。具体的には、Chat ボットをグループの会話で使ってワークフローを効率化したり、ディスカッションの流れの中で操作をサポートしたり、リアルタイムに情報や通知を提供したりできます。Chat ボットはダイレクト メッセージでも利用できます。これは、ワークフローや個人の生産性を最適化する新たな方法で、プロジェクトのタスクを管理する、活動時間を報告するなどの用途があります。ボットのユースケースは多岐にわたるため、時間とともに増え続けている Chat ユーザーに対して一貫してアプローチでき、ユーザーが作業やチャットをしている場所で直接活用できます。
カスタム Chat ボットの具体的なユースケースが決まった後、非常に重要なことは、ボット自身をどう設計するかです。直感的で使いやすいボットは利用される可能性が高く、忠実なフォロワーの増加にもつながります。スムーズでないもの、親しみにくいもの、わかりにくく使い方が複雑なものは、たとえバックエンドが優れていたとしても、「ユーザーを惹きつける」ツールになる可能性は低くなります。エンゲージメントが高く、なくてはならない Google Chat ボットの作成を支援するため、Chat ボット フレームワークに 2 つの機能を追加しました。これにより、これまで以上に高度なボット体験を構築できるようになります。
Chat ボットのユーザビリティを強化するために活用できる最初の新機能が、スラッシュ コマンドです。数か月前にリリースされたスラッシュ コマンドを使用すれば、ボットの主な機能を見つけて実行するための視覚的なガイドをユーザーに提供し、ユーザーが Chat ボットとやり取りする方法を簡素化できます。スラッシュ コマンドの導入前に作成されたボットでは、ユーザーはボットが提供する機能を学習してから、ボットを呼び出してコマンドを正しく入力し、実行する必要がありました。しかしスラッシュ コマンドの登場により、ユーザーは Chat ボットをすばやく最大限に活用できるようになりました。
ユーザーがメッセージ行に “/” と入力するだけで、そのルームやダイレクト メッセージでボットによって提供されているすべての機能が一覧表示され、目的の機能を選択して実行できます。スラッシュ コマンドは、スタンドアロンで呼び出したり(例 : /help)、パラメータとしてテキストを追加したりできます(例 : /new_task review project doc)。このパラメータは、機能が呼び出されたときに処理できます。ボット コマンドをさらに見つけやすくするため、ユーザーが / 以降を入力すると、スラッシュ コマンドのリストがそれに一致するもので絞り込まれます(例 : "/h" と入力すると、H で始まるすべてのコマンドを表示)。ルームにたくさんのボットが追加され、スラッシュ コマンドを利用できるボットが増えると、この機能は便利になります。さらに、スラッシュ コマンドの UI には各コマンドの説明(最大 50 文字)が直接表示されるため、学習しなくても簡単に推測できます。
デベロッパーとして、スラッシュ コマンドは簡単に実装でき、優れたボット体験を提供するうえで欠かせないものだと言えるでしょう。実際、すでに Google Chat ボットを構築してデプロイしているなら、ボットのアップデート リリースでスラッシュ コマンドを含めるように変更する作業は、十分すぎるほど価値があります。
Chat ボットにスラッシュ コマンドを追加するには、Hangouts Chat API 設定ページ(例 : https://console.cloud.google.com/apis/api/chat.googleapis.com/hangouts-chat?project=<?yourprojectname?>)でコマンドを登録する必要があります。スラッシュ コマンドのセクションがあり、そこでユーザーに表示する名前と説明、そして重要なコマンド ID の一意の識別子(1-1000 の整数)を設定できます。この識別子は、後ほどコードでイベントを処理する際に必要になります。
ユーザーがスラッシュ コマンドを使ってボットを呼び出すと、ボットに送信されるメッセージに slashCommand フィールドが追加され、ボットがスラッシュ コマンドによって呼び出されたことがわかります。なお、ユーザーが / コマンドを使わずに @ メンションによって名前で直接ボットを呼び出せる点は変わりません。これは違いを見分けるうえで役立ちます。メッセージには、呼び出されたコマンドに対応する commandId も含まれます。これはボットの設定ページで指定した内容に基づいているため、ユーザーが実行をリクエストしたコマンドはそこから識別できます。さらに、メッセージにはイベントに関するアノテーションも含まれます。ユーザーが引数を指定した場合は、コマンド テキスト自体を解析した結果である argumentText も含まれます。
slashCommand
commandId
argumentText
{ ... "message": { "slashCommand": { "commandId": 4 }, "annotations": [ { "length": 6, "slashCommand": { "type": "INVOKE", "commandId": 4, "bot": { "type": "BOT", "displayName": "Slashbot" }, "commandName": "/debug" }, "type": "SLASH_COMMAND" } ], ... "argumentText": " show code", "text": "/debug show code", ... }
次に示す簡単な例では、ユーザーがスラッシュ コマンドを起動したかどうかを判断し、そうであればコマンド ID からリクエストされたコマンドを判別して実行しています。
function onMessage(event) { if (event.message.slashCommand) { switch (event.message.slashCommand.commandId) { case 1: // Command Id 1 return { 'text': 'You called commandId 1' } case 2: // Command Id 2 return { 'text': 'You called commandId 2' } case 3: // Help return { 'text': 'You asked for help' } } } }
2 つ目の Google Chat ボットの新機能は、ダイアログです。これは Chat ボット フレームワークに導入されたまったく新しい機能で、信頼できる構造化された方法で入力やパラメータを取得するユーザー インターフェースの開発を可能にします。これにより、ユーザーがボットのコマンドを入力するプロセスを簡素化、効率化できるので、ボットのユーザビリティが大きく前進します。ダイアログを使うと、ユーザーは視覚的に入力を促されます。これは、自然言語の入力でボットのコマンドをラップし、ボットが解読できる正しい構文が入力されることを期待する方法とは異なります。
デベロッパーは、ユーザーに指定してもらう必要があるコマンドの入力に対して、正確に動作するように目的を絞り込んだ UI を設計できます。引数を解析してユーザーの意図を論理的に推測する必要はありません。つまり、ダイアログは Chat ボットが対処できるソリューションのパターンとユースケースの種類を大きく拡張します。そのため、ユーザーにもデベロッパーにも、真に高度で実りある体験を実現できます。
内部的には、Chat ボットのダイアログは前述のスラッシュ コマンドと既存の Google Workspace アドオンの Card フレームワークを組み合わせて利用し、ダイアログの作成と処理をしています。この機能を使うには、ダイアログを起動するスラッシュ コマンドを作成し、次に示すように、スラッシュ コマンド設定プロセスで [Slash command triggers a dialog] の設定を true に指定します。
[Slash Command to trigger a dialog] を設定すると、それが呼び出されたときに onMessage イベントが送信される点は変わりませんが、そこにダイアログのリクエストを表す新しい詳細情報が追加されます。このイベントを処理するには、先ほどの例の非ダイアログのスラッシュ コマンドと commandId を使い、switch でユーザーがリクエストしたコマンドを判別します。
switch
ダイアログに実際に描画する要素を設計する際は、Google Workspace アドオンの Card ベース フレームワークを使います。新世代の Google Workspace アドオンを構築したことがある方なら、この部分はおなじみであるはずです。ウィジェットを作成し、ヘッダーやセクションを追加し、イベントなどを作成します。実は、Chat ボットでアドオン UI を再利用したり共有したりすることもできます。ただし現在は、ボットで利用できるのは軽量な一部の要素である点に注意してください。Cards を使うことで、ボット用に一貫性のある最新のユーザー インターフェースを構築でき、タグや CSS の管理など、低レベルの詳細に悩む必要はなくなります。Cards の詳細はこちらをご覧ください。アドオンや Chat ボットでさらに簡単に Cards ベースのインターフェースを作成できるように、GWAO Card Builder ツールも導入しました。これを使うと、ドラッグアンドドロップのビジュアル デザイナーで開発作業を加速できます。
Cards のウィジェットができたら、呼び出されたときにそれをダイアログとして表示するために、次に示すスタブのように、action_response で DIALOG タイプを指定する必要があります。
{ "action_response": { "type": "DIALOG", "dialog_action": { "dialog": { "body": { "sections": [ { "widgets": [ { "textInput": { "label": "Email", "type": "SINGLE_LINE", "name": "fieldEmail", "hintText": "Add others using a comma separator", ...
これで動作するダイアログができるので、あとはダイアログを表示した後のユーザー イベントを処理するだけです。ここでも、アドオンで Cards を扱う際のイベント処理と同じ方法を使います。ボットは、DialogEventType が SUBMIT_DIALOG に設定された CARD_CLICKED タイプのイベントを受け取ります。actionMethodName 値から、ユーザーがリクエストを処理するためにクリックした要素がわかります。下の例では、'assign' です。レスポンスには、ダイアログから返されたユーザー指定の入力である詳細情報 formInputs が含まれているので、それをソリューションのニーズに応じて処理します。
actionMethodName
formInputs
{ dialogEventType: 'SUBMIT_DIALOG', type: 'CARD_CLICKED', action: { actionMethodName: 'assign' }, ... common: { hostApp: 'CHAT', formInputs: { 'whotochoose-dropdown': [Object], whotochoose: [Object], email: [Object] }, invokedFunction: 'assign' }, isDialogEvent: true }
ボットがタスクの処理を終えると、2 つの方法のどちらかでユーザーに応答できます。1 つ目の方法は、単純な確認応答(OK)のレスポンスです。これにより、アクションが正常に処理されてダイアログが閉じられたことを伝えます。
{ "action_response": { "type": "DIALOG", "dialog_action": { "action_status": "OK", ...
もう 1 つの方法は、別のダイアログによる応答です。新しいダイアログや変更したダイアログでフォローアップできるので、複雑な入力シナリオや条件付きの入力シナリオに便利です。これは、ActionResponse で最初にダイアログ カードを使ってダイアログを呼び出したときと同じように実現します。
{ "action_response": { "type": "DIALOG", "dialog_action": { "dialog": { ...
Google Workspace Chat ボットの構築を始めたい方や、スラッシュ コマンドやダイアログを既存の Chat ボットに追加したい方は、以下のリソースをご覧ください。
四半期毎のリリースで更新された Maps JavaScript API のバージョン 3.45 並びに、Weekly リリースの最新バージョンにおいても、非同期メソッドの既存のコールバック パターンに加えて、Promise もサポートされるようになりました。Promise は便利な構文による複雑さの軽減や深く入れ子になったコールバックの排除など、多くの利点をもたらします。今回の Promise の追加は、TypeScript のサポートや Maps JavaScript API の動的な読み込みといった、Maps JavaScript API で最新の JavaScript プログラミング手法やパターンをサポートするうえでの、大きな取り組みの一環となります。 以下の例で示すように、Promise の便利な機能の一つである、async / await を使用することができます。この機能を利用すると、API 呼び出しが成功せず、Promise が拒否された場合に例外が発生します。
const app = async () => {
const elevationService = google.maps.ElevationService();
const locations = [{lat: 27.986065, lng:86.922623}];
const response = await
elevationService.getElevationForLocation({locations});
console.log(response.results);
};
app();
次のパターンは、Promise オブジェクトの then、catch、finally メソッドを使用するもので、エラー処理を改善します。ここでは、catch メソッドが明示されていて、catch なしで Promise が拒否された場合には、未処理の promise 拒否イベントがグローバル スコープに送信されます。
const promise =
promise
.then((response) => {
})
.catch((error) => {
console.log(error);
});
.finally(() => {
console.log('done');
最後に、以下の例は、既存のコールバック パターンの使用法を示しています。今後、新しい非同期メソッドは Promise のみをサポートする可能性がありますが、コールバックは引き続きサポートされる予定です。
const callback = (results, status) => {
if (status === 'OK') {
console.log(results);
} else {
// このケースを処理する
}
elevationService.getElevationForLocation({locations},
callback);
Promise をサポートしている機能の一覧については、Maps JavaScript API の Promise のドキュメントをご覧ください。こちらの内容は、今後の機能拡張に合わせて更新されますので、定期的に確認することをおすすめします。Google Maps Platform に関する詳しい情報はこちらをご覧ください。ご質問やフィードバックはページ右上の「お問い合わせ」より承っております。
インタラクティブ描画キャンバスのリリース以来、特に昨年は、スマート ディスプレイの Google アシスタントに対応したすばらしいストーリーやゲームを作るデベロッパーを支援しています。その過程で、何がうまくいき、何がうまくいかないかについて、多くのことを学びました。このようなインタラクティブな音声体験を構築するのは、まだ比較的新しい試みです。そこで、私たちが学んだことを共有し、アシスタントに対応した、次のすばらしいゲームやストーリー体験を作る際の参考にしていただければと思います。
これから、インタラクティブなゲームやストーリーの設計や開発を行う際に注意すべき 3 つの重要なポイントを紹介します。以下の 3 点は、たくさんの教訓の中から選択しました(本投稿の最後には 10 以上の教訓へのリンクがありますので、お楽しみに)。これらは、Action Builder / SDK の機能を利用するもので、従来の音声のみによる会話のデザインとは微妙に異なっています。
テキスト読み上げ、つまりコンピュータで生成する声は、ここ数年で飛躍的に改善されてきましたが、完璧ではありません。ユーザーテストを通して、ユーザー(とりわけ 子ども)は長い TTS メッセージを聞くのを好まないことがわかりました。もちろん、減らすべきではないコンテンツ(インタラクティブなストーリーなど)もあります。しかし、ゲームのセリフは簡潔にしましょう。可能な場合は、音声よりも視覚によるメディアを活用します。TTS が終わるまで待たせるのではなく、ユーザーが文字を読みながら早送りできるように、画面にスキップボタンを付けることを検討します。多くの場合、TTS と画面のテキストは同じ内容でなくても構いません。たとえば、TTS が「よくできました!次の問題に移りましょう。大きな赤い犬の名前は?」と話す間に、画面のテキストには「大きな赤い犬の名前は?」とだけ表示してもいいでしょう。
実装
応答の音声とテキストのセクションで表現を変えることができるシンプル レスポンスを使って、オーディオと画面で異なるプロンプトを提供できます。Actions Builder でこれを行うには、node クライアント ライブラリまたは JSON レスポンスを使います。次のコードサンプルは、先ほどの例の実装方法を示しています。
candidates: - first_simple: variants: - speech: Great job! Let's move to the next question. What's the name of the big red dog? text: What is the name of the big red dog?
注 : Actions Builder の YAML での実装
app.handle('yourHandlerName', conv => { conv.add(new Simple({ speech: 'Great job! Let\'s move to the next question. What's the name of the big red dog?', text: 'What is the name of the big red dog?' })); });
注 : node クライアント ライブラリでの実装
頻繁に利用するユーザーは、同じ手順を何度も聞く必要はありません。リピーター向けの操作を最適化しましょう。ユーザーが初めて利用する場合は、その背景まですべて説明するようにします。また同じアクションを使う場合は「お帰りなさい」メッセージでそれがわかるようにして、説明は短くします。3~4 回目以上のユーザーであることがわかる場合は、できる限り簡潔にします。
短い説明の例を示します。
HTTP リクエストの User オブジェクトの lastSeenTime プロパティを確認できます。lastSeenTime プロパティは、そのユーザーが最後にインタラクションを行った時間を表すタイムスタンプです。初めてアクションを使うユーザーの場合、このフィールドは省略されます。これはタイムスタンプなので、最後のインタラクションが 3 か月以上前か、3 週間以上前か、3 日以上前かによって、メッセージを変えることができます。次に示すのは、短いデフォルトのメッセージの例です。lastSeenTime プロパティがない場合、つまりユーザーが 初めて このアクションを使う場合は、詳細を含む長いメッセージに更新します。
lastSeenTime
app.handle('greetingInstructions', conv => { let message = 'Make up words from the jumbled letters. Ready?'; if (!conv.user.lastSeenTime) { message = 'Just say words you can make from the letters provided. Are you ready to begin?'; } conv.add(message); });
一般的に使われているインテントで、音声アプリを操作する基本的なコマンドを提供することで、ユーザー エクスペリエンスを大幅に向上させることができます。アクションでこのようなインテントをサポートしていない場合、ユーザーは不満に感じるかもしれません。このようなインテントは、音声ユーザー インターフェースの基本構造となり、ユーザーがアクションを操作する際に役立ちます。
アクションを閉じる。
ユーザーがいつでも簡単に直前の内容を聞き直せるようにする。
ユーザーがお気に入りの体験をもう一度繰り返せるようにする。
困っている可能性があるユーザーに、詳しく説明する。アクションの種類によっては、コンテキストに応じた内容にする。デフォルトでは、ヘルプ メッセージが再生されたあと、ユーザーがゲームを離れた場所に戻る。
ゲームが一時停止したことを視覚的に表示し、視覚と音声の両方で再開する選択肢を提供する。
次の選択肢まで移動する。
アクションのホームまたはメインメニューに移動する。視覚的なアフォーダンスを持たせるとよい。この機能がサポートされていても、視覚的な手がかりがないと、ユーザーが音声で操作できることを知るのは難しい。
インタラクティブ ストーリーで前のページに戻る。
Actions Builder と Actions SDK は、上記のいくつかのユースケースに対応するシステム インテントをサポートしています。 これには、Google がサポートするトレーニング フレーズが含まれています。
actions.intent.CANCEL
actions.intent.REPEAT
その他のインテントは、ユーザー インテントを作成することで実現できます。これは、グローバル(どのシーンでも利用可能)にすることも、特定のシーンに追加することもできます。始める際に参考になるさまざまなプロジェクトの例を示します。
これでおわかりいただけたはずです。ユーザーが何度も使ってみたくなる、驚くほどインタラクティブなゲームやストーリー体験を作るために、覚えておくべき 3 つの提案でした。すべての推奨事項は、教訓のページからご覧いただけます。
お読みいただき、ありがとうございました!意見や質問を共有したい方は、Reddit の r/GoogleAssistantDev からお願いします。
Twitter で @ActionsOnGoogle をフォローして最新情報を受け取り、#AoGDevs を付けてツイートして、皆さんが作っているものについて教えてください。皆さんのアプリのリリースを楽しみにしています。
今回の I/O では、Android アプリに Google アシスタントをさらに簡単に導入し、スマート ディスプレイでエンゲージメントを高めるコンテンツを作成するために役立つ、新しいプロダクトを発表しました。
App Actions を使うと、Android アプリに Google アシスタントを簡単に導入し、乗りものの予約からソーシャル メディア投稿まで、あらゆるユーザーの要求に応えることができます。MyFitnessPal や Twitter などの企業は、すでに App Actions を使い、声だけでユーザーの要求に応えています。Android Studio では、組み込みインテントをアプリの特定の機能や操作にマッピングすることで、App Actions を有効化できます。以下で紹介するのは、音声クエリや提案によって、ユーザーが簡単にコンテンツを操作できる新しい方法です。
たとえば、Yahoo Finance アプリでは、Capabilities を使ってユーザーが「OK Google, Yahoo Finance で Verizon の株価を見せて」と言うだけで Verizon の株価ページを直接開けるようになっています。同じように、Snapchat ユーザーも、「OK Google, スニーカーのスナップを送って」と話すだけでフィルタを追加して友達に送ることができます。
アプリ ショートカットは、Android で一般的なタスクを自動化する方法として、すでによく使われています。Android 12 の新しいショートカット用 API のおかげで、アプリがサポートしているすべてのアシスタントへの要求が見つけやすくなりました。Android ショートカットを作成すれば、自動的にアシスタント ショートカット ギャラリーに表示されるので、ユーザーは「OK Google、ショートカット」と言うだけで、個人の音声コマンドをアプリに設定できます。
Google アシスタントは皆さんのアプリを使うように促すよう、関連するショートカットも提案できます。たとえば、eBay アプリを使うと、ユーザーの画面に「入札を表示」ショートカットを作成する提案が表示されます。
さらに、Google Shortcuts Integration ライブラリも公開しました。これを使うと、Shortcuts Jetpack モジュールによってプッシュされたショートカットを特定し、関連する音声クエリをアシスタントで管理できるようになります。Google アシスタントが関連するショートカットをユーザーに提案してくれるので、皆さんのアプリを使ってもらえるようになります。
ウィジェットを使ってアシスタントから即座に回答や更新を受け取る(近日公開)
Android 12 の改善により、Capabilities API を使って特定の組み込みインテントをウィジェットにマッピングすることで、ウィジェットでコンテンツをすぐに見つけられるようになります。また、今後は車の運転に最適化されたウィジェットを Android Auto でも簡単に使えるようにする予定です。この方法でアシスタントを組み込むと、同じウィジェットで単発の回答、すばやい更新、複数ステップのインタラクションを実現できます。
たとえば、Dunkin のウィジェット実装では、「OK Google、Dunkin で再注文して」と話しかけると、以前に注文したドリンクを選んで再注文できます。Strava のウィジェットでは、「OK Google、Strava でマイルをチェック」と話しかけると、1 週間の走行距離をトラッキングし、ロック画面に表示できます。
昨年は、Actions Builder、Actions SDK、そしてデベロッパーとユーザー双方のエクスペリエンスを改善する新しい組み込みインテントなど、スマート ディスプレイ向けのアシスタント プラットフォームに数多くの改善を加えました。ここでお知らせするのは、スマート ディスプレイの会話型アクションをさらに充実させるため、近日中にロールアウトされる改善点です。
インタラクティブ描画キャンバスは、HTML、CSS、JavaScript などのウェブのテクノロジーを使って、タッチや音声でコントロールするアシスタント用のゲームやストーリーを構築する際に役立ちます。CoolGames、Zynga、GC Turbo などの企業は、すでに描画キャンバスを使ってスマート ディスプレイ用ゲームを構築しています。
この機能をリリースしてから、ウェブコードでコアロジックを実装する方がシンプルで高速だというすばらしいフィードバックをデベロッパーからいただいています。これを実現するため、近日中に Interactive Canvas API からテキスト読み上げ(TTS)、自然言語理解(NLU)、ストレージ API にアクセスできるようにして、デベロッパーがクライアント側コードからこれらの機能をトリガーできるようにします。この API により、経験豊富なウェブ デベロッパーがおなじみの開発フローを利用して、さらに応答性の高い描画キャンバス アクションを作れるようになります。
また、アクションをリリースする選択肢も増やす予定です。近日中に、Actions Console で段階的リリースを管理できるようにします。たとえば、ある国で最初にリリースしてから後でさらに拡大したり、一部のユーザーにだけリリースしてから徐々にロールアウトしたりできるようになります。
スマート ディスプレイで視覚表現を強化する改善も行われています。たとえば、固定ヘッダーを削除してデバイスの全画面を活用することで、ユーザーに臨場感あふれる体験を提供できます。
インタラクティブ描画キャンバスによってスマート ディスプレイでタッチ インターフェースのカスタマイズが可能になる前は、デバイスの画面のどこかをタップして TTS の再生を停止する簡単な方法を提供していました。しかし、スマート ディスプレイでマルチモーダルなエクスペリエンスが増えるにつれて、ユーザーがディスプレイをタップしている間も TTS の再生を継続することが重要になるユースケースが登場しています。そこで、アクションで TTS を継続できるようにするオプションを近日中に提供する予定です。
さらに、Media API を更新して長時間のメディア セッションをサポートしています。これにより、特定の時間から再生を開始する、以前のセッションが停止したところから再開する、メディアの再生状況に応じて会話に応答する、といったことができるようになります。
皆様が Google のプラットフォームでビジネスを構築するために必要なツールを用意することがいかに重要であるかは理解しています。昨年 10 月、シームレスな音声ベースとディスプレイベースの収益化機能を簡単に追加できるようにすることをお知らせしました。オンデバイス CVC とクレジット カードの入力が、まもなくスマート ディスプレイで利用できるようになります。この 2 つの機能によって、オンデバイス取引がはるかに簡単になり、ユーザーをモバイル デバイスにリダイレクトする必要がなくなります。
これらの新機能を活用して、モバイルでも自宅でも、エンゲージメントの高い体験を構築し、多くのユーザーに簡単に使っていただけることを期待しています。YouTube の Google I/O でテクニカル セッションやワークショップなどを確認し、早速 App Actions や会話型アクションを始めましょう!