Persona Engine v3.0.1
Patch Notes — v3.0.1 ✨ Installer, UI, and a new voice
Hey everyone! This one's been cooking for a while. Since v2.0.0 the engine has grown a proper first-run installer, a completely reworked control panel, a second TTS engine, higher-fidelity lip-sync, and a built-in transparent overlay so you can hang out with Aria without launching OBS. Highlights below; full diff is v2.0.0...v3.0.1.
Important
If you're upgrading from v2.0.0: the asset layout changed when the installer landed. Your old Resources/Models/ and Resources/Live2D/Avatars/ folders are ignored — the installer re-downloads into the new locations on first launch. Free up ~16 GB and feel free to delete the old folders once it finishes.
🧳 First-run installer (#22)
Release zips used to be multi-gigabyte bundles with every model and CUDA DLL baked in. Not anymore. Now you download a lean runtime, double-click PersonaEngine.exe, and pick a profile — the app handles the rest.
- Three profiles: Try it out (smallest), Stream with it (balanced), Build with it (largest, highest quality).
- Verified, resumable downloads. Every asset is SHA-256 checked, tag-pinned on HuggingFace, and resumes on interruption.
- NVIDIA runtime included. CUDA 12.4 + cuDNN 9.1.1 + CUDA 13 redists are pulled from NVIDIA's CDN on demand — no more machine-wide CUDA install.
- Flags for power users:
--profile=try|stream|build,--reinstall,--repair,--verify,--offline,--non-interactive,--skip-gpu-check. - GPU preflight. The installer detects your CUDA/driver level and warns if the chosen profile won't fit.
- Features gate themselves. RVC, Audio2Face, and Vision only wire up when their assets are actually present — no silent failures, no crashes.
Tip
Picked Build with it? You still have to flip the switches — the profile downloads the bigger models, but the UI defaults to the light ones. Head to Voice → Expressive, Listening → Accurate, and Avatar → Audio2Face to activate them. Full walkthrough in INSTALLATION.md.
🎛️ Control panel rework (#21)
The control panel got the full makeover treatment. New widgets, new layout, new panels.
- Dashboard first. Presence strip of subsystem health cards (LLM, TTS, Mic, Listening) plus a controls row for cancel / retry / mute.
- Dedicated panels for LLM Connection, Voice, Listening, Avatar, Subtitles, Screen Awareness, and the new Overlay.
- Live reachability.
LlmConnectionProbehits/modelson your endpoint so you know whether Groq/Ollama/OpenAI is actually answering before you speak. - Cancel and retry. The FSM grew a
Cancelledstate andRetryRequestedtrigger — if a turn goes sideways, you can stop it or retry it from the dashboard. - Mic mute gating. Calibration and setup screens quietly hold the mic so you don't get transcribed while fiddling.
- Hot-reloadable LLM. Change endpoint or model while idle and the kernel swaps in without restarting. (Blocked while a turn is active — no mid-sentence surprises.)
- Subtitle WYSIWYG. Live preview renders through an FBO so you can see your styling changes as you type.
- Shared widget library: status chips, endpoint pickers, model pickers, toggle switches, live meters, pill badges.
🪟 Built-in overlay (#21)
You don't need OBS to see Aria anymore. The engine ships a transparent, always-on-top window that mirrors the avatar render target.
- D3D11 + DirectComposition backbone.
- Drag to move, drag the border to resize, reset position/size from the panel.
- Stateless-managed state machine so show/hide/move/resize stay consistent.
OBS + Spout still works exactly the same for streamers.
🗣️ Qwen3 TTS engine (#15)
A second TTS backend, living alongside Kokoro. Switch between them in the Voice panel.
- Qwen3-TTS via llama.cpp with top-P nucleus sampling and CTC forced alignment for word-level timing.
- Unified TTS abstraction —
ISentenceSynthesizer/ISynthesisSessionso the orchestrator is now a thin coordinator instead of a Kokoro-specific blob. - Phonemizer moved upstream into
SentenceProcessorso every engine gets pre-computed, alignedPhonemeResult. - Kokoro hardening along the way: buffer corruption fix, off-by-one EOS fix, ArrayPool lifetime fix, thread-safe session locking.
👄 Audio2Face lip-sync (#16)
New higher-fidelity lip-sync option for avatars that need it.
- Streaming ONNX processor with ARKit-to-Live2D blendshape mapping.
- BVLS and PGD solvers for constrained blendshape fitting, with parameter smoothing and sync compensation.
- IoBinding inference + pre-allocated tensors → ~8 MB saved per window.
- Hot-reloadable — flip between VBridger and Audio2Face from the Avatar panel.
- Centralised
OnnxSessionFactoryfor all ONNX session creation across the codebase.
🧠 Conversation & LLM plumbing
- OpenAI-compat endpoint validation at startup and on hot-reload — catches typos in your endpoint before they turn into silent failures.
- Polly resilience on LLM calls (60s timeout, 3 retries, exponential backoff) via named HTTP client.
- FSM polish:
StateChangeddispatch now serialised in transition order;Error → Idlerecovery path; hierarchical substates for turn-scoped cancellation. - Self-contained publish. The release exe has no .NET Runtime prereq, and no machine-wide CUDA dependency beyond what the bootstrapper pulls.
🔧 Under the hood
- God-class decomposition.
ConversationSessionsplit into partial files with dedicated collaborators (TurnMetricsTracker,LlmStreamHandler,TtsAudioHandler, …).PhonemizerG2Pdecomposed into SRP classes (TokenRetokenizer,TokenAligner,PhonemeApplier). - Shared utilities:
SpanMathExtensions,StringDistanceExtensions,TextExtensionsreplace half a dozen copy-pasted helpers. - Utils reorganised into
Audio/,IO/,Numerics/,Pooling/,Text/namespaces; dead code (AsyncQueue,AtomicCounter,WavUtils,AdapterManagerService) removed. - EmotionProcessor rewrite using character-offset resolution instead of marker injection.
- ModelId replaces
ModelTypeenum with a type-safe nested system. - Audio: sub-window RMS sampling for smooth mic meter; new
FloatRingBufferutility. - CSharpier v1.0.0 formatting enforced in CI.
- Tests: new
PersonaEngine.Lib.Bootstrapper.Testsproject (downloader, zip extractor, NVIDIA manifest, Spectre UI), plus wider Lib test coverage (SentenceProcessor, subtitle timeline, CTC, lip-sync, utilities, asset catalog).
🐛 Notable fixes
- v3.0.1 hotfix (#24): shipped
Resources/Fonts/,Resources/Shaders/, andResources/Prompts/in the release zip (missing from v3.0.0), plus a post-publish sanity check so it can't silently regress again. - Latency tracking only counted the first LLM token — now covers the full response.
- Silero VAD ONNX session switched to sequential/CPU execution after stability issues on some GPUs.
- Lip-sync race on the animation thread, stale pipeline event handling, silence-influenced frame replacement, ONNX disposal ordering.
ConfigWritershutdown race that could crash on exit.- Concurrent modification during sentence-scoped phoneme tracking.
📚 Docs
- INSTALLATION.md rewritten around the installer and the three profiles.
- CONFIGURATION.md (new) — every
appsettings.jsonfield annotated. - README restructured around the new UI with a panel screenshot grid, profile comparison table, and collapsible depth.
- assets-source/README.md documents the HuggingFace publish pipeline for maintainers.
Full changelog: v2.0.0...v3.0.1
Come say hi on Discord — happy to help with setup, rigging, or just to show off the fine-tuned LLM live.