Actions on Googleで作る 音声操作によるゲーム体験

WFSの久保谷と申します。先日Googleアシスタント上でプレイ可能な音声操作によって進行するゲームをリリースしました。音声操作というものを取り込んだゲームを制作することは、これまで作ってきたゲームとはまた違った体験や知見が得られるものでした。この経験を元にこれから音声操作によるゲーム制作を始める方へ向けてGoogle アシスタントでのアプリケーション開発統合プラットフォームであるActions on Googleでの簡単な実装方法と、ゲーム体験を制作する上で音声操作インターフェースを組み込む際に注意すべき点などを記載させていただきます。

Actions on Google とは

Actions on GoogleとはGoogle アシスタント向けのアクション(対話アプリ)を作成するためのプラットフォームで、アクションの登録から開発、テスト、公開、分析などが可能です。

Actions on GoogleにはActions consoleと呼ばれるアクション開発のためのwebベースのIDEがあります。Actions consoleを用いてGoogleアシスタント上でのアクションの起動方法や、ゲーム中の場面ごとにどんな意図の発言を受け付けて、その発言をフックになんのバックエンドロジックを起動するかを設定することができます。柔軟なアクションの作成に対応するべく、バックエンドロジックにはHTTPS エンドポイントにリクエストを送信するwebhookをトリガーすることができるので、よくあるwebアプリケーションのように自前で用意したエンドポイントに自由にロジックを記載することが可能です。

また、Googleアシスタント上でゲームを展開するためにGoogle Nest Hubなどのスマートディスプレイでフルスクリーンのweb ビュー表示を可能にする Interactive Canvasというフレームワークが用意されています。
このフレームワークを用いてGoogleアシスタント経由でアニメーションの再生や自由なレイアウトを実現するHTML5ゲームの再生が可能となります。

このActions on Googleの仕組みを利用してGoogleアシスタント上でゲーム体験を提供する場合の一例として、今回リリースしたサービスがどのような構成だったのかを次に説明いたします。

作成したゲームのサービス構成

大雑把な図となってしまい恐縮ですが、こちらがゲームサービス構成図の概要となります。

アクションを起動する音声入力がなされるとActions on GoogleからFirebase hostingにアップロードされているHTML5 webアプリケーションが読み込まれて実行されます。このwebアプリケーションは、webの2Dゲームで軽快なパフォーマンスを発揮してくれるCocos Creatorをゲームエンジンとして利用しており、Cocos CreatorからビルドされたHTML5プロジェクトをFirebase hostingにアップロードしてホスティングしています。

バックエンドロジックの実行環境にはActions on Googleとも親和性が高く、連携のドキュメントが充実しているFirebase Cloud Functionsを利用しており、Actions on Google上で場面ごとに設定されている発言意図に対応するwebhookがトリガーされて、対応するFirebase Cloud Functionsの処理が呼び出されます。

ユーザーデータ保存などの用途として、データストレージにはwebhookで値の参照・保存ができるアクション用のユーザーストレージ、ホームストレージ がActions on Googleのプロジェクトに標準で提供されています。しかしユーザーデータの実体の保存にはこちらは利用せずに、Firebase Realtime Databaseを利用しています。(理由については後述します。)

構成としてみると、スマートディスプレイとActions on Google以外はよくあるwebアプリケーションアーキテクチャであることがおわかりいただけると思います。実はActions on Googleの設定方法さえ抑えてしまえば、自然言語解析などの深い専門的な知識などは不要で、メジャーな技術構成のみで音声操作インターフェースを組み込んだゲーム体験が実現可能です。

ユーザーデータの実体を保存するのにFirebase Realtime Databaseを利用する理由

今回リリースしたゲームではActions on Googleのプロジェクトに標準で提供されるユーザーストレージとホームストレージをFirebase Realtime Databaseのユーザーデータ実体の参照先にのみ利用しています。
ユーザーストレージはスマートディスプレイに音声登録されているユーザーアカウントごとのストレージとなります。
しかしこれをそのまま利用してしまうと、例えば家庭内でお父さんのアカウントでプレイしたゲームデータを、音声登録されていないお子さんがゲーム起動した場合に引き継いでプレイすることができないなどの問題が発生する可能性があります。
そこで、この問題を解消するべく家庭内で共通に利用することができるのがホームストレージになります。
ですが、ホームストレージはモバイルデバイスからの参照ができない(ユーザーストレージは参照可能)という制約があるため、ホームストレージのみを利用してしまうと今度はAndroid端末を使って出先でゲームをプレイしたい場合にゲームデータを引き継いでプレイすることができない問題が発生します。

「同じ世帯内で同一のゲームデータでプレイができる」「ユーザーアカウントが紐付けられているAndroid端末で外出先でも同一のゲームデータでプレイができる」これらの状況を実現するために、標準で提供されるユーザーストレージ、ホームストレージの両方にはFirebase Realtime Databaseの参照先のみを保存し、ゲームデータ実体の保存先にはFirebase Realtime Databaseを利用しています。

それでは、まだActions on Googleを利用されたことがない方に向けて、webベースIDEのActions consoleにて音声受付の設定をどのように行っているかの簡単な(本当に簡単な)説明を次で行います。

Actions consoleでの言語受付設定方法

Actions consoleでGoogle Assistantが受け取った音声の内容からゲームの処理を実行する設定を行うためには、ユーザーの発言意図である「Intent」と、どんなIntentを受け付けて何のバックエンドの処理を発火させるかを管理する「Scene」を設定する必要があります。

Intentとは、ユーザーの発言をカテゴライズするものです。例えば「はい」「OK」「決定」「そうする」等の発言を Yes Intentとして設定しておくと、ユーザーがこれらの発言をした際に「Yes Intentにカテゴライズされる発言がなされた」と認識することができるようになります。

Sceneとは、字のごとく場面ごとの詳細設定で、その場面で受け付ける発言や、発言に応じた処理を設定することができます。

次の図を例に取るとWelcome SceneでUser intent handling の項目にてYes, Fact, No の3つのIntentを受け取るように設定されています。

参照:https://developers.google.com/assistant/console/ui

図ではWelcome Scene中に設定されているNo Intentを選択して、Intentが発火した際の詳細設定を行っている状況です。静的な promptsをリターンする設定と、別のSceneへ遷移する設定が書かれています。promptsとは、ゲーム内表示や音声再生などアクションからユーザーへ応答する内容の定義のことです。
もちろん、webhookを利用してユーザーの状況に応じた動的なpromptsをリターンさせることも可能です。前述したInteractive Canvasを利用することで、promptsのリターンのタイミングでwebアプリ(クライアント)側へデータを渡し、予め登録されているコールバックハンドラーが実行されてゲーム状況の更新を行うことが可能です。

このようにScene毎に受け付けるIntentとそれによって発火される処理を細かく設定していくことで音声受付の機構が作成されていきます。 他にも、予め用意されている選択肢からユーザー入力データを抽出するためのTypes や、Scene遷移時に発火させる処理を設定できるScene中の設定項目on Enter, 選択肢の選択状況などの状態に応じて処理を分岐させられるCondition など様々な機能があります。詳細を知りたい方はプロジェクトの作成から設定・動作の確認までの一連の流れが体験できるチュートリアルを実施してみてください。

SSMLによる音声でのゲーム誘導

対話形式によって進行するゲームにおいてはユーザーから発話される音声を受け付けられるようにするだけでなく、ゲーム側からもユーザーに対して次に取るべき行動を音声で誘導するような進行デザインが不可欠です。

バックエンドロジックからリターンするpromptsで定義される、Googleアシスタントからユーザーへの応答でSpeech Synthesis Markup Language (SSML)を利用して返答内容を自然な形で機械に発音させる事が可能です。

SSMLはマークアップ言語なので様々な機能を持ったタグが存在しています。
例えばaudioタグ を用いれば予めホストされている音声ファイルを再生させることが可能です。ユーザーの発言に応じてゲームキャラボイスを再生させる際などに活用できます。

他にも、markタグ を用いればInteractive Canvasと連携して、SSML再生中にクライアント側のコールバックを実行することができます。
例えば2つの音声ファイルを連続してSSMLで実行する際に、ゲーム内で表示している発言内容の吹き出しテキストの中身を更新するイベントを連続する音声ファイルの間で発火させたいときなどに活用できます。
aduio1.mp3再生後にゲーム内のキャラの吹き出しを次のセリフに切り替えて、吹き出し切り替え時間の1秒をまってからaudio2.mp3を再生する例は以下となります。

こうしてSSMLやpromptsの設定を利用して、webアプリクライアント側へデータを渡しビジュアルも更新しつつ、次にゲーム内でとるべき行動などを音声で誘導することで、対話アプリケーションの醍醐味である対話の流れの延長線上でのゲーム進行を実現することが可能です。
今回リリースしたゲームでは、ホーム画面に遷移するたび次にユーザーがするべき行動をキャラクターが音声でサジェスチョンしてくれる機能を追加しました。ユーザーがそれにyesと応答することで、サジェスチョン内容に応じた機能へ誘導されるようなっており、自然な会話の中でゲームが進行するデザインに作られています。

音声入力インターフェースをゲームへ組み込む際の注意点

最後に、音声入力インターフェースを組み込んだゲーム開発特有の注意すべき内容がいくつかありましたので、その内容について記載します。

Actions on Googleとクライアントの状態が同期されていないと進行不能になる点

前述にあるとおり、Google アシスタント上で動作するゲームを制作するためには「webアプリクライアント」「Actions on Googleの言語受け付け設定」「バックエンド」の3つを開発して初めて動作が確認できます。この3つの状況・状態の同期がとられていないと、ディスプレイ表示で求められている返答をしているのにActions on Googleの状態(Scene)が違う状態になっており発言(Intent)を受け付けてくれないという状況が起こったりします。今回リリースしたゲームの開発段階ではSceneが古いまま置いてけぼりになる状況がよく発生していました。特にクライアント側の開発が進むと結合テストをしたい気持ちが早まり、最後にActions on Google 側をホーム画面の Sceneに戻る設定を忘れてホーム画面に戻ってきたときに進行不能になるケースが多かったように感じます。

一つのゲーム画面に類似の単語を含むintentを入れてはならない点

例えば前の画面に戻るための「もどる」ボタンと、リスト表示のページャーを前のページに戻す「もどる」ボタンが同じシーン内に存在していると、ユーザーの意図しない方のIntentが反応してしまうケースが発生してしまいます。そうならないように、一つの画面内で類似の言葉を受け付ける別々のIntentが存在しないように場面設計をする必要があります。

会話デザイン・UI/UXを誘導的にしないとユーザーが迷子になる点

通常のゲームづくりと一番異なると感じた点は、それぞれの場面でユーザーが自由な発言ができるゆえにユーザーを会話の流れやUI/UXを工夫して開発側の発言してほしい発言内容に誘導できるようなデザインにしなくてはならない点です。普通のゲームでは会話進行も限定的な選択肢が用意されているし、ゲームとしてタップできる要素が予め決められています。通常のゲームのノリでナビゲーションキャラクター等に会話をさせるとユーザーが置いてきぼりになるケースが発生します。

例えば、 集めたアイテムの図鑑を表示させる機能で、ナビキャラに「図鑑はこれだけうまったよ!」とだけ言われると次になんて言えばいいのかユーザーは直感的にはわかりません。この例の対応として、「見終わったら『もどる』って言ってね」と付けくわえるなどの誘導が必要になります。
もちろん、画面上のユーザーインターフェースを見れば次にとる行動や発言がわかることもあるとは思いますが、ゲームキャラクターとの対話がメインのゲームコンテンツであるなら、その良さを活かすためにも会話音声のみでゲームが進行できるようにデザインされるべきです。

会話デザイン+音声変更が容易にできるように工夫が必要な点

会話デザインが重要な音声進行のゲームにおいて、収録した音声ファイルを当ててみてからより自然なニュアンスの発言に変更したい要望が発生するということがよくありました。また多言語展開する場合海外ローカライズされた翻訳内容を、会話のキャッチボールの観点でより洗練された表現に変更したい状況もよく発生していました。
そういったときに、GoogleアシスタントのText to Speech の機械による読み上げを利用する場合はSSML内のテキストの変更だけで容易に音声内容を変更できますが、収録したキャラクター音声などを再生している場合、音声ファイルの再収録などの修正は容易なことでは有りません。

対応策として、ゲームの世界観としてText to Speechの進行で問題ないゲームを制作するか、機械学習を用いた合成音声ソフトによってキャラクターの声色かつ自然な音で音声を制作することで修正を容易にすることが可能です。
今回リリースしたゲームでもパートナー企業様からご提供いただいた合成音声ソフトを用いて日本版・海外版のIPキャラクターの音声を生成してゲーム内での柔軟な会話デザインの変更に対応しました。

まとめ

今回、これから音声操作によるゲーム制作を始める方に向けてGoogle アシスタントでのアプリケーション開発統合プラットフォームであるActions on Googleでの簡単な実装方法やサービス構成の例のご紹介、音声操作インターフェースを組み込む際に注意すべき点などを記載させていただきました。記事内にもあります通り、Actions on Googleでの設定方法さえ抑えてしまえばその他はよく知られているようなwebアプリケーション構成で開発をすることが可能ですので、興味を持っていただけた方はぜひお試しいただければと思います。