インタラクティブ描画キャンバスのリリース以来、特に昨年は、スマート ディスプレイの 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 を付けてツイートして、皆さんが作っているものについて教えてください。皆さんのアプリのリリースを楽しみにしています。