From 8d550a5f7cc2e785659a009487f63a487749d581 Mon Sep 17 00:00:00 2001 From: James Pine Date: Sat, 18 Apr 2026 15:15:58 -0700 Subject: [PATCH] =?UTF-8?q?Bump=20version:=200.4.0=20=E2=86=92=200.4.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- CHANGELOG.md | 43 ++++++++++++++++++++++++++++++++- app/package.json | 2 +- backend/__init__.py | 2 +- landing/package.json | 2 +- package.json | 2 +- tauri/package.json | 2 +- tauri/src-tauri/Cargo.toml | 2 +- tauri/src-tauri/tauri.conf.json | 2 +- web/package.json | 2 +- 10 files changed, 51 insertions(+), 10 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index d1c8fe39..712065af 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.4.0 +current_version = 0.4.1 commit = True tag = True tag_name = v{new_version} diff --git a/CHANGELOG.md b/CHANGELOG.md index cef190b9..eb1f8690 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,46 @@ ## [Unreleased] +## [0.4.1] - 2026-04-18 + +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 routes via `PULSE_SOURCE`, with the name-based search retained as a fallback when `pactl` is absent. + +### Frontend CI +- First PR-time quality gate ([#418](https://github.com/jamiepine/voicebox/pull/418)) — new `.github/workflows/ci.yml` runs `bun run typecheck` + `bun run build:web` on every PR. Fixed pre-existing type issues that were being suppressed with `@ts-expect-error`, cleaned up a dep-array typo (`[platform.metadata.isTauricheckOnMountcheckForUpdates]`) in `useAutoUpdater`, and removed 100+ lines of dead `ModelItem` code from `ModelManagement.tsx`. +- Follow-up: widened `apiClient.migrateModels()` return type to include `moved` and `errors` so the storage-change handler typechecks against the real backend response ([#470](https://github.com/jamiepine/voicebox/pull/470)). + +### Docs +- Clarified in the Quick Start + README that paralinguistic tags (`[laugh]`, `[sigh]`) only work with Chatterbox Turbo; other engines read them as literal text ([#450](https://github.com/jamiepine/voicebox/pull/450)). + +### New Contributors +- [@Bortlesboat](https://github.com/Bortlesboat) — generation cancellation (#444) +- [@gaojulong](https://github.com/gaojulong) — migration dialog hang fix (#439) +- [@fuleinist](https://github.com/fuleinist) — migration no-op toast (#433) +- [@erionjuniordeandrade-a11y](https://github.com/erionjuniordeandrade-a11y) — frontend CI + type hardening (#418) +- [@estefrac](https://github.com/estefrac) — Linux pactl system-audio capture (#457) + ## [0.4.0] - 2026-04-16 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. @@ -555,7 +595,8 @@ The first public release of Voicebox — an open-source voice synthesis studio p Tauri v2, React, TypeScript, Tailwind CSS, FastAPI, Qwen3-TTS, Whisper, SQLite -[Unreleased]: https://github.com/jamiepine/voicebox/compare/v0.4.0...HEAD +[Unreleased]: https://github.com/jamiepine/voicebox/compare/v0.4.1...HEAD +[0.4.1]: https://github.com/jamiepine/voicebox/compare/v0.4.0...v0.4.1 [0.4.0]: https://github.com/jamiepine/voicebox/compare/v0.3.0...v0.4.0 [0.3.0]: https://github.com/jamiepine/voicebox/compare/v0.2.3...v0.3.0 [0.2.3]: https://github.com/jamiepine/voicebox/compare/v0.2.2...v0.2.3 diff --git a/app/package.json b/app/package.json index c10654e8..2db75bd7 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "@voicebox/app", - "version": "0.4.0", + "version": "0.4.1", "private": true, "type": "module", "scripts": { diff --git a/backend/__init__.py b/backend/__init__.py index 57ecb187..7b2089a7 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -1,3 +1,3 @@ # Backend package -__version__ = "0.4.0" +__version__ = "0.4.1" diff --git a/landing/package.json b/landing/package.json index f52f9eae..372c8d97 100644 --- a/landing/package.json +++ b/landing/package.json @@ -1,6 +1,6 @@ { "name": "@voicebox/landing", - "version": "0.4.0", + "version": "0.4.1", "description": "Landing page for voicebox.sh", "scripts": { "dev": "bun --bun next dev --turbo", diff --git a/package.json b/package.json index bf3cb741..222131e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "voicebox", - "version": "0.4.0", + "version": "0.4.1", "private": true, "workspaces": [ "app", diff --git a/tauri/package.json b/tauri/package.json index 893a0e0d..5bf4625d 100644 --- a/tauri/package.json +++ b/tauri/package.json @@ -1,7 +1,7 @@ { "name": "@voicebox/tauri", "private": true, - "version": "0.4.0", + "version": "0.4.1", "type": "module", "scripts": { "dev": "vite", diff --git a/tauri/src-tauri/Cargo.toml b/tauri/src-tauri/Cargo.toml index 330f2354..797d9525 100644 --- a/tauri/src-tauri/Cargo.toml +++ b/tauri/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "voicebox" -version = "0.4.0" +version = "0.4.1" description = "A production-quality desktop app for Qwen3-TTS voice cloning and generation" authors = ["you"] license = "" diff --git a/tauri/src-tauri/tauri.conf.json b/tauri/src-tauri/tauri.conf.json index 3e0b9e44..b0485897 100644 --- a/tauri/src-tauri/tauri.conf.json +++ b/tauri/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Voicebox", - "version": "0.4.0", + "version": "0.4.1", "identifier": "sh.voicebox.app", "build": { "beforeDevCommand": "bun run dev", diff --git a/web/package.json b/web/package.json index 6b8fa8d8..3bf02c99 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "@voicebox/web", "private": true, - "version": "0.4.0", + "version": "0.4.1", "type": "module", "scripts": { "dev": "vite",