Skip to content

Persona Engine v3.0.1

Choose a tag to compare

@github-actions github-actions released this 20 Apr 21:33
· 11 commits to main since this release
Immutable release. Only release title and notes can be modified.
2f2aee7

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. LlmConnectionProbe hits /models on your endpoint so you know whether Groq/Ollama/OpenAI is actually answering before you speak.
  • Cancel and retry. The FSM grew a Cancelled state and RetryRequested trigger — 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 abstractionISentenceSynthesizer / ISynthesisSession so the orchestrator is now a thin coordinator instead of a Kokoro-specific blob.
  • Phonemizer moved upstream into SentenceProcessor so every engine gets pre-computed, aligned PhonemeResult.
  • 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 OnnxSessionFactory for 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: StateChanged dispatch now serialised in transition order; Error → Idle recovery 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. ConversationSession split into partial files with dedicated collaborators (TurnMetricsTracker, LlmStreamHandler, TtsAudioHandler, …). PhonemizerG2P decomposed into SRP classes (TokenRetokenizer, TokenAligner, PhonemeApplier).
  • Shared utilities: SpanMathExtensions, StringDistanceExtensions, TextExtensions replace 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 ModelType enum with a type-safe nested system.
  • Audio: sub-window RMS sampling for smooth mic meter; new FloatRingBuffer utility.
  • CSharpier v1.0.0 formatting enforced in CI.
  • Tests: new PersonaEngine.Lib.Bootstrapper.Tests project (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/, and Resources/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.
  • ConfigWriter shutdown 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.json field 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.