目指したこと
既存のキャラクターアプリを触っていて感じたのは、「反応はするが、関係が積み上がらない」という物足りなさでした。 そこで、その場の感情(短期)と、相手への信頼・親密度(長期)を別の状態として持たせることで、 同じ働きかけでも関係性の段階によって反応が変わるアバターを作ろうと考えました。
「生物らしさ」「個性の創発」「ある程度の予測不可能性」を設計目標に置き、 ロボットの本能・感情モデルに関する先行事例を参照しながら構成を決めています。
感情モデルの設計
- 短期の感情:Russell の感情円環(valence / arousal)に基づく連続値として保持し、刺激で動いた後は時間経過で中立へ減衰させる
- 離散的な感情表現:Ekman の 6 基本感情を円環座標から導き、表情・アニメーションのブレンドに使う
- 長期の関係性:信頼・親密度・機嫌を別レイヤーで保持し、同じ働きかけでも反応の出方が変わるようにする
- 個体差:個性パラメータで感情の動きやすさ・戻りやすさを変え、同じモデルから性格の違うキャラクターを作れるようにする
システム構成
Unity 側は表示・入力・アニメーション(表情と動作のブレンド)を担当し、 感情の更新は Python 側の推論サーバーに任せています。両者は WebSocket で常時接続し、 タッチや会話といった刺激を送ると、更新後の感情状態が返ってきてアニメーションに反映されます。
- Python (FastAPI + PyTorch):感情遷移の推論、関係性の更新、時系列の記憶を担う
- GRU による時系列記憶:直前の刺激だけでなく、やり取りの流れを踏まえて感情を更新する
- VAE による動作スタイル:同じ感情でも動きの出方に個体差を持たせるための潜在表現
- ルールベースのフォールバック:学習済みモデルが無い環境でも動くよう、規則ベースの感情遷移を併設して単体で起動できるようにした
学習データをどう用意したか
「この刺激に対して感情がこう動くのが正解」というデータは既存のものが無いため、 ルールベースの教師モデルで合成データを生成し、それを GRU に学習させる方針を取りました。 個性パラメータを振って複数のキャラクターぶんのデータを作ることで、 モデルが個体差を含めて学習できるようにしています。
現状と今後
感情モデル・通信・アニメーションブレンドのコアループは動作しており、 身体動作の手続き的生成(呼吸・重心移動)と音声入力への反応が今後の実装項目です。 研究で進めている感情軸付きのモーション生成と接続することで、 表情だけでなく身体全体で感情が伝わるアバターを目標にしています。