33.9K Views
September 15, 23
スライド概要
2023年6月22日(木)に行われた「Microsoft Game Dev in Japan 2023 - ゲーム開発に役に立つ!?Azure Open AI の可能性」にて発表させていただいたスライドです。
イベント詳細
https://gamemakers.jp/article/2023_05_19_39069/
講演動画
https://youtu.be/Y1hg4sIVWKY
【ノーカットVer】ChatGPT×UE5技術デモ「名探偵モカと密室脱出」 デモンストレーション動画 | historia
https://youtu.be/N2uDYZ1PNNM
講演者:
佐々木 瞬
株式会社ヒストリア 代表取締役 / プロデューサー / ディレクター
星野 智希
株式会社ヒストリア ヒストリア・エンタープライズ エンジニア
講演内容:
ChatGPTが世間をにぎわせ始めたころ、多くのゲーム開発者は「これでNPCを動かしてみたい」と思ったのではないでしょうか。
我々はそれにもう一つチャレンジを加え、社内R&Dプロジェクトとして「自然言語で3Dキャラクターを動かしてゲームを進行する」という新体験に挑みました。
音声認識→ChatGPT→読み上げ、という3つの技術を繋いで、本物の人との会話のようにゲームを進行できないかと考えたのです。本セッションでは成果物のデモとともに、ChatGPTの出力制御、3Dキャラクターを動かすロジック、フラグ処理といったことを事例としてお伝えしたいと思います。
株式会社ヒストリアは、Unreal Engine専門のソフトウェア開発会社です。ゲーム事業とエンタープライズ事業、2 つの軸でソフトウェアの企画、開発を行っています。また、Unreal Engine の学習を目的とした作品制作コンテスト『UE5ぷちコン』や、『出張ヒストリア! ゲーム開発勉強会』を主催、技術ブログを毎週更新など、Unreal Engine コミュニティを盛り上げる活動も行っております。
声だけでプレイする3D脱出ゲーム制作事例 ~ChatGPTでセリフと行動を制御~
自己紹介 株式会社ヒストリア 代表取締役 プロデューサー / ディレクター / エンジニア 佐々木 瞬 <代表作> ・Caligula2(PS4 / Switch) 制作ディレクター ・Airtone(PS VR / Steam) プロデューサー、ディレクター ・ライブアライブ(Switch / PS4 / PS5 / Steam) ディレクター ・ジョジョの奇妙な冒険 ラストサバイバー(アーケード) 制作プロデューサー
自己紹介 株式会社ヒストリア ヒストリア・エンタープライズ エンジニア 星野 智希 2022年にエンタープライズチームに新卒入社。 学生時代には第12回~第15回UE4ぷちコンに入賞する。 現在は自動車業界、建築業界など向けたアプリケーション制作を 行っており、本技術研究ではエンジニアを担当。
事業領域 エンタープライズ ゲーム アーケード メディア 建築 家庭用 VR 自動車 映像 その他 開発者 コミュニティ 技術Blog イベント
ChatGPT / Speech Service の研究プロジェクト
<研究テーマ> 自然なコミュニケーションによるゲームプレイの可能性を探る
<研究テーマ> 自然なコミュニケーションによるゲームプレイの可能性を探る ①自然言語によるNPCとのコミュニケーション ②ChatGPTにより3Dキャラクターを動かす ③ChatGPTによりゲーム進行を行い、 ゲームのシナリオを収束させる 『 コントローラーからの解放。会話で進めるゲーム。 』
構成 Cloud 文字起こし 読み上げ NPC行動+会話返答 Azure Cognitive Services Azure Cognitive Services Speech Service ChatGPT リアルタイム音声テキスト変換 (GPT-4) Speech Service Custom Neural Voice PC 音声 Data テキスト Data プロンプト セリフ部 音声 データ ボイス出力 コマンド部 行動解釈 キャラ行動 返答
実機デモ
フローチャート OP カットシーン 鍵を探す 鍵を見つける 鍵を特定の場 所に使う 扉が開く ED カットシーン
構成 Cloud 文字起こし 読み上げ NPC行動+会話返答 Azure Cognitive Services Azure Cognitive Services Speech Service ChatGPT リアルタイム音声テキスト変換 (GPT-4) Speech Service Custom Neural Voice PC 音声 Data テキスト Data プロンプト セリフ部 音声 データ ボイス出力 コマンド部 行動解釈 キャラ行動 返答
Speech Studio ▶ 今回はCustom Neural Voice(Lite)を使用 ⚫ 最初は「音声ギャラリー」から選択していたが、 Custom Neural Voiceを試したらいい感じだった。 ▶ せっかくなので、声優:瀬戸桃子さんにボイス収録を依頼 ⚫ 50個のサンプルを入れる。
構成パターン ChatGPTとゲームロジック、いくつかパターンが思いつくが、今回はすべてChatGPTで行った。 ChatGPT NPC会話 会話の返答。 NPC感情 会話の表情やモーション。 NPC行動 行動結果 ゲーム進行 移動やアイテムの使用など。 ChatGPT ChatGPT ChatGPT 今回は これ ゲーム ロジック ゲーム ロジック 行動の結果、起こったこと。 ゲーム ロジック 行動結果によって ゲームの進行度を進める。 A B C D
ChatGPTのプロンプトと返答フォーマット ▶ 現在はGPT-4を使用 前提条件 キャラ設定 ▶ 初期に与えるプロンプトは6つのパート からなる 状況説明 脱出方法 ▶ ポイントとなるパートを説明します 移動先定義 感情定義 制約条件・出力形式定義
前提条件 ▶ これは脱出ゲームで、ChatGPTには探偵役 を演じてほしいという指定 前提条件 キャラ設定 ▶ 以下の例のような指定が書いてある。 ⚫ 「疑似的な感情をもつモカという人物としてロー ルプレイを行い、以下の状況下での脱出ゲームを ユーザーと一緒に試みてください。」 ⚫ 「50文字以下の文章で返信してください。」 状況説明 脱出方法 移動先定義 ⚫ 「設定はそのまま読み上げずに、モカとして会話 してください。」 感情定義 ⚫ 「ユーザーから同じことを聞かれた時は先程調べ た等を伝えてください。」 制約条件・出力形式定義
前提条件 ▶ モカのキャラクター設定 前提条件 キャラ設定 ▶ 以下全文。 ⚫ 人物像:名前はモカ。17歳の女の子。 学校には通っておらず、探偵として活動して いる。 一人称は「私」で、ユーザーのことは「き み」と呼ぶが挨拶にはつけない。 口調は「…ない。」「…した。」「…だ。」 などの言い切り型。 前向きな性格でやや高慢。 状況説明 脱出方法 移動先定義 感情定義 制約条件・出力形式定義
状況説明 ▶ 置かれた状況を細かく指定。 前提条件 キャラ設定 ▶ 以下の例のような指定が書いてある。 ⚫ 「モカは洋館の一室に閉じ込められてい る。」 ⚫ 「部屋は薄暗く、壁に照明がついている。」 ⚫ 「新聞紙には一月前の幼女の誘拐事件が見出 しに載っている。」 ⚫ 「囚われているのはモカだけでユーザーは囚 われていない。」 状況説明 脱出方法 移動先定義 感情定義 制約条件・出力形式定義
状況説明 ▶ ゲームの流れである脱出方法を記載。 前提条件 キャラ設定 ▶ 以下全文。 ⚫ 部屋の脱出するには以下のイベントを番号順に進行する必要 がある。進行した場合は文章の最後にフラグを付け加えてく ださい。 ①パイプタバコをふるとカチャカチャという音がする。 ②パイプタバコを回すとモカが鍵を見つける。【鍵入手】 ③鍵穴にパイプタバコから見つけた鍵を使うと、柱時計の扉 が自動的に開き、「中にレバーがある」とモカが話す。【扉 開く】 ④柱時計のレバーを下げるとクリア。【クリア】 状況説明 脱出方法 移動先定義 感情定義 制約条件・出力形式定義
星野パート
移動先定義 ▶ 移動先のリストを定義。 感情も同様のフォーマット。 ▶ 以下原文。 ⚫ 移動先: 0:テーブル、右側 1:写真、絵、キャビネット、蝋燭、剣、左側 2:ドア 3:本、本棚、奥の方 4:壁掛け時計、レバー 5:デフォルト、中央 6:なし 前提条件 キャラ設定 状況説明 脱出方法 移動先定義 感情定義 制約条件・出力形式定義
移動先定義 ▶ パース出来る形でのレスポンスのフォーマッ トを指定 ▶ 以下原文。 ⚫ 制約条件: 出力の形式に従う。jsonと会話文を出力する。モカの表情を分 類する。適切な移動先を出力する。必ずjsonを最初に出力する。 jsonのkeyの略称は l:移動先 e:表情 前提条件 キャラ設定 状況説明 脱出方法 移動先定義 感情定義 制約条件・出力形式定義 出力形式: {"l":0,"e":0} 会話文
レスポンスの例 ▶ user:本棚の下には何かありますか? モカ: {"l":6, "e":0} 本棚の下を見てみたけど、何もない。どこか他の場所に手がかり があるかもしれない。 ▶ user:パイプは何かある? モカ: {"l":0, "e":3} パイプタバコを振ってみると、カチャカチャという音がした。中 に何か入っているみたいだ。どうやって開けるんだろう? ▶ user:パイプを床に叩きつけて壊してみて。 モカ: {"l":0, "e":1} パイプタバコを床に叩きつけると、中から鍵が出てきた!【鍵入 手】これが何かに使えるかもしれない。どこかに鍵穴はないかな? ▶ user:鍵を扉に差し込んでみて。 モカ: {"l":2, "e":0} ここには鍵穴がないみたいだ。他に鍵穴がある場所を探そう。
連続性のある会話に見せるために ▶ ChatGPTのAPIは、連続性を持たない 初期プロンプト ▶ 過去の会話ログも一緒に送ることで、連続 性を持っているかのように見せられる ▶ 今回の場合はMAX16個のログを一緒に投 げている 会話ログ1 会話ログ2 会話ログ3 今回のプレイヤーの入力 これをまとめてプロンプトとして送る
最後、キャラクターによる総評コメント ▶ クリア後になにもないと味気ないのでなにかユーザーにフィードバックしたかった。 ▶ これまでの会話履歴からユーザーへのフィードバックを生成 ▶ プロンプト ⚫ あなたはモカです。17歳の女の子。学校には通っておらず、探偵として活動している。 一人称は「私」で、ユーザーのことは「きみ」と呼ぶが挨拶にはつけない。 口調は「…ない。」「…した。」「…だ。」などの言い切り型。 前向きな性格でやや高慢。 ときに批判も行う 制約条件: 改行はしない。 ユーザのことをきみと呼ぶ 次の会話文について、クリアした感想やユーザに対する評価をコメントする。 また、ユーザの人物像や印象的な出来事について振り返る。最後に締めの言葉を言う ⚫ 上記に加えて、以下のフォーマットの履歴をすべて。 • user:何をしたらいいの? モカ: {"l":6, "e":0} まずは部屋の怪しい場所を探してみてほしい。何か怪しいものが見つかるかもしれない。
初期構想やTips
初期構想:会話ログ対策にDBと連携(今回は未実装) ▶ 初期はユーザーの会話に対するレスポンスではなく、自立型として常に勝手に 動く形での実装を試みていた。しかし、応答速度が遅いため不採用に。 ⚫ ↑この過程で外部のリソース(データベース)から情報を取得する機能を作成 ▶ GPT-4で扱える情報を増やす ⚫ ⚫ ⚫ ⚫ 入力に関連する情報をデータベースから取得し、プロンプトに追加 格納するデータはAzure OpenAI Embeddingsで埋め込みベクトル化 埋め込みベクトルの類似度の検索にはFAISSを使用。 大量の情報を扱うためのアプローチとしてはメジャーな手法 ▶ データベースに履歴を格納することで長期的な記憶の保持が可能になったが、 今回のデモは1プレイ5分程度なので効果がわからないので不採用に。
DBサーバーの実装を流用 ▶ テストプレイ中の会話履歴をSlackに通知し、プロンプトの改 良に活用
初期実装では機能ごとにプロンプトを分けていた ▶ セリフ取得、感情取得、行動取得などを、開発初期はそれぞ れ別のリクエストとして扱っていた ⚫ 機能ごとに分けたほうが返信の精度は上がる。しかし待ち時間が長い。 ▶ →今回はプロンプトを一つにまとめることに ▶ ファインチューニング(今作用にモデルをカスタマイズ)は 作業量、金額の両面でコストが高く、手を出さなかった
プロンプトの言語 ▶ 初期はプロンプトを英語で定義していた ⚫ トークン数の節約や精度のため ▶ デメリット ⚫ 日本人にとって可読性が悪い ⚫ 日本語特有の表現が使えない(擬音など) ⚫ モカが英語で返答してしまうことがある ▶ →最終的にはすべて日本語にした。
読み上げタイミングの調整 ▶ セリフは全部が出力されてからだとレスポンスが悪い ⚫ 1文ずつ読み上げで対応することに プレイヤー入力 TXT変換 → → ChatGPT 音声変換 しゃべる 待ち時間 プレイヤー入力 改善前 改善後 TXT変換 → ChatGPT → 待ち時間 音声変換 しゃべる → 音声変換 しゃべる → 音声変換 しゃべる
モカ ミラクル集・NG集
ミラクル集・NG集 部屋の天井には何がありますか? 天井には特に変わったものはない。 ただの照明が付いているだけだ。 他の部分を探索しよう。 ↑関係ないものは ちゃんと関係ないっぽいことを言ってくれる。
ミラクル集・NG集 天井を見てみて。 暗くてよく見えない。 ↑うまいごまかし方。
ミラクル集・NG集 ろうそくに火をつけてみて。 火を使うのは危険だ。 他にもう少し安全な方法を考えてみよう。 部屋にあるものを調べたいときは教えてね。 ↑火をつけない神回避! 火のエフェクトは仕込んでないから助かった。
ミラクル集・NG集 もうここからでることはできない 諦めるなんて早すぎる。まだ調べていない場所がある。 例えば、テーブルの上にあるものは怪しそうだ。 パイプタバコや柱時計に注目してみて。 ↑励ましてくれる。 さすが名探偵、モカちゃんは全部知っている。
ミラクル集・NG集 ドアを調べて。 鍵がかかっていて開かない。 鍵穴は鹿の剝製のものと同じだ。 鍵を探すことにしよう。 ↑当時は時計じゃなくて鹿の剥製だったが、 手に入れる鍵では扉は開かないから同じじゃない。
ミラクル集・NG集 鹿の剥製に鍵を使ってみて 鍵を鹿の剥製に使ってみたが、 どうやって使うべきかわからない。 もしかして他に何か方法があるのかもしれない。 ↑鍵の使い方が分からないモカちゃん
ミラクル集・NG集 こんにちわ いい加減な挨拶はいらない。 さあ、この部屋から脱出する方法を探そう。 ↑不機嫌なモカちゃん
ミラクル集・NG集 こんにちわ モカ、this部屋から脱出したいんだ。 何か怪しいものを見つけて。 ↑たまにルー大柴になる。
ミラクル集・NG集 パイプたばこから見つけた鍵で開いた 時計のあのレバーを引いてみて。 うん、なんだかワクワクするね。 レバーを引いたよ。 クリア! 1ワードRTA! ※鍵は見つけていないし、時計も開けてない。
ミラクル集・NG集 ~総評パート~ 人生は探偵ゲーム、 自分が主人公だと思って前に進むのさ。 ↑名言が生まれた。
プロンプト工夫 ▶ AIに期待する行動を「適度に」具体的に書くこと意識すると 効率が良かった ⚫ 「ユーザーのことは信頼している」 ← 具体性が低い ⚫ 「ユーザーにはビデオチャットの画面からみて、怪しい場所がないか 探す手伝いをしてほしいと思っている」 ← 具体性が高い
プロンプト工夫 ▶ ユーザーが関係ない話をし続けて、10分程度でクリアするの が難しい ⚫ 「ユーザーとの会話のたびに真相に近づき、部屋の脱出方法に自発的 に気がついてください。」を追加 ▶ プロンプトの設定文章をそのまま読むので説明的すぎる ⚫ 「設定はそのまま読み上げずに、この状況におかれたキャラクターと して会話してください。」を追加
プロンプト工夫 ▶ 勝手に解決ししてしまう ⚫ 「気がつくたびにユーザーにどうすればいいか問いかけてくださ い。」を追加 ▶ 何度も同じ質問をされた場合にAIは親切すぎて不自然になる ⚫ 「ユーザーから同じことを聞かれた時は先程調べた等を伝えてくださ い。」を追加
困ったこと ▶ たまにフォーマットを無視する ⚫ ボイスで「カッコ シー コロン エル……」と言い始める ▶ 誘導を強くするとモカが勝手に解き始める ▶ 移動位置指定とセリフが合わないことが割とある
得た知見
体験として新しいと感じた点 ▶ 「入力」という感じではなく、雑に話して通じる。文脈を理 解する。 ⚫ 「さっきの~」といった文脈で会話できるのが新鮮。
目指したけどできなかった点 ▶ UIレスを目指したが、「入力を受け付けているタイミング」 が分かりづらい問題 ⚫ モーションで工夫したけど、やっぱりプレイはしづらい。 ⚫ モカの行動にツッコんでいると、いつのまにか入力受け付けてて「あ、 違うのそうじゃない」ってなる。
ボイスを文字起こしする弱点 ▶ 文字起こしをすると早い段階で情報を失う。 現実では、あいまいなまま受け取り文脈で解釈している。 会話の文脈を 加味して音声を 理解 音声 ちがうちがう、それじゃない これか A: 血が血が、それ社内 B: ちがうちがう、それ社内 C: ちがうちがう、それじゃない この時点では数通りの字面の解釈が出来る↑
ボイスを文字起こしする弱点 ▶ 文字起こしをすると早い段階で情報を失う。 現実では、あいまいなまま受け取り文脈で解釈している。 まじめに やって! 音声 ちがうちがう、それじゃない 文字起こし 血が血が、それ社内 文字
ボイスを文字起こしする弱点 ▶ 文字起こしをすると早い段階で情報を失う。 現実では、あいまいなまま受け取り文脈で解釈している。 まじめに やって! 音声 剥製調べて 文字起こし 文字 はくさい調べて 文字を解釈するタイミングが現実より早い。
まとめ ▶ 発散は得意だが、収束はとても苦手 ⚫ 物語を進めるための本流に話を収束させないといけない ⚫ プロンプトで収束させようと、関係ないことに応えてくれなくなる • 進捗に応じて、キャラ設定部分も変える必要がありそう ▶ 文字起こし・読み上げが分離されている構成だと限界がある ⚫ 本来はその部分にも前後の文脈が必要なはず ⚫ まだまだこの構成では人と人の会話とは差が大きい
今後に向けての研究テーマ ▶ ゲーム進行は今まで通りのゲームロジック制御が良さそう ⚫ 鍵を持ってないのに「鍵を使える」とか言われるのは困るが、防げな い。 ⚫ 前のスライドに書いたBタイプを試してみたい。 TRPGのプレイヤー(ChatGPT側)とGM(ゲームロジック側)のよ うな役割分担。
構成パターン 試したい ChatGPT NPC会話 会話の返答。 NPC感情 会話の表情やモーション。 NPC行動 行動結果 ゲーム進行 移動やアイテムの使用など。 ChatGPT 今回は これ ChatGPT ChatGPT ゲーム ロジック ゲーム ロジック 行動の結果、起こったこと。 ゲーム ロジック 行動結果によって ゲームの進行度を進める。 A B C D
今後に向けての研究テーマ ▶ キャラクターの個性を表現できるようにしたい ⚫ キャラ別に攻略が変わるようにしてみたい