Gahyeonは、記憶し、聞き、話し、自律的に行動するリアルタイムAIキャラクターを 構築するオープンソースプロジェクトです。会話と記憶を担う独立したCoreを中心に、 Discord、Desktop、Unrealを交換可能な接続先として組み合わせます。
目標はDiscord Botに3D画面を付けることではありません。同じGahyeonがDiscordでは 音声アシスタント、Desktopでは生活するキャラクター、Unrealでは高品質なリアルタイム キャラクターとして存在できる構成を目指します。
優先するのはグラフィックスデモではなく、低遅延リアルタイムAIキャラクターの アーキテクチャです。LLMの応答中もReflex、Behavior、Cognitionは互いをブロックせず 動作し続けなければなりません。
Gahyeon Core
Conversation · Memory · STT/TTS · Tools · Session
Emotion · Behavior · Persistent World
│
Event · HTTP · WebSocket
┌───────────────────┼───────────────────┐
▼ ▼ ▼
Discord Adapter Desktop Compatibility Unreal Stage
Three.js / VRM AAA target
│
Monitor · Looking Glass
Coreは、何を話して記憶するか、どの感情や行動を選ぶかを決定します。各クライアントは その結果を音声、表情、リップシンク、アニメーション、映像として表現します。
| 領域 | 実装・検証状況 |
|---|---|
| Core/Application | プラットフォーム非依存のConversation、Session、Speech port、Event、World/Behavior境界 |
| Headless | DiscordなしでAPIと永続Worldを実行可能。会話にはLLMの設定が必要 |
| Discord Adapter | 既存のSlash Command、テキスト・音声会話、音楽、運用機能を維持 |
| Desktop Client | Electron/Vue/Three.jsによるテキスト、マイク、音声、VRM、Worldの流れを実装 |
| Unreal連携 | WebSocket v1、再接続、イベント再生、snapshot、streaming speechを実装 |
| リアルタイムRuntimeCore | エンジン非依存のC++20 Reflex/Behavior/Cognition、VAD、音声、viseme、Worldテストを実装 |
| Unreal Stage | UE 5.6ソースプロジェクトと診断用Pawn・カメラを実装。MetaHumanとパッケージ検証は未完了 |
| Looking Glass | Desktop WebXRとUnreal Adapterを実装。実機Goでの検証は未完了 |
| 音声制作 | 重複を抑えた5,000文を生成中。完了後にQC、Piper学習、試聴評価へ移行 |
| キャラクター制作 | SDXL LoRA比較と原本に基づくidentity基準を策定済み。最終hero meshは制作中 |
RuntimeCoreのテスト合格を、パッケージ化したUnrealの合格とは扱いません。RT-01から RT-13までの自動検証結果と、実機で確認すべき項目は Acceptance状態表を参照してください。
- Discord、Desktop、UnrealはCoreへ接続するクライアントです。
- CoreはJDA、Electron、Unreal、Spring Web、特定のAI providerに依存しません。
- LLMは高水準の意図だけを選び、フレーム単位の座標やanimation fileを直接選びません。
- Reflex、Behavior、Cognitionは異なる時間軸で並行動作します。
- RendererがなくてもHeadless BehaviorとWorldは進行します。
- Network callbackはGame Threadの状態を直接変更しません。
- イベントcursorと行動結果は、保存に成功した後でのみ確認応答を返します。
- Memoryは何を記憶するか、World Stateは現在どこで何をしているかを担当します。
- Java 21
- Node.js 20以降とnpm
- 本番環境: PostgreSQL 16
- ローカルテスト: PostgreSQL互換モードのインメモリH2
- Unreal開発: Unreal Engine 5.6と互換性のあるMetaHumanプラグイン
./gradlew test
python3 scripts/verify_core_platform_boundaries.py
./scripts/test_unreal_runtime_core.sh
./scripts/verify_unreal_stage_scaffold.sh
./scripts/verify_unreal_protocol_contract.sh
./scripts/test_run_unreal_engine_gate.sh
./scripts/test_smoke_headless_core.sh
cd desktop
npm ci
npm test
npm run buildHeadless CoreはDiscord・Spotify・OpenAI credentialなしで独立して実行できます。 credentialは、それを使用するAdapterまたはProviderを有効にする場合だけ設定します。
BOT_ENABLED=false \
WEATHER_PREFETCH_ENABLED=false \
GAHYEON_HEADLESS_ENABLED=true \
GAHYEON_BEHAVIOR_ENABLED=true \
TTS_ENABLED=false \
./gradlew bootRuncredentialなしでDiscordを無効にした実起動とhealth・World revisionのHTTP smokeは、
./scripts/smoke_headless_core.shで一括再現できます。この無資格smokeではConversation
readinessが意図どおりDOWNとなり、DBとWorldの動作を検証します。
配布JARまで検証する場合は、
GAHYEON_HEADLESS_SMOKE_MODE=jar ./scripts/smoke_headless_core.shを使用します。
低速な開発環境では、GAHYEON_HEADLESS_SMOKE_STARTUP_TIMEOUTを30~900秒の範囲で設定できます。
実際のDocker image境界まで検証するには、./scripts/smoke_headless_container.shを
実行します。一時containerでDiscordを無効化し、healthとWorld revision更新を確認してから、
このスクリプト自身が作成したcontainerだけを削除します。
標準API rootはhttp://127.0.0.1:8080/apiです。Client tokenがない場合、Client APIは
loopback通信のみを許可します。
別のターミナルで実行します。
cd desktop
npm ci
GAHYEON_CORE_API_URL=http://127.0.0.1:8080/api npm run dev遠隔Coreを使う場合は、両側に同じ高エントロピーのGAHYEON_CLIENT_TOKENを設定します。
VRM/VRMAと環境assetはdesktop/.env.exampleを参照してください。
GAHYEON_AGENT_PROVIDER=openai \
AGENT_API_KEY='<key>' \
AGENT_BASE_URL='https://openrouter.ai/api' \
AGENT_MODEL='<model>' \
GAHYEON_HEADLESS_ENABLED=true \
BOT_ENABLED=false \
./gradlew bootRun選択したprovider/modelがtool callと発話可能なテキストを安全に分離できることを確認する
までは、GAHYEON_AGENT_TOOL_SAFE_STREAMING_ENABLEDを有効にしないでください。
BOT_ENABLED=true \
TOKEN='<discord-token>' \
APPLICATION_ID='<application-id>' \
GAHYEON_AGENT_PROVIDER=openai \
AGENT_API_KEY='<key>' \
./gradlew bootRun既存の/설정、/가현아、退出、音楽、運用Slash Commandを維持します。音声会話は
TEN VAD → STT → Conversation → TTSを使い、ConversationとSpeech domainは
Discord objectを参照しません。
BOT_ENABLED=trueの場合、Discord tokenの欠落・拒否または初期化失敗でもapplication
process自体は終了しませんが、/api/healthとActuatorのDiscord healthはFAILED/DOWNに
fail closedします。Blue/Green followerがPostgreSQL advisory lockを正常に待つ場合だけ
STANDBY/UPとなり、BOT_ENABLED=falseは明示的なDISABLED/UP状態です。
Backend WebSocket AdapterとC++20 RuntimeCoreは準備済みですが、標準では無効です。 UE 5.6 Editorとpackaged buildの検証前に本番で有効化しないでください。
UE 5.6をインストールした開発機での正式gate:
GAHYEON_UE_ROOT="/path/to/UE_5.6" ./scripts/run_unreal_engine_gate.shGTX 1660 Ti の Windows 制作マシンでは、まず canonical Stage を検証します。
.\scripts\run_unreal_engine_gate.ps1 -UnrealRoot "C:\Program Files\Epic Games\UE_5.6"Editor 検証後に packaged Development まで生成・封印する場合は -Package を追加します。
packaged 版の10分測定は次の runner で実行・集計・検証します。
.\scripts\run_desktop_realtime_acceptance.ps1 `
-PackagedRoot "C:\gahyeon-package" `
-EvidenceRoot "C:\gahyeon-evidence\desktop-0001"| 変数 | 用途 | 標準値 |
|---|---|---|
BOT_ENABLED |
Discord Adapter接続 | true |
GAHYEON_HEADLESS_ENABLED |
Headless/Desktop API | false |
GAHYEON_CLIENT_TOKEN |
遠隔Client bearer認証 | なし。loopbackのみ |
GAHYEON_BEHAVIOR_ENABLED |
Core自律行動scheduler | false |
GAHYEON_UNREAL_WEBSOCKET_ENABLED |
Unreal WebSocket endpoint | false |
GAHYEON_UNREAL_COGNITION_* |
Unreal Cognition worker/queue上限 | 小さいbounded pool |
GAHYEON_UNREAL_TTS_* |
Unreal TTS worker/queue上限 | 小さいbounded pool |
GAHYEON_UNREAL_VISEME_ALIGNER_* |
exact lip-sync HTTP aligner、250ms playback deadline、専用bounded pool | 無効 |
GAHYEON_UNREAL_SPEECH_SEGMENT_MAX_CHARACTERS |
streaming TTS文分割上限 | 120 |
GAHYEON_AGENT_PROVIDER |
Spring AI chat provider | none |
GAHYEON_AGENT_PROVIDER_FAILURE_COOLDOWN_MILLIS |
model provider障害後のrecovery probe待機時間 | 5000 |
GAHYEON_CONTENT_SAFETY_PROVIDER |
交換可能な入力安全Adapter(openai、none) |
openai |
GAHYEON_CONTENT_SAFETY_CONNECT_TIMEOUT_MILLIS / READ_TIMEOUT_MILLIS |
入力安全provider上限(各100~5000ms) | 300 / 700 |
GAHYEON_CONTENT_SAFETY_FAILURE_COOLDOWN_MILLIS |
入力安全provider障害後の単一recovery probe待機 | 30000 |
GAHYEON_AGENT_TOOL_SAFE_STREAMING_ENABLED |
検証済みproviderのtoken streaming | false |
GAHYEON_AGENT_STREAMING_VERIFIED_BASE_URL |
streaming probeを通過した正確なprovider base URL | なし |
GAHYEON_AGENT_STREAMING_VERIFIED_MODEL |
streaming probeを通過した正確なmodel ID | なし |
AGENT_API_KEY, AGENT_BASE_URL, AGENT_MODEL |
LLM endpoint | providerごとに設定 |
ASSISTANT_STT_*, ASSISTANT_VAD_* |
Discord音声認識とVAD | 環境ごとに設定 |
TTS_PROVIDER |
voicebox、edge、custom |
voicebox |
音声設定とfallbackはCustom Voice TTSを参照してください。
src/main/java/com/gahyeonbot/
├─ core/ framework/platform非依存domain
├─ application/ use case、port、orchestration
└─ adapters/ Discord、Desktop、Headless、Unreal、provider実装
desktop/ Electron/Vue/Three.js互換Presentation Client
unreal/RuntimeCore/ エンジン非依存C++20リアルタイムreference runtime
unreal/GahyeonStage/ UE 5.6 source-only Stage projectとnative module
docs/unreal/ Unreal architecture、protocol、acceptance、integration契約
scripts/ Voice/Piper、SDXL asset pipeline、運用補助ツール
製品・キャラクター・アーキテクチャの正式名称はGahyeonです。com.gahyeonbotの
Java package、既存database/container名、GHCR path、一部service fileのgahyeonbotは、
運用migrationを壊さないためのlegacy identifierです。現在の製品名を示すものではなく、
repositoryとdeploymentを調整して移行するまでは一括変更しません。
- システムアーキテクチャ
- Core分離記録
- API
- Desktop
- AIRI分析
- AAA Character Pipeline (キャラクター制作トラックで作成中)
- Character品質Gate (キャラクター制作トラックで作成中)
docs/GAHYEON_G1_MODELING_HANDOFF.md(キャラクター制作トラックで作成中)- Unreal Acceptance状態
- Looking Glass
- 音声
- デプロイ
- コントリビューションガイド
- セキュリティポリシー
秘密鍵、元音声、学習checkpoint、ライセンス付きのVRM/VRMA/MetaHuman/環境assetをGitや container imageへ含めないでください。デプロイ環境のsecretと別のartifact storageを 使用します。
SDXL出力や生成draftはcanonicalな顔の根拠ではありません。Character identity authorityは checksumで固定したユーザー原本packであり、生成G1 sheetの推定領域と承認状態は別manifestで 管理します。
本プロジェクト独自のsource codeはMIT Licenseで配布します。外部model、音声data、 MetaHuman、Looking Glass SDK、その他のthird-party assetには、それぞれの個別licenseが適用されます。