# voicebox changelog > voicebox release notes. - Vendor: voicebox - Category: AI - Official site: https://voicebox.sh/ - Tracked by: What's New (https://whatsnew.fyi/product/voicebox) - Harvested from: GitHub (jamiepine/voicebox) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. ## Releases ### v0.5.0 - Date: 2026-04-25 - Version: v0.5.0 - Original notes: https://github.com/jamiepine/voicebox/releases/tag/v0.5.0 - Permalink: https://whatsnew.fyi/product/voicebox/releases/v0.5.0 - **added** — Global hotkey capture allows speaking anywhere on the machine with a customizable chord to dictate text into the focused application - **added** — Push-to-talk and toggle modes each with their own configurable chord, with ability to upgrade a push-to-talk hold into a hands-free session by tapping Space mid-hold - **added** — Auto-paste feature that synthesizes dictation into the text field that had focus when the hotkey chord was initiated, with clipboard preservation - **added** — Chord picker UI in Settings to customize hotkey combinations with visual left/right modifier badges - **added** — Voice profiles can now carry an optional personality description up to 2000 characters that shapes how the voice speaks - **added** — Compose button powered by local Qwen3 LLM that generates in-character lines based on voice personality - **added** — Speak in character toggle that runs input through the personality LLM before TTS to deliver text in the character's voice - **added** — Built-in Model Context Protocol server at http://127.0.0.1:17493/mcp enabling MCP-aware agents like Claude Code, Cursor, and Cline to access Voicebox - **added** — voicebox.speak MCP tool that speaks text in any voice profile with optional personality parameter - **added** — voicebox.transcribe MCP tool that performs Whisper transcription of base64 blobs or local file paths with security restrictions for non-loopback callers - **added** — voicebox.list_captures MCP tool that returns recent captures with their transcripts - **added** — voicebox.list_profiles MCP tool that lists available voice profiles - **added** — Streamable HTTP as primary MCP transport for clients like Cursor, Windsurf, VS Code, and Claude Code - **added** — voicebox-mcp binary sidecar for clients that do not support HTTP MCP transport - **added** — Per-client voice binding feature allowing different MCP clients to be pinned to specific voice profiles via X-Voicebox-Client-Id header - **added** — Speaking pill on-screen indicator showing when agent-initiated speech is occurring with profile name and elapsed timer - **added** — POST /speak REST endpoint wrapper for shell scripts and non-MCP applications - **added** — Transcript refinement using local Qwen3 LLM to strip fillers, fix punctuation, and optionally rewrite self-corrections - **changed** — Voicebox transforms from a voice-cloning studio into a full AI voice studio with bidirectional agent communication ##### The Capture release. Voicebox stops being just a voice-cloning studio and becomes a full AI voice studio. Hold a key anywhere on your machine, speak, release — the transcript lands in the focused text field. Flip the primitive around and any MCP-aware agent — Claude Code, Cursor, Spacebot — speaks back through an on-screen pill in one of your cloned voices. A local LLM sits between the two, so transcripts come out clean and voice profiles can carry a personality that reshapes what the agent says before it gets spoken. Screenshot 2026-04-22 at 2 37 10 PM ###### Dictation — speak anywhere, paste anywhere - **Global hotkey capture.** Hold a customizable chord anywhere on your machine (defaults: right-Cmd + right-Option on macOS, right-Ctrl + right-Shift on Windows), speak, release. A floating on-screen pill walks through recording → transcribing → refining → done with a live elapsed timer. The transcript lands as clean text. - **Push-to-talk and toggle modes, each with its own chord.** The default toggle chord adds Space to the push-to-talk chord. Holding PTT and tapping Space mid-hold upgrades a hold into a hands-free session without a gap in the recording. - **Auto-paste into the focused app.** Once transcription finishes, Voicebox synthesizes a paste into whatever text field had focus when you started the chord — not wherever focus drifted while you were talking. Works across Dvorak / AZERTY layouts. Your clipboard is saved before and restored after. - **Chord picker UI.** Customize either chord from Settings → Captures by holding the keys you want. Left/right modifier badges show whether a key is the left or right variant. - **Defaults stay out of your way.** macOS defaults avoid left-hand Cmd+Option chords so the system shortcuts they collide with stay yours. Windows defaults route around AltGr collisions on German / French / Spanish layouts. - **Accessibility permission is scoped.** If macOS Accessibility isn't granted, dictation still runs and transcripts still land in the Captures tab — only synthetic paste is disabled. The permission prompt lives inline next to the auto-paste toggle, not as a global banner. ###### Personality — voice profiles that speak for themselves Voice profiles now carry an optional **personality** — a free-form description of who this voice is, up to 2000 characters. When set, two new controls appear next to the generate button, each powered by a new Qwen3 LLM running entirely locally: - **Compose** — the shuffle button drops a fresh in-character line into the textarea. Click again for variety, edit before speaking. - **Speak in character** — the wand toggle runs your input through the personality LLM before TTS, preserving every idea but delivering it in the character's voice. The same LLM doubles as the refinement model, so there's one local LLM in the app, not two. **API surface.** `POST /generate`, `POST /speak`, and the MCP `voicebox.speak` tool accept `personality: bool`. `POST /profiles/{id}/compose` powers the shuffle button. MCP client bindings carry a `default_personality: bool` that applies when `personality` isn't passed explicitly. ###### Agents — any MCP-aware agent gets a voice Voicebox ships a built-in **Model Context Protocol** server at `http://127.0.0.1:17493/mcp` so Claude Code, Cursor, Windsurf, Cline, VS Code MCP extensions — any MCP-aware agent — can call into your local Voicebox install. Four tools ship with dotted names: - **`voicebox.speak`** — speak text in any voice profile, with optional `personality: true` to run through the profile's personality LLM first - **`voicebox.transcribe`** — Whisper transcription of a base64 blob or an absolute local path. Path mode is restricted to loopback callers so a Voicebox bound on `0.0.0.0` doesn't double as an unauthenticated arbitrary-local-file read primitive _[Truncated at 4000 characters — full notes: https://github.com/jamiepine/voicebox/releases/tag/v0.5.0]_ ### v0.4.5 - Date: 2026-04-22 - Version: v0.4.5 - Original notes: https://github.com/jamiepine/voicebox/releases/tag/v0.4.5 - Permalink: https://whatsnew.fyi/product/voicebox/releases/v0.4.5 - **fixed** — Load no longer fails with "offline mode is enabled" error by wrapping transformers tokenizer metadata checks to catch and handle HuggingFace failures gracefully - **fixed** — Removed load-time offline guards that were causing crashes for cached online users after the inference-path guard was removed - **fixed** — Eliminated 30-second pause when generating without network access by handling HuggingFace metadata timeout at the source Second hotfix for the "offline mode is enabled" crash on model load. 0.4.4 reverted the inference-path offline guards but kept the same trap on the load path, so users who updated to 0.4.4 kept hitting the exact error the release was supposed to fix ([#526](https://github.com/jamiepine/voicebox/issues/526)). This release removes the load-path guards and patches the transformers tokenizer load to be robust to HuggingFace metadata failures at the source, so the class of bug can't recur. ###### Reliability - **Load no longer fails with "offline mode is enabled"** ([#530](https://github.com/jamiepine/voicebox/pull/530), fixes [#526](https://github.com/jamiepine/voicebox/issues/526)). transformers 4.57.x added an unconditional `huggingface_hub.model_info()` call inside `AutoTokenizer.from_pretrained` (via `_patch_mistral_regex`) that runs for every non-local repo load, regardless of cache state or whether the target model is actually a Mistral variant. The load-time `HF_HUB_OFFLINE` guard from 0.4.2 turned that into a hard crash for cached online users the moment 0.4.4 removed the inference-path guard that had been masking the problem. Fix wraps `_patch_mistral_regex` so any exception from the HF metadata check is caught and the tokenizer is returned unchanged — matching the success-path behavior for non-Mistral repos. The wrapper installs at `backend.backends` import time so it covers Qwen Base, Qwen CustomVoice, TADA, and every other transformers-backed engine on Windows, Linux, and CUDA alike. The load-time `force_offline_if_cached` guards were removed — with the wrapper in place they provide zero value and only risk re-introducing the same failure mode. - **No more 30s pause when generating without a network.** The HuggingFace metadata timeout called out as a known caveat in 0.4.4 is covered by the same patch; offline users no longer wait for the check to time out before load completes. ### v0.4.4 - Date: 2026-04-21 - Version: v0.4.4 - Original notes: https://github.com/jamiepine/voicebox/releases/tag/v0.4.4 - Permalink: https://whatsnew.fyi/product/voicebox/releases/v0.4.4 - **fixed** — Inference no longer fails with "offline mode is enabled" while online by reverting inference-path guards that blocked legitimate metadata calls Hotfix for a regression in 0.4.3 where generation and transcription could fail outright with "offline mode is enabled" even when the user was online. ###### Reliability - **Inference no longer fails with "offline mode is enabled" while online** ([#524](https://github.com/jamiepine/voicebox/pull/524), reverts the inference-path guards from [#503](https://github.com/jamiepine/voicebox/pull/503)). 0.4.3 wrapped every inference body (`generate`, `transcribe`, `create_voice_clone_prompt`) with a process-wide `HF_HUB_OFFLINE` flip to stop lazy HuggingFace lookups from hanging when the network drops mid-inference ([#462](https://github.com/jamiepine/voicebox/issues/462)). That flag also blocks legitimate metadata calls (e.g. `HfApi().model_info` for revision resolution) so online users started seeing generation fail outright. Inference now runs with the process's default HF state. Load-time offline guards — which weren't the source of the regression — stay in place. **Known caveat**: users generating without an internet connection may see brief pauses during inference while HuggingFace metadata lookups time out (typically ~30s, after which the library recovers). A proper offline-mode toggle is planned for 0.4.5. ### v0.4.3 — voicebox v0.4.3 - Date: 2026-04-21 - Version: v0.4.3 - Original notes: https://github.com/jamiepine/voicebox/releases/tag/v0.4.3 - Permalink: https://whatsnew.fyi/product/voicebox/releases/v0.4.3 - **fixed** — macOS DMGs are now notarized and stapled to resolve Gatekeeper rejection on macOS 15 Sequoia and spurious "app isn't signed" dialogs on older Intel Macs - **fixed** — Kokoro Japanese voices no longer crash on fresh installs by replacing unidic with unidic-lite for MeCab dictionary bundling A patch focused on two user-impacting reliability fixes: macOS DMG notarization (unblocks `brew install voicebox` on macOS 15 Sequoia and fixes spurious "app isn't signed" Gatekeeper dialogs on older Intel Macs) and Kokoro Japanese voice initialization on fresh installs. ###### macOS - **DMGs are now notarized and stapled** ([#523](https://github.com/jamiepine/voicebox/pull/523)). Tauri's bundler notarizes the `.app` inside the DMG but ships the DMG wrapper itself unnotarized. Gatekeeper rejects that on macOS 15 Sequoia (confirmed by Homebrew Cask CI failing on both arm and intel Sequoia runners) and causes the "the app is not signed" dialog on older Intel Macs when Apple's notarization servers are slow or unreachable ([#509](https://github.com/jamiepine/voicebox/issues/509)). The release workflow now submits each DMG to `notarytool`, staples the ticket, verifies with `spctl`, and overwrites the draft-release asset `tauri-action` uploaded. Adds ~5-10 min per macOS job. ###### Backend - **Kokoro Japanese voices no longer crash on fresh installs** ([#521](https://github.com/jamiepine/voicebox/pull/521), fixes [#514](https://github.com/jamiepine/voicebox/issues/514)). `misaki[ja]` pulls in `fugashi`, which needs a MeCab dictionary on disk. The `unidic` package that was being installed ships no data and expects a ~526MB runtime download that `just setup` doesn't run (and which wouldn't survive PyInstaller anyway). Swapped to `unidic-lite`, which bundles a MeCab-compatible dict inside the wheel (~50MB). Collected in `build_binary.py` so frozen builds pick up `unidic_lite/dicdir/`. ### v0.4.2 — voicebox v0.4.2 - Date: 2026-04-21 - Version: v0.4.2 - Original notes: https://github.com/jamiepine/voicebox/releases/tag/v0.4.2 - Permalink: https://whatsnew.fyi/product/voicebox/releases/v0.4.2 - **added** — Localize entire app with English, Simplified Chinese, Traditional Chinese, and Japanese across all tabs, modals, dialogs, and toasts with 559 translation keys per locale - **added** — Add in-app language switcher with tree re-rendering on locale change - **added** — Localize relative dates via date-fns locale objects - **added** — Make dev-build version suffix locale-aware - **added** — Add new /download page for first-time visitors - **changed** — HF_HUB_OFFLINE now guards every inference path to prevent HuggingFace metadata roundtrips when offline mode is enabled - **changed** — Preprocess Chatterbox reference samples instead of rejecting them when outside expected sample rate or channel layout - **changed** — Use public origin instead of localhost for download redirects behind reverse proxies - **changed** — Update MDX docs to remove stale single-engine assumptions - **fixed** — Fix MLX Qwen 0.6B repo path to point at mlx-community repo - **fixed** — Fix macOS system audio capture that was silenced when app lost focus due to WKWebView audio session teardown - **fixed** — Pin MLX backend miniaudio dependency for runtime requirement This release localizes the entire app. English, Simplified Chinese (zh-CN), Traditional Chinese (zh-TW), and Japanese (ja) are wired up end-to-end across every tab, modal, dialog, and toast — 559 translation keys per locale, parity verified. Plus a batch of reliability fixes: offline-mode now actually stays offline, Chatterbox accepts reference samples it used to reject, MLX Qwen 0.6B points at the right repo, and macOS system audio survives backgrounding. ###### Internationalization ([#508](https://github.com/jamiepine/voicebox/pull/508)) - **i18next foundation** with an in-app language switcher that re-renders the tree on change — lazy-loaded components were holding stale strings without an explicit key-bump on the React root. - **Four locales** at full coverage: English, Simplified Chinese, Traditional Chinese, Japanese. No partial/English-fallback surfaces. - **Every user-visible surface translated**: Stories (list, content editor, dialogs, toasts), Effects (list, detail, chain editor, built-in preset names), Voices (table, search, inspector, Create/Edit modal, audio sample panels), Audio Channels (list, dialogs, device picker), history + story dropdown menus, ProfileCard / ProfileList / HistoryTable, and the unsupported-model note. - **Relative dates** localize via `date-fns` locale objects (`3 days ago` → `3 天前` / `3 日前`) — `Intl.RelativeTimeFormat` doesn't produce the phrasing we use in the history table. - **Dev-build version suffix** (`v0.4.2 (dev)` / `(开发版)` / `(開發版)` / `(開発版)`) is now locale-aware. - **559 translation keys** across all four locales. ###### Reliability - **`HF_HUB_OFFLINE` now guards every inference path** ([#503](https://github.com/jamiepine/voicebox/pull/503)) — some engines were still attempting a HuggingFace metadata roundtrip on first load when offline mode was enabled, causing hangs on airgapped or flaky networks. - **Chatterbox reference samples are preprocessed instead of rejected** ([#502](https://github.com/jamiepine/voicebox/pull/502)) — samples outside the expected sample rate or channel layout are resampled to match, rather than failing with an opaque error. - **MLX Qwen 0.6B repo path fixed** ([#501](https://github.com/jamiepine/voicebox/pull/501)) — now points at the published `mlx-community` repo so the model actually downloads on Apple Silicon. - **macOS system audio survives backgrounding** ([#486](https://github.com/jamiepine/voicebox/pull/486), closes [#41](https://github.com/jamiepine/voicebox/issues/41)) — WKWebView was tearing down the audio session when the app lost focus, silently killing system-audio capture. - **MLX backend `miniaudio` dependency pinned** ([#506](https://github.com/jamiepine/voicebox/pull/506)) — `mlx_audio.stt` needs it at runtime and nothing else transitively pulled it in, so `--no-deps` installs were breaking on first use. ###### Landing / Docs - **New `/download` page** ([#487](https://github.com/jamiepine/voicebox/pull/487)) — no more dumping first-time visitors onto the GitHub releases list. The API example snippet on the landing page also got an accuracy pass. - **Download redirects work behind reverse proxies** ([#498](https://github.com/jamiepine/voicebox/pull/498)) — uses the public origin instead of `localhost` when resolving platform-specific installer URLs. - **MDX docs audited against the multi-engine backend** ([#484](https://github.com/jamiepine/voicebox/pull/484)) — stale single-engine assumptions removed. - **Three more tutorials + mobile navbar / hero CTA fixes** ([#483](https://github.com/jamiepine/voicebox/pull/483)). ###### Linux - **Still not shipping.** The re-enable attempt ([#488](https://github.com/jamiepine/voicebox/pull/488)) landed on `main` but CI still hangs in the `tauri-action` bundler step on `ubuntu-22.04` — no output for 25+ minutes after `rpm` bundling, even with `createUpdaterArtifacts: false` and `--bundles deb,rpm`. The matrix entry is disabled again for 0.4.2; the ubuntu-specific setup st _[Truncated at 4000 characters — full notes: https://github.com/jamiepine/voicebox/releases/tag/v0.4.2]_ ### v0.4.1 - Date: 2026-04-19 - Version: v0.4.1 - Original notes: https://github.com/jamiepine/voicebox/releases/tag/v0.4.1 - Permalink: https://whatsnew.fyi/product/voicebox/releases/v0.4.1 - **fixed** — Kokoro now bundles .py sources alongside .pyc via --collect-all kokoro so transformers' _can_set_attn_implementation regex scan can read them, fixing FileNotFoundError: kokoro/modules.py in production builds - **fixed** — Chatterbox Multilingual now bundles spacy_pkuseg/dicts/default.pkl and native .so extensions via --collect-all spacy_pkuseg, fixing FileNotFoundError on Chinese word segmenter load - **fixed** — scipy.stats._distn_infrastructure runtime hook source-patches the trailing del obj to globals().pop('obj', None), unblocking librosa → scipy.signal → scipy.stats for TTS engines - **fixed** — transformers.masking_utils runtime hook forces _is_torch_greater_or_equal_than_2_6 = False to select the older sdpa_mask_older_torch path, avoiding torch._dynamo graph transform issues - **fixed** — torch._dynamo no-op stub prevents the torch._numpy._ufuncs import crash that blocked Kokoro and engines pulling in flex_attention - **changed** — .spec paths are now repo-relative instead of absolute, making the generated spec portable across machines and CI - **added** — Cancel queued or running generations via new /generate/{id}/cancel endpoint and Stop button on the history row while generating - **changed** — Serial queue now tracks per-ID state (queued / running / cancelled) so queued jobs are skipped before worker pickup and running jobs are cancelled mid-flight - **fixed** — run_generation now catches CancelledError and marks the row failed with a cancelled error - **fixed** — Generations stored with the old data/ prefix under pre-0.4 installs now resolve correctly after the storage root moved, fixing 404s for historical audio - **fixed** — Migration dialog no longer hangs when the cache is empty by emitting a completion SSE event even when zero models are moved - **changed** — Storage-change flow now surfaces a toast when there's nothing to migrate instead of proceeding with a no-op move - **fixed** — Deleting all generations from a voice profile now deletes the associated version files and DB rows too, preventing orphaned versions from accumulating - **added** — Linux system audio capture now uses pactl get-default-sink + pactl list short sources and routes via PULSE_SOURCE, with name-based search as fallback when pactl is absent - **added** — PR-time type checking via new .github/workflows/ci.yml running bun run typecheck + bun run build:web on every PR - **fixed** — Fixed pre-existing type issues that were being suppressed with @ts-expect-error in frontend code - **fixed** — Cleaned up dep-array typo in useAutoUpdater hook - **removed** — Removed 100+ lines of dead ModelItem code from ModelManagement.tsx - **changed** — Widened apiClient.migrateModels() return type to include moved and errors so the storage-change handler typechecks against the real backend response - **changed** — Clarified in Quick Start and README that paralinguistic tags ([laugh], [sigh]) only work with Chatterbox Turbo; other engines read them as literal text A fast follow-up to 0.4.0 focused on making the new engines actually load in the production binary — plus generation cancellation, Linux system-audio capture, and the repo's first PR-time type check. Five first-time contributors shipped in this release. 0.4.0 introduced three new TTS engines, but the frozen PyInstaller binary tripped over several Python-ecosystem quirks that don't show up in the dev venv: `transformers` opening `.py` sources at runtime, `scipy.stats._distn_infrastructure` hitting a frozen-importer `NameError`, and `chatterbox-multilingual` failing to find its Chinese segmenter dictionary. This release patches all of those in one sweep. ###### Frozen-Binary Reliability ([#438](https://github.com/jamiepine/voicebox/pull/438)) - **Kokoro** now bundles `.py` sources alongside `.pyc` via `--collect-all kokoro` so `transformers`' `_can_set_attn_implementation` regex scan can read them — previously `FileNotFoundError: kokoro/modules.py` killed Kokoro loading in production builds - **Chatterbox Multilingual** now bundles `spacy_pkuseg/dicts/default.pkl` and the package's native `.so` extensions via `--collect-all spacy_pkuseg` — previously the Chinese word segmenter crashed with `FileNotFoundError` on first load - **scipy.stats._distn_infrastructure** — new runtime hook source-patches the trailing `del obj` (which raises `NameError` under PyInstaller's frozen importer because the preceding list comprehension evaluates empty) to `globals().pop('obj', None)`, unblocking `librosa` → `scipy.signal` → `scipy.stats` for every TTS engine that depends on librosa - **transformers.masking_utils** — same runtime hook forces `_is_torch_greater_or_equal_than_2_6 = False` so the older `sdpa_mask_older_torch` path is selected; the 2.6+ path uses `TransformGetItemToIndex()`, a real `torch._dynamo` graph transform our permissive stub can't reproduce - **torch._dynamo** — no-op stub replaces the real module before `transformers` imports it, preventing the `torch._numpy._ufuncs` import crash (`NameError: name 'name' is not defined`) that blocked Kokoro and every engine pulling in `flex_attention` - `.spec` paths are now repo-relative instead of absolute, so the generated spec is portable across machines and CI ###### Generation - **Cancel queued or running generations** ([#444](https://github.com/jamiepine/voicebox/pull/444)) — new `/generate/{id}/cancel` endpoint and a Stop button on the history row while generating. The serial queue now tracks per-ID state (queued / running / cancelled) so queued jobs are skipped before the worker picks them up and running jobs are `.cancel()`-ed mid-flight; `run_generation` catches `CancelledError` and marks the row `failed` with a "cancelled" error. - **Legacy `data/` path prefix resolution** ([#440](https://github.com/jamiepine/voicebox/pull/440)) — generations stored with the old `data/` prefix under pre-0.4 installs now resolve correctly after the storage root moved, fixing 404s for historical audio. ###### Model Migration - Migration dialog no longer hangs when the cache is empty ([#439](https://github.com/jamiepine/voicebox/pull/439)) — the backend now emits a completion SSE event even when zero models are moved. - Storage-change flow surfaces a toast when there's nothing to migrate ([#433](https://github.com/jamiepine/voicebox/pull/433)) instead of proceeding with a no-op move and restarting the server. - Deleting all generations from a voice profile now deletes the associated version files and DB rows too ([#447](https://github.com/jamiepine/voicebox/pull/447)) — previously orphaned versions accumulated in storage. ###### Platform - **Linux system audio capture** ([#457](https://github.com/jamiepine/voicebox/pull/457)) — `cpal`'s ALSA backend doesn't expose PulseAudio/PipeWire monitor sources by name, so the previous device-name search never matched and silently fell back to the microphone. Detection now uses `pactl get-default-sink` + `pactl list short sources` and _[Truncated at 4000 characters — full notes: https://github.com/jamiepine/voicebox/releases/tag/v0.4.1]_ ### v0.4.0 - Date: 2026-04-16 - Version: v0.4.0 - Original notes: https://github.com/jamiepine/voicebox/releases/tag/v0.4.0 - Permalink: https://whatsnew.fyi/product/voicebox/releases/v0.4.0 - **added** — Added HumeAI TADA engine with tada-1b (English) and tada-3b-ml (multilingual) backends - **added** — Added Kokoro 82M engine with a new voice profile type system that distinguishes preset voices from cloned profiles - **added** — Added qwen-custom-voice preset engine backed by Qwen3-TTS - **added** — Added first-class Intel Arc (XPU) support across all PyTorch-based backends with device-aware seeding and XPU detection in the GPU status panel - **added** — Added check_cuda_compatibility() to compare the current device's compute capability against the bundled PyTorch's architecture list - **added** — Added gpu_compatibility_warning field to the health endpoint so the UI can surface GPU mismatches - **changed** — Replaced descript-audio-codec with a lightweight DAC shim to cut dependencies in HumeAI TADA - **changed** — Switched audio decoding to soundfile to sidestep torchcodec bundling issues in HumeAI TADA - **changed** — Upgraded the CUDA backend from cu126 to cu128 for RTX 50-series support - **changed** — Split CUDA backend into two independently versioned archives: a small server binary and a large libs archive, so upgrading no longer redownloads the ~4 GB of PyTorch/CUDA DLLs - **changed** — Voice profile grid now grey-outs unsupported profiles instead of filtering them, with all profiles always visible and a compatibility hint shown for unsupported ones - **changed** — Clicking a greyed-out profile now selects it AND switches the engine to a compatible one - **changed** — Instruct toggle is now conditionally exposed only for Qwen CustomVoice which was trained for instruction-based style control - **changed** — Supported profiles now sort first in the voice profile grid, and the grid scrolls the selected profile into view after engine or sort changes - **fixed** — Fixed tokenizer patch that was corrupting AutoTokenizer for other engines in HumeAI TADA - **fixed** — Fixed TorchScript error in frozen builds for HumeAI TADA - **fixed** — Fixed engine desync on tab navigation by initializing the form engine from the store - **fixed** — Fixed the disabled-and-selected card click edge case by bouncing selection to re-trigger auto-switch - **fixed** — Added asyncio.Lock around download_cuda_binary() so auto-update and manual download cannot race on the same temp file The biggest Voicebox release yet. Three new TTS engines bring the lineup to **seven** — HumeAI TADA, Kokoro 82M, and Qwen CustomVoice join Qwen3-TTS, LuxTTS, Chatterbox Multilingual, and Chatterbox Turbo. GPU support broadens to Intel Arc (XPU) and NVIDIA Blackwell (RTX 50-series), with runtime diagnostics that warn when your PyTorch build doesn't match your GPU. The CUDA backend is now split into independently versioned server and library archives, so upgrading no longer redownloads 4 GB of PyTorch/CUDA DLLs. This release also marks a big community moment: **13 new contributors** shipped fixes and features in 0.4.0. Thirty-plus bug fixes target the most-reported issues in the tracker — numpy 2.x TTS crashes, Windows background-server reliability, macOS 11 launch failures, audio playback silence, Stories clip-splitting races, history status staleness, and more. ###### New TTS Engines ###### HumeAI TADA — Expressive English & Multilingual ([#296](https://github.com/jamiepine/voicebox/pull/296)) - Added `tada-1b` (English) and `tada-3b-ml` (multilingual) backends - Replaced `descript-audio-codec` with a lightweight DAC shim to cut dependencies - Switched audio decoding to `soundfile` to sidestep `torchcodec` bundling issues - Redirected gated Llama tokenizer lookups to an ungated mirror so model loading works out of the box - Fixed tokenizer patch that was corrupting `AutoTokenizer` for other engines - Fixed TorchScript error in frozen builds ###### Kokoro 82M — Fast Lightweight TTS ([#325](https://github.com/jamiepine/voicebox/pull/325)) - Added Kokoro 82M engine with a new voice profile type system that distinguishes preset voices from cloned profiles - Profile grid now handles engine compatibility directly — removed redundant dropdown filtering - Tightened Kokoro profile handling so preset voices can't be edited like cloned profiles ###### Qwen CustomVoice ([#328](https://github.com/jamiepine/voicebox/pull/328)) - Added `qwen-custom-voice` preset engine backed by Qwen3-TTS - Enforced preset/profile engine compatibility across the generation flow - Floating generator now shows all engines instead of silently filtering ###### Voice Profile UX Until 0.4, every engine in Voicebox was a cloning model, so every voice profile was usable with every engine and the profile grid just showed them all. Introducing Kokoro and Qwen CustomVoice — which work from preset voices rather than cloned samples — broke that assumption for the first time. An early cut on `main` filtered the grid by the selected engine, which left users running pre-release builds thinking their cloned voices had vanished whenever they switched to a preset-only engine. This release ships the resolution before it ever reaches a tagged version: - **Grey-out instead of filter** — all profiles are always visible; unsupported ones render dimmed with a compatibility hint at the bottom of the grid - **Auto-switch on selection** — clicking a greyed-out profile selects it AND switches the engine to a compatible one, instead of silently doing nothing - **Instruct toggle restored for Qwen CustomVoice** — the floating generate box now reveals a delivery-instructions input (tone, emotion, pace) when CustomVoice is selected. Hidden across the board while the new multi-engine lineup was stabilizing because most engines don't honor the kwarg; now conditionally exposed only for the one engine that was actually trained for instruction-based style control - Supported profiles sort first; the grid scrolls the selected profile into view after engine/sort changes - Fixed engine desync on tab navigation — the form now initializes its engine from the store - Fixed the disabled-and-selected card click edge case by bouncing selection to re-trigger the auto-switch - Cleaned up scroll effect timers (requestAnimationFrame + setTimeout) to prevent stale DOM writes on unmount or rapid selection changes ###### GPU & Platform ###### Intel Arc (XPU) Sup _[Truncated at 4000 characters — full notes: https://github.com/jamiepine/voicebox/releases/tag/v0.4.0]_ ### v0.3.0 - Date: 2026-03-17 - Version: v0.3.0 - Original notes: https://github.com/jamiepine/voicebox/releases/tag/v0.3.0 - Permalink: https://whatsnew.fyi/product/voicebox/releases/v0.3.0 - **changed** — Rewrote backend into modular architecture with domain routers, services layer, and database package; reduced main.py from ~3,100 lines to ~10 - **changed** — Split settings into routed sub-pages: General, Generation, GPU, Logs, Changelog, About - **added** — Added live server log viewer with auto-scroll in settings - **added** — Added in-app changelog page that parses CHANGELOG.md at build time - **added** — Added About page with version info, license, and generation folder quick-open - **added** — Added model loading status indicator in UI - **added** — Added effects preset dropdown - **fixed** — Fixed audio player freezing during playback - **fixed** — Fixed sample uploads crashing the server by running audio decoding in thread pool instead of blocking async event loop - **fixed** — Fixed generation list not updating when a generation completes by switching to refetchQueries and adding SSE error fallback - **fixed** — Fixed error toasts showing [object Object] instead of actual error message - **fixed** — Fixed startup database session leak with proper rollback and cleanup in finally block - **fixed** — Fixed take-label race condition during regeneration - **fixed** — Fixed restart race condition during audio player regeneration - **fixed** — Fixed Docker build failure from pip hash mismatch on Qwen3-TTS dependencies - **fixed** — Handled client disconnects in SSE and streaming endpoints to suppress Broken Pipe errors - **fixed** — Replaced netstat with TcpStream and PowerShell for Windows port detection - **added** — Added Whisper model selection (base, small, medium, large, turbo) and expanded language support to /transcribe endpoint - **added** — Upgraded CUDA backend build from cu121 to cu126 for RTX 50-series GPU support - **changed** — Migrated documentation site from Mintlify to Fumadocs - **added** — Added 50 MB upload size limit with chunked reads to prevent unbounded memory allocation on sample uploads This release rewrites the backend into a modular architecture, overhauls the settings UI into routed sub-pages, fixes audio player freezing, migrates documentation to Fumadocs, and ships a batch of bug fixes targeting the most-reported issues from the tracker. The backend's 3,000-line monolith `main.py` has been decomposed into domain routers, a services layer, and a proper database package. A style guide and ruff configuration now enforce consistency. On the frontend, settings have been split into dedicated routed pages with server logs, a changelog viewer, and an about page. The audio player no longer freezes mid-playback, and model loading status is now visible in the UI. Seven user-reported bugs have been fixed, including server crashes during sample uploads, generation list staleness, cryptic error messages, and CUDA support for RTX 50-series GPUs. ###### Settings Overhaul ([#294](https://github.com/jamiepine/voicebox/pull/294)) - Split settings into routed sub-tabs: General, Generation, GPU, Logs, Changelog, About - Added live server log viewer with auto-scroll - Added in-app changelog page that parses `CHANGELOG.md` at build time - Added About page with version info, license, and generation folder quick-open - Extracted reusable `SettingRow` component for consistent setting layouts ###### Audio Player Fix ([#293](https://github.com/jamiepine/voicebox/pull/293)) - Fixed audio player freezing during playback - Improved playback UX with better state management and listener cleanup - Fixed restart race condition during regeneration - Added stable keys for audio element re-rendering - Improved accessibility across player controls ###### Backend Refactor ([#285](https://github.com/jamiepine/voicebox/pull/285)) - Extracted all routes from `main.py` into 13 domain routers under `backend/routes/` — `main.py` dropped from ~3,100 lines to ~10 - Moved CRUD and service modules into `backend/services/`, platform detection into `backend/utils/` - Split monolithic `database.py` into a `database/` package with separate `models`, `session`, `migrations`, and `seed` modules - Added `backend/STYLE_GUIDE.md` and `pyproject.toml` with ruff linting config - Removed dead code: unused `_get_cuda_dll_excludes`, stale `studio.py`, `example_usage.py`, old `Makefile` - Deduplicated shared logic across TTS backends into `backends/base.py` - Improved startup logging with version, platform, data directory, and database stats - Fixed startup database session leak — sessions now rollback and close in `finally` block - Isolated shutdown unload calls so one backend failure doesn't block the others - Handled null duration in `story_items` migration - Reject model migration when target is a subdirectory of source cache ###### Documentation Rewrite ([#288](https://github.com/jamiepine/voicebox/pull/288)) - Migrated docs site from Mintlify to Fumadocs (Next.js-based) - Rewrote introduction and root page with content from README - Added "Edit on GitHub" links and last-updated timestamps on all pages - Generated OpenAPI spec and auto-generated API reference pages - Removed stale planning docs (`CUDA_BACKEND_SWAP`, `EXTERNAL_PROVIDERS`, `MLX_AUDIO`, `TTS_PROVIDER_ARCHITECTURE`, etc.) - Sidebar groups now expand by default; root redirects to `/docs` - Added OG image metadata and `/og` preview page ###### UI & Frontend - Added model loading status indicator and effects preset dropdown ([3187344](https://github.com/jamiepine/voicebox/commit/3187344)) - Fixed take-label race condition during regeneration - Added accessible focus styling to select component - Softened select focus indicator opacity - Addressed 4 critical and 12 major issues from CodeRabbit review ###### Bug Fixes ([#295](https://github.com/jamiepine/voicebox/pull/295)) - Fixed sample uploads crashing the server — audio decoding now runs in a thread pool instead of blocking the async event loop ([#278](https://github.com/jamiepine/voicebox/issues/ _[Truncated at 4000 characters — full notes: https://github.com/jamiepine/voicebox/releases/tag/v0.3.0]_ ### v0.2.3 - Date: 2026-03-15 - Version: v0.2.3 - Original notes: https://github.com/jamiepine/voicebox/releases/tag/v0.2.3 - Permalink: https://whatsnew.fyi/product/voicebox/releases/v0.2.3 - **fixed** — Model downloading and loading now work correctly in PyInstaller bundled builds for Chatterbox, Chatterbox Turbo, and LuxTTS - **fixed** — Real-time download progress bars now function in production builds by force-enabling huggingface_hub's internal counter regardless of logger level - **fixed** — Upgraded Python to 3.12.13 to resolve Python 3.12.0 code.replace() bug that caused NameError crashes during scipy/torch imports in macOS builds - **fixed** — Collect all inflect files to fix LuxTTS 'could not get source code' error caused by typeguard's @typechecked decorator - **fixed** — Collect all perth files to bundle the pretrained watermark model needed by Chatterbox at runtime - **fixed** — Collect all piper_phonemize files to bundle espeak-ng-data for LuxTTS text-to-phoneme conversion - **fixed** — Set ESPEAK_DATA_PATH in frozen builds so the espeak-ng C library finds bundled data - **fixed** — Collect all linacodec files to fix inspect.getsource error in Vocos codec - **fixed** — Collect all zipvoice files to fix source code lookup in LuxTTS voice cloning - **fixed** — Copy metadata for requests, transformers, huggingface-hub, tokenizers, safetensors, and tqdm to fix importlib.metadata lookups in frozen binary - **added** — Add hidden imports for chatterbox, chatterbox_turbo, luxtts, and zipvoice backends - **added** — Add multiprocessing.freeze_support() to fix resource_tracker subprocess crash in frozen binary - **changed** — Apply --noconsole only on Windows; macOS and Linux retain stdout/stderr for Tauri sidecar log capture - **fixed** — Harden sys.stdout/sys.stderr devnull redirect to test writability instead of just None check - **fixed** — Fix updater artifact generation with v1Compatible for tauri-action signature files - **changed** — Update tauri-action to v0.6 to fix updater JSON and .sig generation - **fixed** — Include full traceback logging on all backend model loading errors instead of just str(e) The "it works in dev but not in prod" release. This version fixes a series of PyInstaller bundling issues that prevented model downloading, loading, generation, and progress tracking from working in production builds. ###### Model Downloads Now Actually Work The v0.2.1/v0.2.2 builds could not download or load models that weren't already cached from a dev install. This release fixes the entire chain: - **Chatterbox, Chatterbox Turbo, and LuxTTS** all download, load, and generate correctly in bundled builds - **Real-time download progress** — byte-level progress bars now work in production. The root cause: `huggingface_hub` silently disables tqdm progress bars based on logger level, which prevented our progress tracker from receiving byte updates. We now force-enable the internal counter regardless. - **Fixed Python 3.12.0 `code.replace()` bug** — the macOS build was on Python 3.12.0, which has a [known CPython bug](https://github.com/pyinstaller/pyinstaller/issues/7992) that corrupts bytecode when PyInstaller rewrites code objects. This caused `NameError: name 'obj' is not defined` crashes during scipy/torch imports. Upgraded to Python 3.12.13. ###### PyInstaller Fixes - Collect all `inflect` files — `typeguard`'s `@typechecked` decorator calls `inspect.getsource()` at import time, which needs `.py` source files, not just bytecode. Fixes LuxTTS "could not get source code" error. - Collect all `perth` files — bundles the pretrained watermark model (`hparams.yaml`, `.pth.tar`) needed by Chatterbox at runtime - Collect all `piper_phonemize` files — bundles `espeak-ng-data/` (phoneme tables, language dicts) needed by LuxTTS for text-to-phoneme conversion - Set `ESPEAK_DATA_PATH` in frozen builds so the espeak-ng C library finds the bundled data instead of looking at `/usr/share/espeak-ng-data/` - Collect all `linacodec` files — fixes `inspect.getsource` error in Vocos codec - Collect all `zipvoice` files — fixes source code lookup in LuxTTS voice cloning - Copy metadata for `requests`, `transformers`, `huggingface-hub`, `tokenizers`, `safetensors`, `tqdm` — fixes `importlib.metadata` lookups in frozen binary - Add hidden imports for `chatterbox`, `chatterbox_turbo`, `luxtts`, `zipvoice` backends - Add `multiprocessing.freeze_support()` to fix resource_tracker subprocess crash in frozen binary - `--noconsole` now only applied on Windows — macOS/Linux need stdout/stderr for Tauri sidecar log capture - Hardened `sys.stdout`/`sys.stderr` devnull redirect to test writability, not just `None` check ###### Updater - Fixed updater artifact generation with `v1Compatible` for `tauri-action` signature files - Updated `tauri-action` to v0.6 to fix updater JSON and `.sig` generation ###### Other Fixes - Full traceback logging on all backend model loading errors (was just `str(e)` before) ### v0.2.2 - Date: 2026-03-15 - Version: v0.2.2 - Original notes: https://github.com/jamiepine/voicebox/releases/tag/v0.2.2 - Permalink: https://whatsnew.fyi/product/voicebox/releases/v0.2.2 - **fixed** — Fix Chatterbox model support in bundled builds - **fixed** — Fix LuxTTS/ZipVoice support in bundled builds - **added** — Auto-update CUDA binary when app version changes - **added** — Add CUDA download progress bar - **fixed** — Fix server process staying alive on macOS with SIGHUP handling and watchdog grace period - **changed** — Hide console window when running CUDA binary on Windows UPDATE: I'm working on a rewrite of the model downloading, it's absolute hell and takes a while to test as it always works in dev and never in prod builds. Will have a solution up ASAP. If you're eager to test 0.2.x please compile from source. Next update will solve model downloading and the updater issue for good. ##### v0.2.2 - Fix Chatterbox model support in bundled builds [SIKE fixed in 0.2.3] - Fix LuxTTS/ZipVoice support in bundled builds [SIKE fixed in 0.2.3] - Auto-update CUDA binary when app version changes - CUDA download progress bar - Fix server process staying alive on macOS (SIGHUP handling, watchdog grace period) - Hide console window when running CUDA binary on Windows