Avatar Engine THE Responsive Interface Tunable Helperの略。
好きなアバターを設定して好きなLLM(GGUF量子化されたもの)を好きなプロンプトで動かせます。
Dify API連携も可能なので任意のDifyチャットフローを動かせます
- Releaseページから最新のアプリをダウンロードしてください。
- zipを展開して、好きなLLM(gguf形式)をストリーミングアセットのLLMフォルダに投入してください(HuggingFace等から取得できます)
- LLMを投入したらそのLLMが読み込まれるように設定ファイルを修正してください
- フォルダの直下にある
Aetherith.exe
を実行してください
🚧調整中🚧
- UnityHubをインストールします
- UnityHubで
Unity Editor 6000.0.47f1
をインストールします - GitHubからプロジェクトをクローンします
git clone https://github.com/segfo/Aetherith
- シーンファイルをダブルクリックします
./Aetherith/Assets/Scenes/SampleScene.unity
- ロードされてウィンドウが開いたらいったん閉じます
- もう一度シーンファイルをダブルクリックします
./Aetherith/Assets/Scenes/SampleScene.unity
- 多分いい感じにGameObjectとかが配置されるはずなのでVRMとLLMを以下のディレクトリ直下に配置します
VRMAssets/StreamingAssets/VRM/
LLMAssets/StreamingAssets/LLM/
- UnityEditorのメニューバー > File > Build And Run
でビルドできます。(初回ビルドはEditor上で実行してから、ログを見て実行時エラーが無いことを確認するとよいでしょう。)
- VRM 1.0のみに対応しています。0.x系は使えません。挙動を安定させるために切り捨ててます。
- LLMを用いた自動表情モーフィング及び会話
- LocalLLM・Dify API間でのLLM切り替え
- 会話用LLM及び表情推定用LLMの差し替え
- 会話用LLM及び表情推定用LLMのシステムプロンプトの差し替え
- リップシンクと速度調整
- VRMの動的切り替え機能(メタモルフォーゼ機能)
- VRM拡大縮小(スケールの設定)
- マスコットを動かしたとき、ゆれ物が動く機能
- 設定ファイルの動的適用
- 背景透過・不透過設定(UI調整用機能)
- まばたきの制限
- 細目のキャラが「目を見開いたときの表情」で瞬きをONにするなどが可能です
- 例えば「驚き」、「怒り」等に限定して柔軟に設定可能です
- 一部のセリフの設定(初期表示・キャラを振った時のセリフ)
- UIの色や明るさの調整、VRMの色や明るさ(ライト)の調整
- 方法1:マスコットをクリックしてから
ALT+F4
- 方法2:チャット窓に
/exit
して送信 - 方法3(ネタ):「お前を消す方法」って入力したらなんかインタラクトできるようにしたい(未実装)
- appconfig.json
- systemprompt.txt: 会話用LLMのシステムプロンプトです。好きにしてください。
- emotional_systemprompt.txt: 表情推定用LLM用のシステムプロンプトです。これにはちょっと縛りがあるので例(後述)を参考にしてうまいことやってください。
Aetherith.exe
のあるフォルダから見た相対パスを以下に示します。
名称 | パス | 説明 |
---|---|---|
ストリーミングアセット | ./Aetherith_Data/StreamingAssets |
設定ファイル・VRM・LLMが配置されるベースパス。 特に設定ファイルが本ディレクトリの直下に配置されます。 |
設定ファイル | ./Aetherith_Data/StreamingAssets/ appconfig.json |
アプリが読み込んで利用する設定ファイルです。LLMやVRMのモデル以外の項目は動的にロードされるため起動中に編集して動作確認が可能です |
設定ファイルのテンプレート | ./Aetherith_Data/StreamingAssets/ appconfig.template.json |
設定ファイルのテンプレートです。初期値なんだったっけ、みたいなときに見てください。 |
システムプロンプト(キャラクタ用) | ./Aetherith_Data/StreamingAssets/ systemprompt.json |
キャラクタの性格を定義するシステムプロンプトです。好きな名前や性格にしましょう。 |
システムプロンプト(表情推定用) | ./Aetherith_Data/StreamingAssets/ emotion_systemprompt.json |
VRMの表情を推定するためのLLMが利用するシステムプロンプトです。結果はJSONで返す必要があります。 |
VRMディレクトリ | ./Aetherith_Data/StreamingAssets/ VRM |
好きなVRMをこの中に配置してください。 既定では Default.vrm が使用されます |
LLMディレクトリ | ./Aetherith_Data/StreamingAssets/ LLM |
好きなLLM(gguf形式)を子の中に配置してください。 既定では gemma-3.gguf が使用されます |
フィールド名 | 説明 |
---|---|
characterLlm |
キャラクターの会話AI設定 |
emotionLlm |
感情分析用AI設定 |
vrm[] |
キャラクターの見た目・動き設定です。変身機能(MetamorphoseEnabled)が有効なときは、ここに設定した任意の数のVRMを順に切り替え可能になります。 |
BackgroundWindowTransparent |
ウィンドウの背景を透明にするかどうかを設定します。(trueで透明、falseで不透明)チャットUIやキャラクターの配置調整に使用します |
WindowStackOrder |
ウィンドウの挙動(通常:0,最前面:1,最背面:2)を定義します |
ClickThrough |
クリックスルー機能を有効化するかどうか(true:有効、false:無効) |
chatWindowBgRGBA |
チャットの背景色 |
chatInputWindowBgRGBA |
入力ボックスの背景色 |
welcomeMessage |
起動時のメッセージ |
waitMessage |
考え中のメッセージ |
shakeMessage |
マスコットを振ったときの反応 |
shakeForceThreshold |
振られたと判定する強さ |
botChatTypingInterval |
文字の表示スピード(Botのセリフ・リップシンク速度調整用) |
systemChatTypingInterval |
文字の表示スピード(システムメッセージの速度調整用) |
MetamorphoseEnabled |
変身機能(VRM切り替え機能)の有効・無効化スイッチです。trueの場合VRMの右足(画面上における左側の足)をダブルクリックすることでVRMが順番に切り替わります。VRMを変身させたい場合にどうぞ。それぞれのVRMに詳細な挙動の設定が可能ですのでこだわってみてください。 |
設定ファイル動的ロード機能の対象外です(適用にはアプリの再起動が必要です)
フィールド名 | 説明 |
---|---|
LLMProvider |
使うLLMプロバイダ(Local /Dify ) |
Dify |
LLMProvider="Dify"の時に使用される設定項目群(Dify API) |
Local |
LLMProvider="Local"の時に使用される設定項目群(ローカルLLM) |
DifyのAPIを使います。チャットワークフローに対してのみ使用できます。
フィールド名 | 説明 |
---|---|
apiUrl |
接続先のエンドポイント |
apiKey |
Difyの認証キー |
conversationHandover |
今回の会話を次回のアプリ起動時でも引き継ぐかどうか |
handoverConversationIdKeyName |
会話引継ぎIDを記録するための記憶領域の名前(任意・CharacterとEmotionの設定で被らないようにしてください) |
ローカルの組み込みLLMエンジンを使います。 ggufファイルや人格を構成するシステムプロンプトのファイルを指定します。
フィールド名 | 説明 |
---|---|
modelName |
ローカルで使うAIモデルのファイル名(gguf) |
systemPromptFile |
システムプロンプトのファイル名 |
userName |
ユーザーの名前 |
assistantName |
アシスタントの名前 |
maxContextLength |
最大コンテキスト長 |
temperature |
AIの自由さ・創造性のレベル |
topP |
トップPフィルタリング / 応答の多様性制御(確率フィルター) |
topK |
トップKフィルタリング / 応答候補の数の制限 |
numGPULayers |
GPUにオフロードするレイヤー数。GPUがあれば使ってください。スペックに見合わない数字だと動かなくなるので1から始めたほうがよいです。 |
フィールド名 | 説明 |
---|---|
ToneMappingMode |
トーンマッピングモード(None /Neutral /ACES ) |
LightIntensity |
ライトの強さ |
LightColorRGBA |
ライトの色 (肌色調整など) |
ShadowStrength |
キャラクターの影の濃さ |
Scale |
VRMの表示スケール |
VrmDisplayOffsetX/Y |
画面内でのキャラの位置調整 X軸: +値=右方向移動、-値=左方向移動 Y軸: +値=上方向移動、-値下方向移動 |
ChatInputOffsetX/Y |
画面内でのチャットUIの位置調整 X軸: +値=右方向移動、-値=左方向移動 Y軸: +値=上方向移動、-値下方向移動 |
FileName |
使用するVRMファイル名 (設定ファイル動的ロード機能の対象外です。適用にはアプリの再起動が必要です) |
springBone |
スプリングボーンの設定 |
blinkExclusionExpressionTreshold |
瞬きを抑制(瞬き禁止の場合は許可)する表情と、瞬きを抑制する表情の重み閾値を設定します({"Surprised":0.4,...} であれば、「驚き」の表情の重みが0.4よりも大きい時、瞬きが抑制されます。1.0 にすると常に瞬きします) |
blinkDisable |
デフォルトの瞬きを禁止するかどうか。糸目キャラに有効です。blinkExclusionExpressionTresholdの意味が反転します({"Surprised":0.4,...} であれば、「驚き」の表情の重みが0.4よりも大きい時、瞬きします。1.0 にすると一切瞬きしません) |
フィールド名 | 説明 |
---|---|
ExternalForceMultiplier |
揺れる部分(髪や服)の反応の速さ |
MaximumMovementForce |
揺れる大きさの上限 |
フィールド名 | 説明 |
---|---|
Happy, Sad, Angry... |
目が細まるような表情(笑顔・悲しみ)などのときに、瞬きを抑えるかの設定。blinkDisable をtrueにしたうえで、目を見開く驚きなどの表情に重み(0.9以下)を設定すると瞬きするようになります。(細目キャラの過剰な瞬きを抑制するための機能です) |
表情推定用のLLMはJSON形式で返却してもらう必要があるので、LLMに対して正確なJSONを返却してもらう必要があります。 以下のような制約を付けたプロンプトを書く形です。 ただし、LLMのモデルによっては正確なJSONを返さないこともあるので以下の例を参考にチューニングしてください。 Gemma-3 40億パラメータ 4bit量子化モデル(gemma-3-4b-it-q4_0.gguf)に対するプロンプトです。
# あなたの役割
あなたは感情推定AIです。
渡される発言は**ユーザの発言**です。
**ユーザの発言**を受けた時の**AI側の感情を推定して**ください。
# 感情推定を行うAIのシステムプロンプト
```
あなたは優秀なアシスタントAIです
```
# 注意事項
- AI側の感情を推定してください。
- 表情に反映されます、できるだけシンプルな表情を選んでください。
# 感情表現について
- JSON Schema形式で応答してください。
- 応答フォーマットの <<Value>> で示される値を感情に合わせて変更してください。
- 応答は応答例に従ってください
## 応答フォーマット
{"Happy": <<Value>>, "Sad": <<Value>>, "Angry": <<Value>>,"Neutral": <<Value>>,"Surprised": <<Value>>,"Relaxed": <<V
alue>>}
## 応答例
{"Happy": 0.6, "Sad": 0, "Angry": 0,"Neutral": 0,"Surprised": 0,"Relaxed": 0.4}
## <<Value>>の範囲
最小:0
最大:1
プログラム側では、このプロンプトと発言内容から出力される
{"Happy": 0.6, "Sad": 0, "Angry": 0,"Neutral": 0,"Surprised": 0,"Relaxed": 0.4}
というJSONを解釈して表情を動的に変更しています。