WORKS 一覧へ
AI / Unity + Python

Emotion Avatar

「一緒に過ごすうちに関係性が変わっていくキャラクター」を目指した感情アバター。 心理学の感情モデルを実装可能な形に落とし込み、Unity と Python を WebSocket で リアルタイム接続して、感情の推移がそのまま動きに現れる仕組みを作りました。

UnityPythonPyTorch FastAPIWebSocketGRU / VAE
ROLE
個人開発(感情モデル設計 / 実装)
STACK
Unity (URP), C#, Python, FastAPI, PyTorch
MODEL
Russell 円環 + Ekman 6 基本感情 + 関係性指標
STATUS
コアループ実装済み / 継続開発中

目指したこと

既存のキャラクターアプリを触っていて感じたのは、「反応はするが、関係が積み上がらない」という物足りなさでした。 そこで、その場の感情(短期)と、相手への信頼・親密度(長期)を別の状態として持たせることで、 同じ働きかけでも関係性の段階によって反応が変わるアバターを作ろうと考えました。

「生物らしさ」「個性の創発」「ある程度の予測不可能性」を設計目標に置き、 ロボットの本能・感情モデルに関する先行事例を参照しながら構成を決めています。

感情モデルの設計

valence + valence − arousal + arousal − 喜び / 興奮 怒り / 驚き 悲しみ 安心 / 満足 現在の感情
感情は円環上の座標として連続的に扱い、時間経過で中立へ戻る
  • 短期の感情:Russell の感情円環(valence / arousal)に基づく連続値として保持し、刺激で動いた後は時間経過で中立へ減衰させる
  • 離散的な感情表現:Ekman の 6 基本感情を円環座標から導き、表情・アニメーションのブレンドに使う
  • 長期の関係性:信頼・親密度・機嫌を別レイヤーで保持し、同じ働きかけでも反応の出方が変わるようにする
  • 個体差:個性パラメータで感情の動きやすさ・戻りやすさを変え、同じモデルから性格の違うキャラクターを作れるようにする

システム構成

Unity 側は表示・入力・アニメーション(表情と動作のブレンド)を担当し、 感情の更新は Python 側の推論サーバーに任せています。両者は WebSocket で常時接続し、 タッチや会話といった刺激を送ると、更新後の感情状態が返ってきてアニメーションに反映されます。

  • Python (FastAPI + PyTorch):感情遷移の推論、関係性の更新、時系列の記憶を担う
  • GRU による時系列記憶:直前の刺激だけでなく、やり取りの流れを踏まえて感情を更新する
  • VAE による動作スタイル:同じ感情でも動きの出方に個体差を持たせるための潜在表現
  • ルールベースのフォールバック:学習済みモデルが無い環境でも動くよう、規則ベースの感情遷移を併設して単体で起動できるようにした

学習データをどう用意したか

「この刺激に対して感情がこう動くのが正解」というデータは既存のものが無いため、 ルールベースの教師モデルで合成データを生成し、それを GRU に学習させる方針を取りました。 個性パラメータを振って複数のキャラクターぶんのデータを作ることで、 モデルが個体差を含めて学習できるようにしています。

設計判断:最初から学習モデルに寄せず、ルールベースで「納得できる挙動」を作ってから それを学習で置き換える順番にしました。挙動の良し悪しを判断する基準を先に手で作るほうが、 データが存在しない領域では早く前に進めると考えたためです。

現状と今後

感情モデル・通信・アニメーションブレンドのコアループは動作しており、 身体動作の手続き的生成(呼吸・重心移動)と音声入力への反応が今後の実装項目です。 研究で進めている感情軸付きのモーション生成と接続することで、 表情だけでなく身体全体で感情が伝わるアバターを目標にしています。