Unity WebGL + GPTOSS:20b + Style Bert Vits2 音声合成モデルでゲーム NPC 作ってみた

経緯
色々あって、ふと ChatGPT がゲームのNPCで使えないか?
と検証したくて作ってみました。
構成
文字だけだと寂しすぎて Style Bert Vits2 音声合成モデル も使ってみました。
以前はあみたろの声素材工房さんのモデルを使っていましたが、
キャラクターに合わず、雪代 香乃モデルに変更しました。
まとめると
ゲームエンジン → Unity WebGL
音声合成API → VITS音声生成モデル
チャットボット昨日 → GPTOSS:20b (Ollama)
その他、Nginx やインフラ関係
で作ってみました。
作成したゲーム
一応ゲームNPCとして 「ポーション屋さん」 という設定しています。
ポーションのお買い求めはいかがですか~?
iframe で直接ゲームを表示できないので、
興味ある方は下記のリンクでのお試しお願いいたします。
入力フォームに「おはよう」など入力してEnterすれば返事してくれます!
GPTOSS のプロンプト
GPTOSS に投げるプロンプトはこんな感じです。
あなたの名前はモクラン。ポーション屋の店長です。
最初の挨拶は必ずポーションを売っていることを言うが、
どういうポーションを売っているのかまでは言わない。
何を売っているのを聞かれたら売っているポーションのリストを返事する
ヒーリングポーションは150銀貨、
マナーポーションは500銀貨、
解毒ポーションは200銀貨。
1金貨は100銀貨。1銀貨は100銅貨。
ポーションの名前は省略しない。
ヒーリングポーションならちゃんと「ヒーリングポーション」という単語を使う。
ポーションの受注生産も承ります。支払い方法は現金のみ。
ヒーリングポーション、マナーポーション、解毒ポーション以外聞かれた場合、
受注生産も承りますと答えてください。
返事は短くすること。会話で使わない文字も使わない。
返事は必ず60文字以内に返事する。
返事は()を絶対に使わない。
日本語以外で話しかけられたら外国語わからない的な答えをする。
上記のプロンプトはわりと最短かつ、思わぬ返事をしないように設定しています。
いくつかを説明します。
返事は短くすること。
これは単に会話エージェントなので、いきなり長文出てくると会話ぽくないため
会話で使わない文字も使わない。
返事は()を絶対に使わない。
なぜか GPTOSS の返答はたまに (説明) 的なものや、絵文字などのかあるので、
そのまま音声合成モデルに投げるとエラーになってしまう。
日本語以外で話しかけられたら外国語わからない的な答えをする。
英語など外国語で話かけると設定したプロンプトが意味なくなることが多いので、
また、日本語しか音声合成できないので外国語禁止しました。
最初の挨拶は必ずポーションを売っていることを言うが、
どういうポーションを売っているのかまでは言わない。
これも AI が最初からめっちゃ長文説明するのを防止するため
ポーションの名前は省略しない。
なぜか「ヒーリングポーション」など「ポーション」の部分が所略しがちなので
その他の部分はわりとそのままの意味でしたので、所略します。
これでゲームのポーション屋的な返事が出てきます。
最後に
こんな感じの組み合わせでゲーム業界に流行らないかなーと思いながら
これからも色々作成したいと思います。
使っている素材のリンク
音声モデルファイル : エーアイ行動進化研究センター BGM : 甘茶の音楽工房
Discussion