diff --git a/.agents/skills/add-tts-engine/SKILL.md b/.agents/skills/add-tts-engine/SKILL.md index b28a73f..939dbd1 100644 --- a/.agents/skills/add-tts-engine/SKILL.md +++ b/.agents/skills/add-tts-engine/SKILL.md @@ -1,13 +1,13 @@ --- name: add-tts-engine -description: Use this skill to add a new TTS engine to Voicebox. It walks through dependency research, backend implementation, frontend wiring, PyInstaller bundling, and frozen-build testing. Always start with Phase 0 (dependency audit) before writing any code. +description: Use this skill to add a new TTS engine to TalkBox. It walks through dependency research, backend implementation, frontend wiring, PyInstaller bundling, and frozen-build testing. Always start with Phase 0 (dependency audit) before writing any code. --- # Add TTS Engine ## Goal -Integrate a new text-to-speech engine into Voicebox end-to-end: dependency research, backend protocol implementation, frontend UI wiring, PyInstaller bundling, and frozen-build verification. The user should only need to test the final build locally. +Integrate a new text-to-speech engine into TalkBox end-to-end: dependency research, backend protocol implementation, frontend UI wiring, PyInstaller bundling, and frozen-build verification. The user should only need to test the final build locally. ## Reference Doc diff --git a/.agents/skills/draft-release-notes/SKILL.md b/.agents/skills/draft-release-notes/SKILL.md index b844c70..f8a8f77 100644 --- a/.agents/skills/draft-release-notes/SKILL.md +++ b/.agents/skills/draft-release-notes/SKILL.md @@ -65,7 +65,7 @@ Tie it to concrete shipped changes. No vague hype.> ### - Bullet points with specifics -- Reference PRs where available: ([#123](https://github.com/jamiepine/voicebox/pull/123)) +- Reference PRs where available: ([#123](https://github.com/jamiepine/talkbox/pull/123)) ### - ... diff --git a/.agents/skills/release-bump/SKILL.md b/.agents/skills/release-bump/SKILL.md index 8b52f87..7ec0bfc 100644 --- a/.agents/skills/release-bump/SKILL.md +++ b/.agents/skills/release-bump/SKILL.md @@ -53,8 +53,8 @@ Finalize the changelog draft, bump the version across all tracked files, and cre - Add a new link for the new version ```markdown - [Unreleased]: https://github.com/jamiepine/voicebox/compare/vX.Y.Z...HEAD - [X.Y.Z]: https://github.com/jamiepine/voicebox/compare/vPREVIOUS...vX.Y.Z + [Unreleased]: https://github.com/jamiepine/talkbox/compare/vX.Y.Z...HEAD + [X.Y.Z]: https://github.com/jamiepine/talkbox/compare/vPREVIOUS...vX.Y.Z ``` 4. **Stage the changelog.** diff --git a/.agents/skills/triage-prs/SKILL.md b/.agents/skills/triage-prs/SKILL.md index 2b83b94..fcfc346 100644 --- a/.agents/skills/triage-prs/SKILL.md +++ b/.agents/skills/triage-prs/SKILL.md @@ -30,7 +30,7 @@ This skill pairs with `draft-release-notes` and `release-bump`: triage first, th ```bash git worktree list # check for stale ones first git worktree prune -git worktree add ../voicebox-pr-review -b pr-review- main +git worktree add ../talkbox-pr-review -b pr-review- main ``` Keep the main worktree for release-prep work (changelog drafts, direct-to-main follow-ups). Keep the review worktree for `gh pr checkout` — each checkout moves HEAD to a contributor branch, which you don't want to do in the main worktree. @@ -121,7 +121,7 @@ For each PR in the tier-1 / tier-2 list: **a. Checkout in the review worktree:** ```bash -cd ../voicebox-pr-review +cd ../talkbox-pr-review git checkout pr-review- # reset to neutral base gh pr checkout ``` diff --git a/.gitignore b/.gitignore index 853c506..1a5ab93 100644 Binary files a/.gitignore and b/.gitignore differ diff --git a/.mcp.json b/.mcp.json index de6d6ca..24f1add 100644 --- a/.mcp.json +++ b/.mcp.json @@ -1,10 +1,10 @@ { "mcpServers": { - "voicebox": { + "talkbox": { "type": "http", - "url": "http://127.0.0.1:17493/mcp", + "url": "http://127.0.0.1:17494/mcp", "headers": { - "X-Voicebox-Client-Id": "claude-code" + "X-TalkBox-Client-Id": "claude-code" } } } diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b03f5e..83216bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,13 +18,13 @@ ## [0.5.0] - 2026-04-22 -**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. +**The Capture release.** TalkBox 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. ### 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. +- **Auto-paste into the focused app.** Once transcription finishes, TalkBox 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. @@ -38,20 +38,20 @@ Voice profiles now carry an optional **personality** — a free-form description 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. +**API surface.** `POST /generate`, `POST /speak`, and the MCP `talkbox.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: +TalkBox ships a built-in **Model Context Protocol** server at `http://127.0.0.1:17494/mcp` so Claude Code, Cursor, Windsurf, Cline, VS Code MCP extensions — any MCP-aware agent — can call into your local TalkBox 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. -- **`voicebox.list_captures`** — recent captures with their transcripts -- **`voicebox.list_profiles`** — available voice profiles (cloned + preset) +- **`talkbox.speak`** — speak text in any voice profile, with optional `personality: true` to run through the profile's personality LLM first +- **`talkbox.transcribe`** — Whisper transcription of a base64 blob or an absolute local path. Path mode is restricted to loopback callers so a TalkBox bound on `0.0.0.0` doesn't double as an unauthenticated arbitrary-local-file read primitive. +- **`talkbox.list_captures`** — recent captures with their transcripts +- **`talkbox.list_profiles`** — available voice profiles (cloned + preset) -- **Streamable HTTP as primary transport.** Cursor / Windsurf / VS Code / Claude Code all support it out of the box — drop a `mcpServers` block with the URL and an `X-Voicebox-Client-Id` header. -- **Stdio shim for clients that don't speak HTTP MCP.** A `voicebox-mcp` binary ships inside the app bundle as a Tauri sidecar. The Settings page renders the install snippet with the right absolute path pre-filled. -- **Per-client voice binding.** Pin Claude Code to Morgan, Cursor to Scarlett, Cline to its own voice — the `X-Voicebox-Client-Id` header resolves to a bound voice whenever `speak` is called without an explicit `profile`. Managed in **Settings → MCP**. +- **Streamable HTTP as primary transport.** Cursor / Windsurf / VS Code / Claude Code all support it out of the box — drop a `mcpServers` block with the URL and an `X-TalkBox-Client-Id` header. +- **Stdio shim for clients that don't speak HTTP MCP.** A `talkbox-mcp` binary ships inside the app bundle as a Tauri sidecar. The Settings page renders the install snippet with the right absolute path pre-filled. +- **Per-client voice binding.** Pin Claude Code to Morgan, Cursor to Scarlett, Cline to its own voice — the `X-TalkBox-Client-Id` header resolves to a bound voice whenever `speak` is called without an explicit `profile`. Managed in **Settings → MCP**. - **Profile resolution precedence.** Explicit `profile` arg (name or id, case-insensitive) → per-client binding → global default from `capture_settings.default_playback_voice_id` → error with a pointer to Settings. - **Speaking pill.** Agent-initiated speech surfaces the same on-screen pill as dictation, in a `speaking` state with the profile name and an elapsed timer. Silent background TTS is a trust hazard — the pill always shows what's coming out of your machine. - **`POST /speak` REST wrapper.** Same code path and voice resolution for shell scripts, ACP, A2A, GitHub Actions, or anything else that isn't MCP-native. @@ -59,7 +59,7 @@ Voicebox ships a built-in **Model Context Protocol** server at `http://127.0.0.1 **Claude Code one-liner:** ``` -claude mcp add voicebox --transport http --url http://127.0.0.1:17493/mcp --header "X-Voicebox-Client-Id: claude-code" +claude mcp add talkbox --transport http --url http://127.0.0.1:17494/mcp --header "X-TalkBox-Client-Id: claude-code" ``` ### Refinement @@ -103,11 +103,11 @@ Same dictation flow on Windows. Right-hand default chord (Ctrl+Shift) avoids Alt ## [0.4.5] - 2026-04-22 -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. +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/talkbox/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. +- **Load no longer fails with "offline mode is enabled"** ([#530](https://github.com/jamiepine/talkbox/pull/530), fixes [#526](https://github.com/jamiepine/talkbox/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. ## [0.4.4] - 2026-04-21 @@ -116,27 +116,27 @@ Hotfix for a regression in 0.4.3 where generation and transcription could fail o ### 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. +- **Inference no longer fails with "offline mode is enabled" while online** ([#524](https://github.com/jamiepine/talkbox/pull/524), reverts the inference-path guards from [#503](https://github.com/jamiepine/talkbox/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/talkbox/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. ## [0.4.3] - 2026-04-20 -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. +A patch focused on two user-impacting reliability fixes: macOS DMG notarization (unblocks `brew install talkbox` 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. +- **DMGs are now notarized and stapled** ([#523](https://github.com/jamiepine/talkbox/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/talkbox/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/`. +- **Kokoro Japanese voices no longer crash on fresh installs** ([#521](https://github.com/jamiepine/talkbox/pull/521), fixes [#514](https://github.com/jamiepine/talkbox/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/`. ## [0.4.2] - 2026-04-20 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)) +### Internationalization ([#508](https://github.com/jamiepine/talkbox/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. @@ -145,23 +145,23 @@ This release localizes the entire app. English, Simplified Chinese (zh-CN), Trad - **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. +- **`HF_HUB_OFFLINE` now guards every inference path** ([#503](https://github.com/jamiepine/talkbox/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/talkbox/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/talkbox/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/talkbox/pull/486), closes [#41](https://github.com/jamiepine/talkbox/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/talkbox/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)). +- **New `/download` page** ([#487](https://github.com/jamiepine/talkbox/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/talkbox/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/talkbox/pull/484)) — stale single-engine assumptions removed. +- **Three more tutorials + mobile navbar / hero CTA fixes** ([#483](https://github.com/jamiepine/talkbox/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 steps stay in the workflow so re-enabling is a one-line change once we identify the hang. Next release will take another pass. +- **Still not shipping.** The re-enable attempt ([#488](https://github.com/jamiepine/talkbox/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 steps stay in the workflow so re-enabling is a one-line change once we identify the hang. Next release will take another pass. ### New Contributors -- [@shekharyv](https://github.com/shekharyv) — download redirects behind reverse proxies ([#498](https://github.com/jamiepine/voicebox/pull/498)) +- [@shekharyv](https://github.com/shekharyv) — download redirects behind reverse proxies ([#498](https://github.com/jamiepine/talkbox/pull/498)) ## [0.4.1] - 2026-04-18 @@ -169,7 +169,7 @@ A fast follow-up to 0.4.0 focused on making the new engines actually load in the 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)) +### Frozen-Binary Reliability ([#438](https://github.com/jamiepine/talkbox/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 @@ -178,23 +178,23 @@ A fast follow-up to 0.4.0 focused on making the new engines actually load in the - `.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. +- **Cancel queued or running generations** ([#444](https://github.com/jamiepine/talkbox/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/talkbox/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. +- Migration dialog no longer hangs when the cache is empty ([#439](https://github.com/jamiepine/talkbox/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/talkbox/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/talkbox/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. +- **Linux system audio capture** ([#457](https://github.com/jamiepine/talkbox/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)). +- First PR-time quality gate ([#418](https://github.com/jamiepine/talkbox/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/talkbox/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)). +- 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/talkbox/pull/450)). ### New Contributors - [@Bortlesboat](https://github.com/Bortlesboat) — generation cancellation (#444) @@ -205,13 +205,13 @@ A fast follow-up to 0.4.0 focused on making the new engines actually load in the ## [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. +The biggest TalkBox 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)) +#### HumeAI TADA — Expressive English & Multilingual ([#296](https://github.com/jamiepine/talkbox/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 @@ -219,19 +219,19 @@ This release also marks a big community moment: **13 new contributors** shipped - 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)) +#### Kokoro 82M — Fast Lightweight TTS ([#325](https://github.com/jamiepine/talkbox/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)) +#### Qwen CustomVoice ([#328](https://github.com/jamiepine/talkbox/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. +Until 0.4, every engine in TalkBox 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: @@ -245,72 +245,72 @@ This release ships the resolution before it ever reaches a tagged version: ### GPU & Platform -#### Intel Arc (XPU) Support ([#320](https://github.com/jamiepine/voicebox/pull/320)) +#### Intel Arc (XPU) Support ([#320](https://github.com/jamiepine/talkbox/pull/320)) - First-class Intel Arc support across all PyTorch-based backends - Device-aware seeding, XPU detection in the GPU status panel, and setup flow detection - Reports correct device name and VRAM in settings -#### Blackwell / RTX 50-series Support ([#316](https://github.com/jamiepine/voicebox/pull/316), [#401](https://github.com/jamiepine/voicebox/pull/401)) +#### Blackwell / RTX 50-series Support ([#316](https://github.com/jamiepine/talkbox/pull/316), [#401](https://github.com/jamiepine/talkbox/pull/401)) - Upgraded the CUDA backend from cu126 → cu128 for RTX 50-series support - Added `sm_120+PTX` to the CUDA build via `TORCH_CUDA_ARCH_LIST` for forward-compatibility with Blackwell architectures (closes 5 open reports: #386, #395, #396, #399, #400) - GPU settings UI fixes around install/uninstall state -#### GPU Compatibility Diagnostics ([#367](https://github.com/jamiepine/voicebox/pull/367), adapted) +#### GPU Compatibility Diagnostics ([#367](https://github.com/jamiepine/talkbox/pull/367), adapted) - New `check_cuda_compatibility()` compares the current device's compute capability against the bundled PyTorch's architecture list - Health endpoint exposes a `gpu_compatibility_warning` field so the UI can surface mismatches - Startup logs a `WARN` when the installed PyTorch build doesn't support the detected GPU - GPU status label shows `[UNSUPPORTED - see logs]` — no more silent "no kernel image" failures -#### Split CUDA Backend ([#298](https://github.com/jamiepine/voicebox/pull/298)) +#### Split CUDA Backend ([#298](https://github.com/jamiepine/talkbox/pull/298)) - CUDA backend now ships as two independently versioned archives: a small server binary and a large libs archive (the ~4 GB of PyTorch/CUDA DLLs) -- Upgrading Voicebox no longer redownloads the libs archive when only the server binary changed -- Added `asyncio.Lock` around `download_cuda_binary()` so auto-update and manual download can't race on the same temp file ([#428](https://github.com/jamiepine/voicebox/pull/428)) +- Upgrading TalkBox no longer redownloads the libs archive when only the server binary changed +- Added `asyncio.Lock` around `download_cuda_binary()` so auto-update and manual download can't race on the same temp file ([#428](https://github.com/jamiepine/talkbox/pull/428)) - Updated `package_cuda.py` for PyInstaller 6.18 onedir layout - Temp archives are always cleaned up on failure, even when the install aborts mid-extract ### Bug Fixes #### Critical: TTS Generation -- **numpy 2.x `torch.from_numpy` crash** ([#361](https://github.com/jamiepine/voicebox/pull/361)) — torch compiled against numpy 1.x ABI fails silently when paired with numpy 2.x, causing `RuntimeError: Numpy is not available` / `Unable to create tensor` on every TTS request in bundled macOS Intel / Rosetta builds. Pinned `numpy<2.0` in requirements and added a PyInstaller runtime hook with a `ctypes.memmove` fallback as belt-and-suspenders. Hardened afterward to raise on unknown dtypes instead of silently reinterpreting bytes as float32. +- **numpy 2.x `torch.from_numpy` crash** ([#361](https://github.com/jamiepine/talkbox/pull/361)) — torch compiled against numpy 1.x ABI fails silently when paired with numpy 2.x, causing `RuntimeError: Numpy is not available` / `Unable to create tensor` on every TTS request in bundled macOS Intel / Rosetta builds. Pinned `numpy<2.0` in requirements and added a PyInstaller runtime hook with a `ctypes.memmove` fallback as belt-and-suspenders. Hardened afterward to raise on unknown dtypes instead of silently reinterpreting bytes as float32. #### Platform Reliability -- **Windows background server** ([#402](https://github.com/jamiepine/voicebox/pull/402)) — "keep server running after close" now actually keeps the server running. The HTTP `/watchdog/disable` request could lose the race against process exit on Windows; added a `.keep-running` sentinel file as a synchronous fallback, with stale-sentinel cleanup on startup to avoid orphan server processes -- **macOS 11 launch crash** ([#424](https://github.com/jamiepine/voicebox/pull/424)) — weak-linked ScreenCaptureKit so the app can launch on macOS < 12.3 instead of crashing at dyld resolution. Gated system audio capture behind a real `sw_vers` version check so unsupported systems cleanly advertise "not available" rather than crashing at runtime -- **macOS Intel (x86_64) setup** ([#416](https://github.com/jamiepine/voicebox/pull/416)) — relaxed `torch>=2.7.0` → `torch>=2.2.0`. PyTorch dropped pre-built x86_64 wheels after 2.2.2, so Intel Mac devs could no longer `pip install`. Now resolves to the latest compatible torch per platform -- **Offline model loading** ([#318](https://github.com/jamiepine/voicebox/pull/318)) — Qwen TTS and Whisper force offline mode when loading cached models, so startup works without network access -- **GUI startup with external server** ([#319](https://github.com/jamiepine/voicebox/pull/319)) — fixed GUI launch when pointed at a remote/external server, and added data refresh on server switch; hardened health validation and error handling -- **Qwen3-TTS cache split on Windows** (adapted from [#218](https://github.com/jamiepine/voicebox/pull/218)) — route `Qwen3TTSModel.from_pretrained` through `hf_constants.HF_HUB_CACHE` so the speech tokenizer and `preprocessor_config.json` resolve from a single cache root -- **Qwen3-TTS bundling** ([#305](https://github.com/jamiepine/voicebox/pull/305)) — bundle `qwen_tts` source files in the PyInstaller build to fix `inspect.getsource` errors in frozen builds -- **Backend import paths** ([#345](https://github.com/jamiepine/voicebox/pull/345)) — moved lazy imports to top-level with absolute paths to resolve the "Failed to Save" preset error caused by `ModuleNotFoundError` in production builds -- **Effects service import** ([#384](https://github.com/jamiepine/voicebox/pull/384)) — fixed `ModuleNotFoundError` on preset create/update by switching to relative imports (#349) +- **Windows background server** ([#402](https://github.com/jamiepine/talkbox/pull/402)) — "keep server running after close" now actually keeps the server running. The HTTP `/watchdog/disable` request could lose the race against process exit on Windows; added a `.keep-running` sentinel file as a synchronous fallback, with stale-sentinel cleanup on startup to avoid orphan server processes +- **macOS 11 launch crash** ([#424](https://github.com/jamiepine/talkbox/pull/424)) — weak-linked ScreenCaptureKit so the app can launch on macOS < 12.3 instead of crashing at dyld resolution. Gated system audio capture behind a real `sw_vers` version check so unsupported systems cleanly advertise "not available" rather than crashing at runtime +- **macOS Intel (x86_64) setup** ([#416](https://github.com/jamiepine/talkbox/pull/416)) — relaxed `torch>=2.7.0` → `torch>=2.2.0`. PyTorch dropped pre-built x86_64 wheels after 2.2.2, so Intel Mac devs could no longer `pip install`. Now resolves to the latest compatible torch per platform +- **Offline model loading** ([#318](https://github.com/jamiepine/talkbox/pull/318)) — Qwen TTS and Whisper force offline mode when loading cached models, so startup works without network access +- **GUI startup with external server** ([#319](https://github.com/jamiepine/talkbox/pull/319)) — fixed GUI launch when pointed at a remote/external server, and added data refresh on server switch; hardened health validation and error handling +- **Qwen3-TTS cache split on Windows** (adapted from [#218](https://github.com/jamiepine/talkbox/pull/218)) — route `Qwen3TTSModel.from_pretrained` through `hf_constants.HF_HUB_CACHE` so the speech tokenizer and `preprocessor_config.json` resolve from a single cache root +- **Qwen3-TTS bundling** ([#305](https://github.com/jamiepine/talkbox/pull/305)) — bundle `qwen_tts` source files in the PyInstaller build to fix `inspect.getsource` errors in frozen builds +- **Backend import paths** ([#345](https://github.com/jamiepine/talkbox/pull/345)) — moved lazy imports to top-level with absolute paths to resolve the "Failed to Save" preset error caused by `ModuleNotFoundError` in production builds +- **Effects service import** ([#384](https://github.com/jamiepine/talkbox/pull/384)) — fixed `ModuleNotFoundError` on preset create/update by switching to relative imports (#349) #### Audio & Playback -- **cpal stream silent playback** ([#405](https://github.com/jamiepine/voicebox/pull/405)) — `cpal::Stream` was dropped on function return immediately after `play()`, causing every playback to fall silent. Now holds the stream until either the buffer drains or the stop flag fires (#404) +- **cpal stream silent playback** ([#405](https://github.com/jamiepine/talkbox/pull/405)) — `cpal::Stream` was dropped on function return immediately after `play()`, causing every playback to fall silent. Now holds the stream until either the buffer drains or the stop flag fires (#404) #### Stories & History -- **Clip-splitting race** ([#403](https://github.com/jamiepine/voicebox/pull/403)) — rapid double-clicks on split could race through `split_story_item` with inconsistent state. Added `with_for_update()` row locking on the backend and an `isPending` guard on the frontend (#366) -- **History `status` staleness** ([#394](https://github.com/jamiepine/voicebox/pull/394)) — `GET /history/{id}` was hardcoding `status="completed"` regardless of the DB row, breaking any client polling for job completion. Now returns `status`, `error`, `engine`, `model_size`, and `is_favorited` from the actual row -- **"Clear failed" bulk button** ([#412](https://github.com/jamiepine/voicebox/pull/412)) — new `DELETE /history/failed` endpoint and a header strip showing `"N failed generations"` with a Clear button, complementing the per-row trash icon added in #321 (#410) -- **Delete failed generations** ([#321](https://github.com/jamiepine/voicebox/pull/321)) — added a trash icon next to the retry button so failed entries can be cleaned up without having to retry first +- **Clip-splitting race** ([#403](https://github.com/jamiepine/talkbox/pull/403)) — rapid double-clicks on split could race through `split_story_item` with inconsistent state. Added `with_for_update()` row locking on the backend and an `isPending` guard on the frontend (#366) +- **History `status` staleness** ([#394](https://github.com/jamiepine/talkbox/pull/394)) — `GET /history/{id}` was hardcoding `status="completed"` regardless of the DB row, breaking any client polling for job completion. Now returns `status`, `error`, `engine`, `model_size`, and `is_favorited` from the actual row +- **"Clear failed" bulk button** ([#412](https://github.com/jamiepine/talkbox/pull/412)) — new `DELETE /history/failed` endpoint and a header strip showing `"N failed generations"` with a Clear button, complementing the per-row trash icon added in #321 (#410) +- **Delete failed generations** ([#321](https://github.com/jamiepine/talkbox/pull/321)) — added a trash icon next to the retry button so failed entries can be cleaned up without having to retry first #### Security & Safety -- **Voice prompt cache hardening** ([#429](https://github.com/jamiepine/voicebox/pull/429)) — `torch.load(weights_only=True)` on cached voice prompts per PyTorch 2.6 recommendation; replaced string-based SPA path guard with `Path.is_relative_to()` for more robust path-traversal protection +- **Voice prompt cache hardening** ([#429](https://github.com/jamiepine/talkbox/pull/429)) — `torch.load(weights_only=True)` on cached voice prompts per PyTorch 2.6 recommendation; replaced string-based SPA path guard with `Path.is_relative_to()` for more robust path-traversal protection #### Infrastructure & Docker -- **Docker web build** ([#344](https://github.com/jamiepine/voicebox/pull/344)) — include `CHANGELOG.md` in the Docker web build so the in-app changelog page works in Docker deployments -- **Docker numba cache** ([#425](https://github.com/jamiepine/voicebox/pull/425)) — set `NUMBA_CACHE_DIR` in docker-compose so numba can write its JIT cache in container runtime (#308) -- **Relative media paths** ([#332](https://github.com/jamiepine/voicebox/pull/332)) — media paths now stored relative to the configured data dir rather than resolved against CWD, so the data directory is portable between installs +- **Docker web build** ([#344](https://github.com/jamiepine/talkbox/pull/344)) — include `CHANGELOG.md` in the Docker web build so the in-app changelog page works in Docker deployments +- **Docker numba cache** ([#425](https://github.com/jamiepine/talkbox/pull/425)) — set `NUMBA_CACHE_DIR` in docker-compose so numba can write its JIT cache in container runtime (#308) +- **Relative media paths** ([#332](https://github.com/jamiepine/talkbox/pull/332)) — media paths now stored relative to the configured data dir rather than resolved against CWD, so the data directory is portable between installs ### Developer Tooling - New `triage-prs` agent skill — encodes the end-to-end PR-speedrun workflow (classification → triage doc → rebase → squash-merge → follow-ups) so future release cycles can reproduce it - Rewrote the TTS engine guide with the patterns learned from adding TADA and Kokoro - Added the API refactor plan and CUDA libs addon design doc -- Fixed broken links in the Get Started section ([#332](https://github.com/jamiepine/voicebox/pull/332)) +- Fixed broken links in the Get Started section ([#332](https://github.com/jamiepine/talkbox/pull/332)) ### New Contributors -Huge thank you to everyone who contributed their first PR to Voicebox in this release: +Huge thank you to everyone who contributed their first PR to TalkBox in this release: [@liorshahverdi](https://github.com/liorshahverdi), [@nicoschtein](https://github.com/nicoschtein), [@ArfianID](https://github.com/ArfianID), [@aimaaaimaa](https://github.com/aimaaaimaa), [@maxmcoding](https://github.com/maxmcoding), [@Khalodddd](https://github.com/Khalodddd), [@LuisSambrano](https://github.com/LuisSambrano), [@shaun0927](https://github.com/shaun0927), [@malletfils](https://github.com/malletfils), [@mvanhorn](https://github.com/mvanhorn), [@kuishou68](https://github.com/kuishou68), [@txhno](https://github.com/txhno), [@MukundaKatta](https://github.com/MukundaKatta) @@ -320,21 +320,21 @@ This release rewrites the backend into a modular architecture, overhauls the set 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)) +### Settings Overhaul ([#294](https://github.com/jamiepine/talkbox/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)) +### Audio Player Fix ([#293](https://github.com/jamiepine/talkbox/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)) +### Backend Refactor ([#285](https://github.com/jamiepine/talkbox/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 @@ -347,7 +347,7 @@ The backend's 3,000-line monolith `main.py` has been decomposed into domain rout - 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)) +### Documentation Rewrite ([#288](https://github.com/jamiepine/talkbox/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 @@ -357,25 +357,25 @@ The backend's 3,000-line monolith `main.py` has been decomposed into domain rout - 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)) +- Added model loading status indicator and effects preset dropdown ([3187344](https://github.com/jamiepine/talkbox/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/278)) -- Fixed generation list not updating when a generation completes — switched to `refetchQueries` for reliable cache busting, added SSE error fallback, and page reset on completion ([#231](https://github.com/jamiepine/voicebox/issues/231)) -- Fixed error toasts showing `[object Object]` instead of the actual error message ([#290](https://github.com/jamiepine/voicebox/issues/290)) -- Added Whisper model selection (`base`, `small`, `medium`, `large`, `turbo`) and expanded language support to the `/transcribe` endpoint ([#233](https://github.com/jamiepine/voicebox/issues/233)) -- Upgraded CUDA backend build from cu121 to cu126 for RTX 50-series (Blackwell) GPU support ([#289](https://github.com/jamiepine/voicebox/issues/289)) -- Handled client disconnects in SSE and streaming endpoints to suppress `[Errno 32] Broken Pipe` errors ([#248](https://github.com/jamiepine/voicebox/issues/248)) -- Fixed Docker build failure from pip hash mismatch on Qwen3-TTS dependencies ([#286](https://github.com/jamiepine/voicebox/issues/286)) +### Bug Fixes ([#295](https://github.com/jamiepine/talkbox/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/talkbox/issues/278)) +- Fixed generation list not updating when a generation completes — switched to `refetchQueries` for reliable cache busting, added SSE error fallback, and page reset on completion ([#231](https://github.com/jamiepine/talkbox/issues/231)) +- Fixed error toasts showing `[object Object]` instead of the actual error message ([#290](https://github.com/jamiepine/talkbox/issues/290)) +- Added Whisper model selection (`base`, `small`, `medium`, `large`, `turbo`) and expanded language support to the `/transcribe` endpoint ([#233](https://github.com/jamiepine/talkbox/issues/233)) +- Upgraded CUDA backend build from cu121 to cu126 for RTX 50-series (Blackwell) GPU support ([#289](https://github.com/jamiepine/talkbox/issues/289)) +- Handled client disconnects in SSE and streaming endpoints to suppress `[Errno 32] Broken Pipe` errors ([#248](https://github.com/jamiepine/talkbox/issues/248)) +- Fixed Docker build failure from pip hash mismatch on Qwen3-TTS dependencies ([#286](https://github.com/jamiepine/talkbox/issues/286)) - Added 50 MB upload size limit with chunked reads to prevent unbounded memory allocation on sample uploads - Eliminated redundant double audio decode in sample processing pipeline ### Platform Fixes -- Replaced `netstat` with `TcpStream` + PowerShell for Windows port detection ([#277](https://github.com/jamiepine/voicebox/pull/277)) +- Replaced `netstat` with `TcpStream` + PowerShell for Windows port detection ([#277](https://github.com/jamiepine/talkbox/pull/277)) - Fixed Docker frontend build and cleaned up Docker docs - Fixed macOS download links to use `.dmg` instead of `.app.tar.gz` - Added dynamic download redirect routes to landing site @@ -431,13 +431,13 @@ The v0.2.1/v0.2.2 builds could not download or load models that weren't already ## [0.2.1] - 2026-03-15 -Voicebox v0.1.x was a single-engine voice cloning app built around Qwen3-TTS. v0.2.0 is a ground-up rethink: four TTS engines, 23 languages, paralinguistic emotion controls, a post-processing effects pipeline, unlimited generation length, an async generation queue, and support for every major GPU vendor. Plus Docker. +TalkBox v0.1.x was a single-engine voice cloning app built around Qwen3-TTS. v0.2.0 is a ground-up rethink: four TTS engines, 23 languages, paralinguistic emotion controls, a post-processing effects pipeline, unlimited generation length, an async generation queue, and support for every major GPU vendor. Plus Docker. ### New TTS Engines #### Multi-Engine Architecture -Voicebox now runs **four independent TTS engines** behind a thread-safe per-engine backend registry. Switch engines per-generation from a single dropdown — no restart required. +TalkBox now runs **four independent TTS engines** behind a thread-safe per-engine backend registry. Switch engines per-generation from a single dropdown — no restart required. | Engine | Languages | Size | Key Strengths | | --------------------------- | --------- | ------- | --------------------------------------------- | @@ -447,25 +447,25 @@ Voicebox now runs **four independent TTS engines** behind a thread-safe per-engi | **Chatterbox Multilingual** | 23 | ~3.2 GB | Broadest language coverage, zero-shot cloning | | **Chatterbox Turbo** | English | ~1.5 GB | 350M params, low latency, paralinguistic tags | -#### Chatterbox Multilingual — 23 Languages ([#257](https://github.com/jamiepine/voicebox/pull/257)) +#### Chatterbox Multilingual — 23 Languages ([#257](https://github.com/jamiepine/talkbox/pull/257)) Zero-shot voice cloning in Arabic, Chinese, Danish, Dutch, English, Finnish, French, German, Greek, Hebrew, Hindi, Italian, Japanese, Korean, Malay, Norwegian, Polish, Portuguese, Russian, Spanish, Swahili, Swedish, and Turkish. -#### LuxTTS — Lightweight English TTS ([#254](https://github.com/jamiepine/voicebox/pull/254)) +#### LuxTTS — Lightweight English TTS ([#254](https://github.com/jamiepine/talkbox/pull/254)) A fast, CPU-friendly English engine. ~300 MB download, 48 kHz output, runs at 150x realtime on CPU. -#### Chatterbox Turbo — Expressive English ([#258](https://github.com/jamiepine/voicebox/pull/258)) +#### Chatterbox Turbo — Expressive English ([#258](https://github.com/jamiepine/talkbox/pull/258)) A fast 350M-parameter English model with inline paralinguistic tags. -#### Paralinguistic Tags Autocomplete ([#265](https://github.com/jamiepine/voicebox/pull/265)) +#### Paralinguistic Tags Autocomplete ([#265](https://github.com/jamiepine/talkbox/pull/265)) Type `/` in the text input with Chatterbox Turbo selected to open an autocomplete for **9 expressive tags**: `[laugh]` `[chuckle]` `[gasp]` `[cough]` `[sigh]` `[groan]` `[sniff]` `[shush]` `[clear throat]` ### Generation -#### Unlimited Generation Length — Auto-Chunking ([#266](https://github.com/jamiepine/voicebox/pull/266)) +#### Unlimited Generation Length — Auto-Chunking ([#266](https://github.com/jamiepine/talkbox/pull/266)) Long text is now automatically split at sentence boundaries, generated per-chunk, and crossfaded back together. Engine-agnostic. @@ -474,7 +474,7 @@ Long text is now automatically split at sentence boundaries, generated per-chunk - Max text length raised to 50,000 characters - Smart splitting respects abbreviations, CJK punctuation, and `[tags]` -#### Asynchronous Generation Queue ([#269](https://github.com/jamiepine/voicebox/pull/269)) +#### Asynchronous Generation Queue ([#269](https://github.com/jamiepine/talkbox/pull/269)) Generation is now fully non-blocking. Serial execution queue prevents GPU contention. Real-time SSE status streaming. @@ -482,42 +482,42 @@ Generation is now fully non-blocking. Serial execution queue prevents GPU conten Every generation now supports multiple versions with provenance tracking — original, effects versions, takes, source tracking, version pinning in stories, and favorites. -### Post-Processing Effects ([#271](https://github.com/jamiepine/voicebox/pull/271)) +### Post-Processing Effects ([#271](https://github.com/jamiepine/talkbox/pull/271)) A full audio effects system powered by Spotify's `pedalboard` library: Pitch Shift, Reverb, Delay, Chorus/Flanger, Compressor, Gain, High-Pass Filter, Low-Pass Filter. 4 built-in presets, custom presets, per-profile default effects, and live preview. ### Platform Support -- **Windows Support** ([#272](https://github.com/jamiepine/voicebox/pull/272)) — Full Windows support with CUDA GPU detection -- **Linux** ([#262](https://github.com/jamiepine/voicebox/pull/262)) — AMD ROCm, NVIDIA GBM fix, WebKitGTK mic access (build from source) -- **NVIDIA CUDA Backend Swap** ([#252](https://github.com/jamiepine/voicebox/pull/252)) — Download and swap in CUDA backend from within the app +- **Windows Support** ([#272](https://github.com/jamiepine/talkbox/pull/272)) — Full Windows support with CUDA GPU detection +- **Linux** ([#262](https://github.com/jamiepine/talkbox/pull/262)) — AMD ROCm, NVIDIA GBM fix, WebKitGTK mic access (build from source) +- **NVIDIA CUDA Backend Swap** ([#252](https://github.com/jamiepine/talkbox/pull/252)) — Download and swap in CUDA backend from within the app - **Intel Arc (XPU) and DirectML** — PyTorch backend supports Intel Arc and DirectML -- **Docker + Web Deployment** ([#161](https://github.com/jamiepine/voicebox/pull/161)) — 3-stage build, non-root runtime, health checks +- **Docker + Web Deployment** ([#161](https://github.com/jamiepine/talkbox/pull/161)) — 3-stage build, non-root runtime, health checks - **Whisper Turbo** — Added `openai/whisper-large-v3-turbo` as a transcription model option -### Model Management ([#268](https://github.com/jamiepine/voicebox/pull/268)) +### Model Management ([#268](https://github.com/jamiepine/talkbox/pull/268)) -Per-model unload, custom models directory, model folder migration, download cancel/clear UI ([#238](https://github.com/jamiepine/voicebox/pull/238)), restructured settings UI. +Per-model unload, custom models directory, model folder migration, download cancel/clear UI ([#238](https://github.com/jamiepine/talkbox/pull/238)), restructured settings UI. ### Security & Reliability -- CORS hardening ([#88](https://github.com/jamiepine/voicebox/pull/88)) -- Network access toggle ([#133](https://github.com/jamiepine/voicebox/pull/133)) -- Offline crash fix ([#152](https://github.com/jamiepine/voicebox/pull/152)) -- Atomic audio saves ([#263](https://github.com/jamiepine/voicebox/pull/263)) +- CORS hardening ([#88](https://github.com/jamiepine/talkbox/pull/88)) +- Network access toggle ([#133](https://github.com/jamiepine/talkbox/pull/133)) +- Offline crash fix ([#152](https://github.com/jamiepine/talkbox/pull/152)) +- Atomic audio saves ([#263](https://github.com/jamiepine/talkbox/pull/263)) - Filesystem health endpoint -- Chatterbox float64 dtype fix ([#264](https://github.com/jamiepine/voicebox/pull/264)) +- Chatterbox float64 dtype fix ([#264](https://github.com/jamiepine/talkbox/pull/264)) -### Accessibility ([#243](https://github.com/jamiepine/voicebox/pull/243)) +### Accessibility ([#243](https://github.com/jamiepine/talkbox/pull/243)) Screen reader support, keyboard navigation, state-aware `aria-label` attributes on all interactive controls. ### UI Polish -- Redesigned landing page ([#274](https://github.com/jamiepine/voicebox/pull/274)) +- Redesigned landing page ([#274](https://github.com/jamiepine/talkbox/pull/274)) - Voices tab overhaul with inline inspector - Responsive layout improvements -- Duplicate profile name validation ([#175](https://github.com/jamiepine/voicebox/pull/175)) +- Duplicate profile name validation ([#175](https://github.com/jamiepine/talkbox/pull/175)) ### Community Contributors @@ -527,25 +527,25 @@ Screen reader support, keyboard navigation, state-aware `aria-label` attributes ### Stability and reliability -- [#95](https://github.com/jamiepine/voicebox/pull/95) Fix: selecting 0.6B model still downloads and uses 1.7B -- [#93](https://github.com/jamiepine/voicebox/pull/93) fix(mlx): bundle native libs and broaden error handling for Apple Silicon -- [#79](https://github.com/jamiepine/voicebox/pull/79) fix: handle non-ASCII filenames in Content-Disposition headers -- [#78](https://github.com/jamiepine/voicebox/pull/78) fix: guard getUserMedia call against undefined mediaDevices in non-secure contexts -- [#77](https://github.com/jamiepine/voicebox/pull/77) fix: await for confirmation before deleting voices and channels -- [#128](https://github.com/jamiepine/voicebox/pull/128) fix: resolve multiple issues (#96, #119, #111, #108, #121, #125, #127) -- [#40](https://github.com/jamiepine/voicebox/pull/40) Fix: audio export path resolution +- [#95](https://github.com/jamiepine/talkbox/pull/95) Fix: selecting 0.6B model still downloads and uses 1.7B +- [#93](https://github.com/jamiepine/talkbox/pull/93) fix(mlx): bundle native libs and broaden error handling for Apple Silicon +- [#79](https://github.com/jamiepine/talkbox/pull/79) fix: handle non-ASCII filenames in Content-Disposition headers +- [#78](https://github.com/jamiepine/talkbox/pull/78) fix: guard getUserMedia call against undefined mediaDevices in non-secure contexts +- [#77](https://github.com/jamiepine/talkbox/pull/77) fix: await for confirmation before deleting voices and channels +- [#128](https://github.com/jamiepine/talkbox/pull/128) fix: resolve multiple issues (#96, #119, #111, #108, #121, #125, #127) +- [#40](https://github.com/jamiepine/talkbox/pull/40) Fix: audio export path resolution ### Build and packaging -- [#122](https://github.com/jamiepine/voicebox/pull/122) fix(web): add @tailwindcss/vite plugin to web config -- [#126](https://github.com/jamiepine/voicebox/pull/126) Create requirements.txt +- [#122](https://github.com/jamiepine/talkbox/pull/122) fix(web): add @tailwindcss/vite plugin to web config +- [#126](https://github.com/jamiepine/talkbox/pull/126) Create requirements.txt ### UX and docs -- [#44](https://github.com/jamiepine/voicebox/pull/44) Enhances floating generate box UX -- [#57](https://github.com/jamiepine/voicebox/pull/57) chore: updates repo URL in README -- [#146](https://github.com/jamiepine/voicebox/pull/146) Add Spacebot banner to landing page -- [#1](https://github.com/jamiepine/voicebox/pull/1) Improvements +- [#44](https://github.com/jamiepine/talkbox/pull/44) Enhances floating generate box UX +- [#57](https://github.com/jamiepine/talkbox/pull/57) chore: updates repo URL in README +- [#146](https://github.com/jamiepine/talkbox/pull/146) Add Spacebot banner to landing page +- [#1](https://github.com/jamiepine/talkbox/pull/1) Improvements ## [0.1.12] - 2026-01-31 @@ -691,7 +691,7 @@ Fixed recording length limit at 0:29 to auto stop instead of passing the limit a ### Server Management -- Changed default URL from `localhost:8000` to `127.0.0.1:17493` +- Changed default URL from `localhost:8000` to `127.0.0.1:17494` - Server reuse logic, "keep server running" preference, orphaned process handling ### Build & Release @@ -707,7 +707,7 @@ Fixed recording length limit at 0:29 to auto stop instead of passing the limit a ## [0.1.0] - 2026-01-27 -The first public release of Voicebox — an open-source voice synthesis studio powered by Qwen3-TTS. +The first public release of TalkBox — an open-source voice synthesis studio powered by Qwen3-TTS. ### Voice Cloning with Qwen3-TTS @@ -751,28 +751,28 @@ The first public release of Voicebox — an open-source voice synthesis studio p Tauri v2, React, TypeScript, Tailwind CSS, FastAPI, Qwen3-TTS, Whisper, SQLite -[0.5.0]: https://github.com/jamiepine/voicebox/compare/v0.4.5...v0.5.0 -[0.4.5]: https://github.com/jamiepine/voicebox/compare/v0.4.4...v0.4.5 -[0.4.4]: https://github.com/jamiepine/voicebox/compare/v0.4.3...v0.4.4 -[0.4.3]: https://github.com/jamiepine/voicebox/compare/v0.4.2...v0.4.3 -[0.4.2]: https://github.com/jamiepine/voicebox/compare/v0.4.1...v0.4.2 -[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 -[0.2.2]: https://github.com/jamiepine/voicebox/compare/v0.2.1...v0.2.2 -[0.2.1]: https://github.com/jamiepine/voicebox/compare/v0.1.13...v0.2.1 -[0.1.13]: https://github.com/jamiepine/voicebox/compare/v0.1.12...v0.1.13 -[0.1.12]: https://github.com/jamiepine/voicebox/compare/v0.1.11...v0.1.12 -[0.1.11]: https://github.com/jamiepine/voicebox/compare/v0.1.10...v0.1.11 -[0.1.10]: https://github.com/jamiepine/voicebox/compare/v0.1.9...v0.1.10 -[0.1.9]: https://github.com/jamiepine/voicebox/compare/v0.1.8...v0.1.9 -[0.1.8]: https://github.com/jamiepine/voicebox/compare/v0.1.7...v0.1.8 -[0.1.7]: https://github.com/jamiepine/voicebox/compare/v0.1.6...v0.1.7 -[0.1.6]: https://github.com/jamiepine/voicebox/compare/v0.1.5...v0.1.6 -[0.1.5]: https://github.com/jamiepine/voicebox/compare/v0.1.4...v0.1.5 -[0.1.4]: https://github.com/jamiepine/voicebox/compare/v0.1.3...v0.1.4 -[0.1.3]: https://github.com/jamiepine/voicebox/compare/v0.1.2...v0.1.3 -[0.1.2]: https://github.com/jamiepine/voicebox/compare/v0.1.1...v0.1.2 -[0.1.1]: https://github.com/jamiepine/voicebox/compare/v0.1.0...v0.1.1 -[0.1.0]: https://github.com/jamiepine/voicebox/releases/tag/v0.1.0 +[0.5.0]: https://github.com/jamiepine/talkbox/compare/v0.4.5...v0.5.0 +[0.4.5]: https://github.com/jamiepine/talkbox/compare/v0.4.4...v0.4.5 +[0.4.4]: https://github.com/jamiepine/talkbox/compare/v0.4.3...v0.4.4 +[0.4.3]: https://github.com/jamiepine/talkbox/compare/v0.4.2...v0.4.3 +[0.4.2]: https://github.com/jamiepine/talkbox/compare/v0.4.1...v0.4.2 +[0.4.1]: https://github.com/jamiepine/talkbox/compare/v0.4.0...v0.4.1 +[0.4.0]: https://github.com/jamiepine/talkbox/compare/v0.3.0...v0.4.0 +[0.3.0]: https://github.com/jamiepine/talkbox/compare/v0.2.3...v0.3.0 +[0.2.3]: https://github.com/jamiepine/talkbox/compare/v0.2.2...v0.2.3 +[0.2.2]: https://github.com/jamiepine/talkbox/compare/v0.2.1...v0.2.2 +[0.2.1]: https://github.com/jamiepine/talkbox/compare/v0.1.13...v0.2.1 +[0.1.13]: https://github.com/jamiepine/talkbox/compare/v0.1.12...v0.1.13 +[0.1.12]: https://github.com/jamiepine/talkbox/compare/v0.1.11...v0.1.12 +[0.1.11]: https://github.com/jamiepine/talkbox/compare/v0.1.10...v0.1.11 +[0.1.10]: https://github.com/jamiepine/talkbox/compare/v0.1.9...v0.1.10 +[0.1.9]: https://github.com/jamiepine/talkbox/compare/v0.1.8...v0.1.9 +[0.1.8]: https://github.com/jamiepine/talkbox/compare/v0.1.7...v0.1.8 +[0.1.7]: https://github.com/jamiepine/talkbox/compare/v0.1.6...v0.1.7 +[0.1.6]: https://github.com/jamiepine/talkbox/compare/v0.1.5...v0.1.6 +[0.1.5]: https://github.com/jamiepine/talkbox/compare/v0.1.4...v0.1.5 +[0.1.4]: https://github.com/jamiepine/talkbox/compare/v0.1.3...v0.1.4 +[0.1.3]: https://github.com/jamiepine/talkbox/compare/v0.1.2...v0.1.3 +[0.1.2]: https://github.com/jamiepine/talkbox/compare/v0.1.1...v0.1.2 +[0.1.1]: https://github.com/jamiepine/talkbox/compare/v0.1.0...v0.1.1 +[0.1.0]: https://github.com/jamiepine/talkbox/releases/tag/v0.1.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9b30070..d42bb03 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ -# Contributing to Voicebox +# Contributing to TalkBox -Thank you for your interest in contributing to Voicebox! This document provides guidelines and instructions for contributing. +Thank you for your interest in contributing to TalkBox! This document provides guidelines and instructions for contributing. ## Code of Conduct @@ -36,8 +36,8 @@ Thank you for your interest in contributing to Voicebox! This document provides Install [just](https://github.com/casey/just) (`brew install just`, `cargo install just`, or `winget install Casey.Just`), then: ```bash -git clone https://github.com/YOUR_USERNAME/voicebox.git -cd voicebox +git clone https://github.com/YOUR_USERNAME/talkbox.git +cd talkbox just setup # creates venv, installs Python + JS deps just dev # starts backend + desktop app @@ -91,7 +91,7 @@ On Windows, to build with CUDA support for local testing: just build-local # Build CPU + CUDA server binaries + Tauri installer ``` -This builds the CPU sidecar (bundled with the app), the CUDA binary (placed in `%APPDATA%/sh.voicebox.app/backends/` for runtime GPU switching), and the installable Tauri app. +This builds the CPU sidecar (bundled with the app), the CUDA binary (placed in `%APPDATA%/sh.talkbox.app/backends/` for runtime GPU switching), and the installable Tauri app. Creates platform-specific installers (`.dmg`, `.msi`, `.AppImage`) in `tauri/src-tauri/target/release/bundle/`. @@ -235,7 +235,7 @@ def create_profile(name, language): ## Project Structure ``` -voicebox/ +talkbox/ ├── app/ # Shared React frontend │ └── src/ │ ├── components/ # UI components @@ -365,7 +365,7 @@ See [docs/content/docs/overview/troubleshooting.mdx](docs/content/docs/overview/ - **Backend won't start:** Check Python version (3.11+), ensure venv is activated, install dependencies - **Tauri build fails:** Ensure Rust is installed, clean build with `cd tauri/src-tauri && cargo clean` -- **OpenAPI client generation fails:** Ensure backend is running, check `curl http://localhost:17493/openapi.json` +- **OpenAPI client generation fails:** Ensure backend is running, check `curl http://localhost:17494/openapi.json` ## Questions? @@ -389,4 +389,4 @@ By contributing, you agree that your contributions will be licensed under the MI --- -Thank you for contributing to Voicebox! 🎉 +Thank you for contributing to TalkBox! 🎉 diff --git a/Dockerfile b/Dockerfile index e1340a2..7db2182 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # ============================================================ -# Voicebox — Local TTS Server with Web UI +# TalkBox — Local TTS Server with Web UI # 3-stage build: Frontend → Python deps → Runtime # # Build variants: @@ -71,8 +71,8 @@ RUN pip install --no-cache-dir --prefix=/install \ FROM python:3.11-slim # Create non-root user; the entrypoint joins GPU device groups at runtime. -RUN groupadd -r voicebox && \ - useradd -r -g voicebox -m -s /bin/bash voicebox +RUN groupadd -r talkbox && \ + useradd -r -g talkbox -m -s /bin/bash talkbox WORKDIR /app @@ -87,27 +87,27 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY --from=backend-builder /install /usr/local # Copy backend application code -COPY --chown=voicebox:voicebox backend/ /app/backend/ +COPY --chown=talkbox:talkbox backend/ /app/backend/ # Copy built frontend from frontend stage -COPY --from=frontend --chown=voicebox:voicebox /build/web/dist /app/frontend/ +COPY --from=frontend --chown=talkbox:talkbox /build/web/dist /app/frontend/ # Create data directories owned by non-root user RUN mkdir -p /app/data/generations /app/data/profiles /app/data/cache \ - && chown -R voicebox:voicebox /app/data + && chown -R talkbox:talkbox /app/data # Expose the API port -EXPOSE 17493 +EXPOSE 17494 # Health check — auto-restart if the server hangs HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=60s \ - CMD curl -f http://localhost:17493/health || exit 1 + CMD curl -f http://localhost:17494/health || exit 1 -# Entrypoint joins GPU groups then drops to the voicebox user. +# Entrypoint joins GPU groups then drops to the talkbox user. # Normalize CRLF (a Windows checkout otherwise leaves the shebang as # `#!/bin/sh\r`, which Linux can't resolve — reported as a misleading # "no such file or directory" even though the file exists). COPY --chmod=755 scripts/rocm-entrypoint.sh /usr/local/bin/entrypoint.sh RUN sed -i 's/\r$//' /usr/local/bin/entrypoint.sh ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] -CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "17493"] +CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "17494"] diff --git a/LICENSE b/LICENSE index 5eea3a0..4cc9524 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2026 Voicebox Contributors +Copyright (c) 2026 TalkBox Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index b1ee81f..a9fc77e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@

- Voicebox + TalkBox

-

Voicebox

+

TalkBox

The open-source AI voice studio.
@@ -11,30 +11,30 @@

- - Downloads + + Downloads - - Release + + Release - - Stars + + Stars - - License + + License - + Ask DeepWiki

- jamiepine%2Fvoicebox | Trendshift + jamiepine%2Ftalkbox | Trendshift

- voicebox.sh • - Docs • + talkbox.sh • + DocsDownloadFeaturesAPI • @@ -44,32 +44,32 @@

- - Voicebox App Screenshot + + TalkBox App Screenshot

- Click the image above to watch the demo video on voicebox.sh + Click the image above to watch the demo video on talkbox.sh


- Voicebox Screenshot 2 + TalkBox Screenshot 2

- Voicebox Screenshot 3 + TalkBox Screenshot 3


-## What is Voicebox? +## What is TalkBox? -Voicebox is a **local-first AI voice studio** — a free and open-source alternative to **ElevenLabs** and **WisprFlow** in one app. Clone voices from a few seconds of audio, generate speech in 23 languages across 7 TTS engines, dictate into any text field with a global hotkey, and give any MCP-aware AI agent a voice of your choosing. +TalkBox is a **local-first AI voice studio** — a free and open-source alternative to **ElevenLabs** and **WisprFlow** in one app. Clone voices from a few seconds of audio, generate speech in 23 languages across 7 TTS engines, dictate into any text field with a global hotkey, and give any MCP-aware AI agent a voice of your choosing. -The two cloud incumbents sit on opposite halves of the voice I/O loop — ElevenLabs on output, WisprFlow on input. Voicebox does both, bridges them with a bundled local LLM for refinement and per-profile personas, and runs the whole thing on your machine. +The two cloud incumbents sit on opposite halves of the voice I/O loop — ElevenLabs on output, WisprFlow on input. TalkBox does both, bridges them with a bundled local LLM for refinement and per-profile personas, and runs the whole thing on your machine. - **Complete privacy** — models, voice data, and captures never leave your machine - **7 TTS engines** — Qwen3-TTS, Qwen CustomVoice, LuxTTS, Chatterbox Multilingual, Chatterbox Turbo, HumeAI TADA, and Kokoro @@ -80,7 +80,7 @@ The two cloud incumbents sit on opposite halves of the voice I/O loop — Eleven - **Unlimited length** — auto-chunking with crossfade for scripts, articles, and chapters - **Stories editor** — multi-track timeline for conversations, podcasts, and narratives - **Voice input** — global dictation hotkey with push-to-talk and toggle modes, accessibility-verified auto-paste on macOS, in-app mic on every text field, Whisper-based STT -- **Agent voice output** — one tool call (`voicebox.speak`) and any MCP-aware agent (Claude Code, Cursor, Cline) speaks to you in a voice you've cloned +- **Agent voice output** — one tool call (`talkbox.speak`) and any MCP-aware agent (Claude Code, Cursor, Cline) speaks to you in a voice you've cloned - **Voice personalities** — attach a free-form persona to any voice profile, then Compose, Rewrite, or Respond via a bundled local LLM — agents can invoke the same modes over MCP - **API-first** — REST API plus a built-in MCP server for integrating voice I/O into your own apps and agents - **Native performance** — built with Tauri (Rust), not Electron @@ -92,14 +92,14 @@ The two cloud incumbents sit on opposite halves of the voice I/O loop — Eleven | Platform | Download | | --------------------- | ------------------------------------------------------ | -| macOS (Apple Silicon) | [Download DMG](https://voicebox.sh/download/mac-arm) | -| macOS (Intel) | [Download DMG](https://voicebox.sh/download/mac-intel) | -| Windows | [Download MSI](https://voicebox.sh/download/windows) | +| macOS (Apple Silicon) | [Download DMG](https://talkbox.sh/download/mac-arm) | +| macOS (Intel) | [Download DMG](https://talkbox.sh/download/mac-intel) | +| Windows | [Download MSI](https://talkbox.sh/download/windows) | | Docker | `docker compose up` | -> **[View all binaries →](https://github.com/jamiepine/voicebox/releases/latest)** +> **[View all binaries →](https://github.com/jamiepine/talkbox/releases/latest)** -> **Linux** — Pre-built binaries are not yet available. See [voicebox.sh/linux-install](https://voicebox.sh/linux-install) for build-from-source instructions. +> **Linux** — Pre-built binaries are not yet available. See [talkbox.sh/linux-install](https://talkbox.sh/linux-install) for build-from-source instructions. > **Having trouble?** See the [Troubleshooting Guide](docs/content/docs/overview/troubleshooting.mdx) for common install, generation, model-download, and GPU issues. @@ -196,18 +196,18 @@ Multi-voice timeline editor for conversations, podcasts, and narratives. ### Global Dictation & Voice Input -The other half of the voice I/O loop. Hold a hotkey anywhere on your system, speak, release — on macOS the transcript pastes straight into the focused text field. Or hit the mic on any Voicebox text input and dictate directly into the app. +The other half of the voice I/O loop. Hold a hotkey anywhere on your system, speak, release — on macOS the transcript pastes straight into the focused text field. Or hit the mic on any TalkBox text input and dictate directly into the app. - **Configurable chord bindings** — hold-to-speak and tap-to-toggle chords, each rebindable in the in-app chord picker. Holding push-to-talk and tapping `Space` mid-hold upgrades into a toggle session without a gap in audio - **Target-aware paste (macOS)** — accessibility-verified injection into the focused text field, with atomic clipboard save/restore so your clipboard isn't clobbered - **First-run permissions UX** — in-app gates walk you through the macOS Accessibility and Input Monitoring grants with deep-links to System Settings -- **In-app mic button** on every Voicebox text field — generation form, profile descriptions, story titles, anywhere you'd type +- **In-app mic button** on every TalkBox text field — generation form, profile descriptions, story titles, anywhere you'd type - **LLM refinement** — optional cleanup of ums, stutters, and false starts before paste - **On-screen pill** — floating overlay surfacing `recording`, `transcribing`, `refining`, and `speaking` states. Same pill agents use when they speak to you, so there's one mental model for both directions of the loop ### Speech-to-Text -Voicebox runs OpenAI Whisper for transcription — the same model that backs dictation, the Captures tab, and the `/transcribe` API. Running on MLX (Apple Silicon) or PyTorch (CUDA / ROCm / DirectML / CPU) depending on your platform. +TalkBox runs OpenAI Whisper for transcription — the same model that backs dictation, the Captures tab, and the `/transcribe` API. Running on MLX (Apple Silicon) or PyTorch (CUDA / ROCm / DirectML / CPU) depending on your platform. | Size | Notes | | ----------------------------- | -------------------------------------------------- | @@ -224,7 +224,7 @@ Every dictation, in-app recording, and uploaded audio file lands in the Captures - **Edit inline** — tweak the transcript and save on blur - **Play as voice profile** — turn any capture into speech with a cloned voice, one click - **Promote to voice sample** — use a capture's audio + transcript as a reference sample on any voice profile -- **Local capture storage** — original audio and transcript stay in your Voicebox data directory, with a folder shortcut in Settings +- **Local capture storage** — original audio and transcript stay in your TalkBox data directory, with a folder shortcut in Settings ### Agent Voice Output @@ -232,7 +232,7 @@ Every agent gets a voice. One tool call and any MCP-aware agent can speak to you ```ts // In any MCP-aware agent: -await voicebox.speak({ +await talkbox.speak({ text: "Deploy complete.", profile: "Morgan", }); @@ -243,7 +243,7 @@ Also exposed as `POST /speak` for anything that doesn't speak MCP — ACP, A2A, - **Bidirectional pill** — `recording`, `transcribing`, `refining`, and `speaking` are all states of the same OS-level overlay, so dictation and agent speech share one surface - **Per-agent voice binding** — in **Settings → MCP**, pin Claude Code to Morgan and Cursor to Scarlett so you can tell which agent is talking without looking. Each client's `last_seen_at` timestamp confirms the install actually took - **Always visible** — no silent background TTS; every agent-initiated speak surfaces the pill with the voice profile name for the full duration -- **HTTP + stdio transports** — install as a URL in Claude Code / Cursor / Windsurf / VS Code MCP, or point stdio-only clients at the bundled `voicebox-mcp` binary +- **HTTP + stdio transports** — install as a URL in Claude Code / Cursor / Windsurf / VS Code MCP, or point stdio-only clients at the bundled `talkbox-mcp` binary ### Voice Personalities @@ -252,7 +252,7 @@ Attach a free-form personality to any voice profile — who this voice is, how t - **Compose** — a shuffle button that drops a fresh in-character line into the textarea; edit and speak, or click again for a different take - **Speak in character** — a toggle that routes your input text through the personality LLM to be rewritten in their voice before TTS -Agents can reach the same rewrite path over MCP by passing `personality: true` to `voicebox.speak`, turning the tool into a text-in → personality-LLM → TTS pipeline. The same LLM backs dictation's refinement step — one LLM in the app, one model cache, one GPU-memory footprint. +Agents can reach the same rewrite path over MCP by passing `personality: true` to `talkbox.speak`, turning the tool into a text-in → personality-LLM → TTS pipeline. The same LLM backs dictation's refinement step — one LLM in the app, one model cache, one GPU-memory footprint. **Local LLM options:** Qwen3 0.6B / 1.7B / 4B, sharing the TTS runtime (MLX on Apple Silicon, PyTorch elsewhere). @@ -261,7 +261,7 @@ Use cases: agent dev loops (dictate a question, hear the answer in a cloned voic ### Model Management - Per-model unload to free GPU memory without deleting downloads -- Custom models directory via `VOICEBOX_MODELS_DIR` +- Custom models directory via `TALKBOX_MODELS_DIR` - Model folder migration with progress tracking - Download cancel/clear UI @@ -281,42 +281,42 @@ Use cases: agent dev loops (dictate a question, hear the answer in a cloned voic ## API -Voicebox exposes a REST API for integrating voice I/O into your own apps and agents. +TalkBox exposes a REST API for integrating voice I/O into your own apps and agents. ```bash # Generate speech -curl -X POST http://127.0.0.1:17493/generate \ +curl -X POST http://127.0.0.1:17494/generate \ -H "Content-Type: application/json" \ -d '{"text": "Hello world", "profile_id": "abc123", "language": "en"}' # Agent voice output — any app or script can speak in a cloned voice -curl -X POST http://127.0.0.1:17493/speak \ +curl -X POST http://127.0.0.1:17494/speak \ -H "Content-Type: application/json" \ - -H "X-Voicebox-Client-Id: my-script" \ + -H "X-TalkBox-Client-Id: my-script" \ -d '{"text": "Deploy complete.", "profile": "Morgan"}' # Transcribe an audio file -curl -X POST http://127.0.0.1:17493/transcribe \ +curl -X POST http://127.0.0.1:17494/transcribe \ -F "audio=@recording.wav" \ -F "model=whisper-turbo" # List voice profiles -curl http://127.0.0.1:17493/profiles +curl http://127.0.0.1:17494/profiles ``` `POST /speak` accepts `profile` as a name (case-insensitive) or id, and resolves via the same precedence as the MCP tool: explicit arg → per-client binding → `capture_settings.default_playback_voice_id`. ### MCP server -Voicebox ships a built-in **Model Context Protocol** server so any MCP-aware agent (Claude Code, Cursor, Windsurf, Cline, VS Code MCP extensions) can speak, transcribe, and browse captures and profiles. +TalkBox ships a built-in **Model Context Protocol** server so any MCP-aware agent (Claude Code, Cursor, Windsurf, Cline, VS Code MCP extensions) can speak, transcribe, and browse captures and profiles. **Claude Code one-liner:** ``` -claude mcp add voicebox \ +claude mcp add talkbox \ --transport http \ - --url http://127.0.0.1:17493/mcp \ - --header "X-Voicebox-Client-Id: claude-code" + --url http://127.0.0.1:17494/mcp \ + --header "X-TalkBox-Client-Id: claude-code" ``` **Any HTTP MCP client** (Cursor, Windsurf, VS Code, etc.): @@ -324,32 +324,32 @@ claude mcp add voicebox \ ```json { "mcpServers": { - "voicebox": { - "url": "http://127.0.0.1:17493/mcp", - "headers": { "X-Voicebox-Client-Id": "cursor" } + "talkbox": { + "url": "http://127.0.0.1:17494/mcp", + "headers": { "X-TalkBox-Client-Id": "cursor" } } } } ``` -**Stdio fallback** for clients that don't speak HTTP MCP — point at the bundled `voicebox-mcp` binary inside the app: +**Stdio fallback** for clients that don't speak HTTP MCP — point at the bundled `talkbox-mcp` binary inside the app: ```json { "mcpServers": { - "voicebox": { - "command": "/Applications/Voicebox.app/Contents/MacOS/voicebox-mcp", - "env": { "VOICEBOX_CLIENT_ID": "claude-desktop" } + "talkbox": { + "command": "/Applications/TalkBox.app/Contents/MacOS/talkbox-mcp", + "env": { "TALKBOX_CLIENT_ID": "claude-desktop" } } } } ``` -Four tools ship: `voicebox.speak`, `voicebox.transcribe`, `voicebox.list_captures`, `voicebox.list_profiles`. Per-client voice bindings are managed in **Voicebox → Settings → MCP**. See the [full MCP guide](docs/content/docs/overview/mcp-server.mdx) for tool signatures, resolution precedence, the speaking-pill contract, and security notes. +Four tools ship: `talkbox.speak`, `talkbox.transcribe`, `talkbox.list_captures`, `talkbox.list_profiles`. Per-client voice bindings are managed in **TalkBox → Settings → MCP**. See the [full MCP guide](docs/content/docs/overview/mcp-server.mdx) for tool signatures, resolution precedence, the speaking-pill contract, and security notes. ```ts // In any MCP-aware agent: -await voicebox.speak({ +await talkbox.speak({ text: "Tests passing. Ready to merge.", profile: "Morgan", // optional — falls back to the per-client binding personality: true, // optional — rewrites text through the profile's personality LLM first @@ -358,7 +358,7 @@ await voicebox.speak({ **Use cases:** agent dev loops (voice in, voice out), game dialogue, podcast production, accessibility tools, voice assistants, content automation. -Full API documentation available at `http://127.0.0.1:17493/docs`. +Full API documentation available at `http://127.0.0.1:17494/docs`. --- @@ -395,7 +395,7 @@ Full API documentation available at `http://127.0.0.1:17493/docs`. | **Long-form capture** | Dual-stream recorder (mic + system audio) with summary LLM transform | | **Platform sinks** | Apple Notes, Obsidian, and other opt-in integrations | | **Plugin architecture** | Extend with custom models, transforms, and sinks | -| **Mobile companion** | Control Voicebox from your phone | +| **Mobile companion** | Control TalkBox from your phone | For the **full engineering status, open-issue triage, and prioritized work queue**, see [`docs/PROJECT_STATUS.md`](docs/PROJECT_STATUS.md) — a living document that tracks what's shipped, what's in-flight, candidate TTS engines under evaluation, and why we've accepted or backlogged specific integrations. @@ -408,8 +408,8 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed setup and contribution guide ### Quick Start ```bash -git clone https://github.com/jamiepine/voicebox.git -cd voicebox +git clone https://github.com/jamiepine/talkbox.git +cd talkbox just setup # creates Python venv, installs all deps just dev # starts backend + desktop app @@ -419,7 +419,7 @@ Install [just](https://github.com/casey/just): `brew install just` or `cargo ins **Prerequisites:** [Bun](https://bun.sh), [Rust](https://rustup.rs), [Python 3.11+](https://python.org), [Tauri Prerequisites](https://v2.tauri.app/start/prerequisites/), and [Xcode](https://developer.apple.com/xcode/) on macOS. -The repo ships a pre-wired `.mcp.json` at the root — running Claude Code inside this checkout picks up the Voicebox MCP tools automatically once the dev app is running. +The repo ships a pre-wired `.mcp.json` at the root — running Claude Code inside this checkout picks up the TalkBox MCP tools automatically once the dev app is running. ### Building Locally @@ -437,7 +437,7 @@ The guide is optimized for AI coding agents. An [agent skill](.agents/skills/add ### Project Structure ``` -voicebox/ +talkbox/ ├── app/ # Shared React frontend ├── tauri/ # Desktop app (Tauri + Rust) ├── web/ # Web deployment @@ -470,5 +470,5 @@ MIT License — see [LICENSE](LICENSE) for details. ---

- voicebox.sh + talkbox.sh

diff --git a/RESPONSIBLE_USE.md b/RESPONSIBLE_USE.md index 809f0a6..eb44e16 100644 --- a/RESPONSIBLE_USE.md +++ b/RESPONSIBLE_USE.md @@ -1,8 +1,8 @@ # Responsible Use -Voicebox is a local-first AI voice studio. It can clone voices from short audio samples, generate speech, and make AI agents speak through voice profiles. That capability is useful for accessibility, creative production, prototyping, game development, and personal tools, but it can also be misused. +TalkBox is a local-first AI voice studio. It can clone voices from short audio samples, generate speech, and make AI agents speak through voice profiles. That capability is useful for accessibility, creative production, prototyping, game development, and personal tools, but it can also be misused. -Voicebox does not and cannot independently verify who owns a voice sample. You are responsible for making sure you have the right to use every voice you clone, import, or generate with. +TalkBox does not and cannot independently verify who owns a voice sample. You are responsible for making sure you have the right to use every voice you clone, import, or generate with. ## Allowed Uses @@ -22,6 +22,6 @@ Voicebox does not and cannot independently verify who owns a voice sample. You a ## Disclosure And Compliance -If you publish or distribute synthetic audio, disclose that it is AI-generated where required by law, platform policy, or audience expectations. Developers building products on top of Voicebox should treat consent records, disclosure, and jurisdiction-specific requirements as part of their own application design. +If you publish or distribute synthetic audio, disclose that it is AI-generated where required by law, platform policy, or audience expectations. Developers building products on top of TalkBox should treat consent records, disclosure, and jurisdiction-specific requirements as part of their own application design. -Voicebox runs locally to protect user privacy. That privacy model does not remove your responsibility to respect other people's voices. +TalkBox runs locally to protect user privacy. That privacy model does not remove your responsibility to respect other people's voices. diff --git a/SECURITY.md b/SECURITY.md index 049dd77..df172e2 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -14,7 +14,7 @@ We release patches for security vulnerabilities. Which versions are eligible for If you discover a security vulnerability, please report it responsibly: 1. **Do not** open a public GitHub issue -2. Email security details to: [security@voicebox.sh](mailto:security@voicebox.sh) +2. Email security details to: [security@talkbox.sh](mailto:security@talkbox.sh) 3. Include: - Description of the vulnerability - Steps to reproduce @@ -31,7 +31,7 @@ We will: ### For Users -- **Keep Voicebox updated** - Updates include security patches +- **Keep TalkBox updated** - Updates include security patches - **Verify downloads** - Only download from official releases - **Local processing** - Voice data stays on your machine - **Network security** - Use HTTPS when connecting to remote servers @@ -47,7 +47,7 @@ We will: ### Local Processing -Voicebox processes all audio locally by default. Your voice data never leaves your machine unless you explicitly enable remote server mode. +TalkBox processes all audio locally by default. Your voice data never leaves your machine unless you explicitly enable remote server mode. ### Remote Server Mode @@ -89,4 +89,4 @@ Security updates will be: --- -Thank you for helping keep Voicebox secure! 🔒 +Thank you for helping keep TalkBox secure! 🔒 diff --git a/app/index.html b/app/index.html index 2a15513..26effaa 100644 --- a/app/index.html +++ b/app/index.html @@ -4,12 +4,12 @@ - voicebox + talkbox