The honesty release. Every error in here was already technically true and practically useless — so this round went after the lies the app tells when something goes wrong. "Can't reach the local OmniVoice backend" no longer fires while the backend is simply still starting; a dead Hugging Face mirror no longer strands the setup wizard with advice it can't follow; and a dub that dies mid-transcription now names the actual cause instead of guessing at it. Alongside that: generated speech starts playing on the first chunk instead of the last, and there's finally a real uninstaller.
Added
-
Generated speech starts playing on the first chunk, instead of after the last one. Long text is synthesized in chunks, but you used to sit through the entire render before hearing anything. The Studio now streams the preview: audio begins the moment the first chunk is ready and the rest arrives as it renders, so a long passage is audible in about the time the first sentence takes. The take saved to your history is byte-identical to the non-streaming render — streaming is a delivery channel, not a different synthesis path — and if a stream fails mid-flight the app falls back to the classic whole-file flow with nothing half-written to disk. (#1088)
-
A clean uninstaller + a straight answer to "where's my data?" OmniVoice is fully local, so removing it is just deleting the folders it wrote — but until now users had to guess which ones. New
scripts/uninstall.sh(macOS/Linux) andscripts/uninstall.ps1(Windows) find every OmniVoice folder — app data, the multi-GB managed Python env, config, logs, and (separately, because it's shared) the Hugging Face model cache — print each with its size as a dry-run first, and delete only on--yes. They honor your custom locations (OMNIVOICE_DATA_DIR,HF_HOME, portable mode) and never touch the app binary. The complete per-platform path list lives in the newdocs/install/uninstall.md, linked from the README FAQ, SUPPORT, and troubleshooting. (#1089)
Fixed
-
A dub that dies mid-transcription now says what actually happened instead of guessing. "Transcribe stream dropped before emitting any segments. Likely ASR backend failed to load" was a guess — and usually the wrong one. The backend is contract-bound to emit a terminal event on every stream even when it fails, so a stream that simply goes silent means the backend process died underneath it — on smaller GPUs, almost always a native out-of-memory abort while loading the ASR model on top of a still-resident TTS model. The app now consults the desktop shell's crash forensics and tells you that: the exit code, when it happened, a one-click "View crash details" with the captured error output, and the actual next step (free VRAM / pick a smaller ASR model) rather than "check the backend log". With no crash recorded, the original message still stands. (#1062)
-
"Can't reach the local OmniVoice backend" stopped crying wolf during startups and restarts. A real backend start or auto-restart takes 10–20+ seconds (Python spawn plus the PyTorch import), but the app's transport retry only bridged ~3 seconds — every click inside that window dead-ended with the scary toast, over and over, even though the backend healed itself moments later. The app now asks the desktop shell whether a start/restart is actually in progress and simply waits for it (up to the shell's own 2-minute restart budget), and shows a single "backend is restarting — hang tight" banner with a "back — carrying on" confirmation — the reconnecting affordance the supervisor has promised since #567. A truly dead backend (or a non-desktop deployment) still errors promptly, and the crash notice keeps telling the honest story.
-
A dead Hugging Face mirror can no longer strand the first-run wizard. When a model download failed because the configured mirror was unreachable, the error pointed at Settings — which first-run users can't open (the wizard gates the studio) — and falsely claimed the mirror setting only applies after a restart (downloads actually pick it up per call, immediately). Now the wizard shows the mirror quick-pick (including "Hugging Face (official)") right next to the failed download and retries it the moment you switch; the corrected hint says retry-first, restart only if it still fails. Two backend holes in the same flow are closed too: switching endpoints clears the "failed recently" retry cooldown (no more 429 on the immediate retry), and clearing to official also removes the legacy
hf_endpointpref, which used to silently keep the dead mirror in effect.
Changed
-
The first-run wizard shows the app version in its masthead, next to the OmniVoice Studio title — so setup-time screenshots and bug reports identify the build at a glance (the install splash already did).
-
Repo root decluttered. Retired the finished planning archives (
.planning/,specs/), the pre-React design mockups (design/), the legacy research dir (research/), and stale third-party agent rules (.agents/) — ~110 files of process noise gone; everything stays in git history, and the four load-bearing engine decision docs moved todocs/adr/. Contributor-facing only; the app is unchanged.
Linux x64 artifacts
4aae088250f48d6da432ea10483875ccf26647b60be67de65cfebf465cc6622b OmniVoice Studio_0.3.19_amd64.AppImage
0fada05ba551b7a2f325fd9ad132f1c48dcf13ee8c6e005120410443a2eb218c OmniVoice Studio_0.3.19_amd64.AppImage.sig
Windows x64 artifacts
373a7eace6dd9ae279f5ccadfe681dd5beb1b1144981a5ca38cf44e4d1954ef0 *OmniVoice Studio_0.3.19_x64_en-US.msi
3b2083d13093031137e46f46693b5851b01d13cdf9c111d7eecf1aae32ca5c6f *OmniVoice Studio_0.3.19_x64_en-US.msi.sig
macOS Intel artifacts
70499c162e027395894b8a4f0c959e69a926f1a660036a2c552fe106dd69e789 OmniVoice Studio_0.3.19_x64.dmg
586bdb50baf290476bfdc011d6f1a8f2355d919d8aff8b342027fdebe2ff8d93 OmniVoice Studio.app.tar.gz
570c608c81e67ca975f6a90ec07ad3c2336e1b0daa71e1393149944bff278f92 OmniVoice Studio.app.tar.gz.sig