Commit Graph
2541 Commits
Author SHA1 Message Date
debpalash d47884ed14 fix(electron): improve dubbing demo playback and editing 2026-09-15 15:36:12 +05:30
Palash Debnath 4e55180f70 fix(electron): isolate packaged runtime setup 2026-09-14 11:25:07 -07:00
Palash Debnath dad59c1318 style: format shared frontend contracts 2026-09-14 11:05:42 -07:00
Palash Debnath 141b42f7a6 fix: restore desktop integration contracts 2026-09-14 10:53:55 -07:00
Palash Debnath f832d616f7 feat(electron): add full VoiceStudio desktop app 2026-09-14 10:22:23 -07:00
Palash Debnath eaf8bb9538 Update README.md 2026-09-10 22:50:20 -07:00
Palash Debnath 8932b09339 Merge pull request #2043 from debpalash/fix/mcp-timeout-follows-backend
fix(mcp): tools wait for the backend's own budget, not a fixed 120 s
2026-09-10 16:37:46 -07:00
Palash Debnath a35c7babdf docs(mcp): the first generation also downloads the model inside the budget 2026-09-10 16:16:01 -07:00
Palash Debnath bd9be744eb Merge remote-tracking branch 'origin/main' into fix/mcp-timeout-follows-backend
# Conflicts:
#	CHANGELOG.md
2026-09-10 16:15:59 -07:00
Palash Debnath 14778aaba4 Merge pull request #2044 from debpalash/fix/pytorch-whisper-vram-budget
fix(asr): PyTorch Whisper budgets the VRAM its model needs
2026-09-10 16:15:17 -07:00
Palash Debnath 5ca94b7d72 Merge remote-tracking branch 'origin/main' into fix/pytorch-whisper-vram-budget
# Conflicts:
#	CHANGELOG.md
2026-09-10 15:52:34 -07:00
Palash Debnath 7247cef1b6 Merge remote-tracking branch 'origin/main' into fix/mcp-timeout-follows-backend
# Conflicts:
#	CHANGELOG.md
2026-09-10 15:52:21 -07:00
Palash Debnath ff5bad5a92 Merge pull request #2042 from debpalash/fix/transcribe-m4a
fix(asr): PyTorch Whisper transcribes M4A through the ffmpeg fallback
2026-09-10 15:51:53 -07:00
Palash Debnath e7911e3e97 fix(asr): reduced VRAM budgets only for exact OpenAI Whisper ids
Review follow-up. The budget matched model names by substring, so a custom
repo whose name contains "turbo", "small" or "base" (or a word such as
"database") got a reduced budget and could be admitted to CUDA without
enough memory. Reduced budgets now apply only to the exact OpenAI
checkpoint ids, .en variants included. Any other repository, fine-tunes
included, keeps the conservative 5.0 GB, as the engine doc says.
2026-09-10 15:33:11 -07:00
Palash Debnath d37da79b34 fix(mcp): generation waits also cover the backend's queue clock
Review follow-up. A generation first waits in the GPU pool's queue, on its
own clock (GPU_QUEUE_TIMEOUT_S, 1800 s by default), before its execution
budget starts, so a 630 s wait could still give up before the backend
returned its queue error. The generate wait now adds the queue budget.
Transcription is unchanged: run_transcribe_guarded starts its 300 s clock
at submission, so queue time already counts against it.

Parity tests pin each tool's wait above the backend's own worst case,
from ASR_TRANSCRIBE_TIMEOUT_S, GPU_QUEUE_TIMEOUT_S and generate_timeout_s
on cpu, cuda and mps. A later backend change that outgrows the MCP wait
now fails a test. A new case covers a CPU budget larger than the GPU one.
2026-09-10 15:31:14 -07:00
Palash Debnath b4cfd7aac0 fix(asr): keep readable audio at its native rate; cover the M4A route
Review follow-up. The shared loader resamples soundfile-readable audio to
16 kHz with a linear interpolation, which can alias 44.1/48 kHz input into
Whisper's band. PyTorch Whisper now reads such audio at its native rate,
as before, so the pipeline's band-limited resampler converts it. Only
files soundfile can't open (MP4/M4A) take the ffmpeg path, which resamples
properly. New tests: a 48 kHz stereo WAV reaches the pipeline at 48 kHz
without ffmpeg, a POST /transcribe with an .m4a returns 200, and the MCP
tool names M4A bytes .m4a.
2026-09-10 15:30:23 -07:00
Palash Debnath e501a596d3 docs(changelog): note the PyTorch Whisper VRAM budget fix (#2044) 2026-09-10 15:06:52 -07:00
Palash Debnath 033f8f2f64 fix(asr): PyTorch Whisper budgets the VRAM its model needs
The CUDA preflight demanded 5.0 GB of free VRAM for every model, sized for
full large-v3. The default model is large-v3-turbo, which the pipeline
loads in fp16: about 1.6 GB of weights, not the 3.2 GiB fp32 figure in the
old comment. So a 6 GB card with nothing else resident reported 5.0 GB
free and was sent to CPU every time, although CUDA ran the same audio in
37 s against minutes on CPU.

The budget is now fp16 weights + 1.5 GB workspace (batch 16) + 0.5 GB
headroom, per model and capped at the old 5.0 GB. That is 3.6 GB for turbo
and 5.0 GB for full large-v3 and any unrecognised model. Both CPU-fallback
warnings name the model and the OMNIVOICE_ASR_VRAM_PREFLIGHT=0 opt-out.
The engine doc lists the budgets.

Fixes #2041
2026-09-10 15:06:45 -07:00
Palash Debnath 39c348af26 docs(changelog): note the MCP timeout fix (#2043) 2026-09-10 15:05:25 -07:00
Palash Debnath 58d590a686 fix(mcp): tools wait for the backend's own budget, not a fixed 120 s
The MCP tools gave up on a backend POST after OMNIVOICE_MCP_TIMEOUT_S,
default 120 s, while the backend's own budgets run longer: 300 s for ASR,
and 300 s or more for generation. A transcription the backend would have
finished came back as an empty client-side timeout, and the abandoned
job kept holding the worker. The docstring said the timeout followed
OMNIVOICE_GENERATE_TIMEOUT_S, but it never read it.

Unset, each tool now waits for the backend's budget plus 30 s, never less
than 120 s. transcribe follows OMNIVOICE_ASR_TRANSCRIBE_TIMEOUT_S, and
generate_speech follows the larger of the GPU and CPU generation budgets,
scaled by text length like the backend. An explicit
OMNIVOICE_MCP_TIMEOUT_S still wins. docs/mcp.md says so.

Fixes #2040
2026-09-10 15:05:18 -07:00
Palash Debnath 6ff9ab80f8 docs(changelog): note the M4A transcribe fix (#2042) 2026-09-10 15:05:01 -07:00
Palash Debnath aef275a041 fix(asr): PyTorch Whisper transcribes M4A through the ffmpeg fallback
PyTorchWhisperBackend.transcribe read uploads with soundfile, and
libsndfile cannot open MP4/M4A (AAC). /transcribe and the MCP tool both
accept .m4a, so every such upload failed with "Format not recognised"
before ASR ran. It now uses _load_audio_16k_mono_f32, the loader the
sherpa backend already uses: soundfile first, then the validated ffmpeg
path, returning the 16 kHz mono float32 Whisper expects.

Fixes #2039
2026-09-10 15:04:53 -07:00
Palash Debnath 0525a078e0 Merge pull request #2035 from debpalash/fix/cosyvoice-advisory-floors
test(cosyvoice): raise the advisory floors to GitHub's fixes
2026-09-10 14:57:12 -07:00
Palash Debnath 083e7965f8 Merge pull request #2037 from debpalash/fix/sidecar-ready-diagnostics
fix(sidecar): a failed ready handshake names its cause
2026-09-10 14:37:51 -07:00
Palash Debnath df81bcd1ac fix(deps): raise protobuf and transformers bounds in pyproject too
The floors test checked only uv.lock, and pyproject still allowed
transformers>=5.5.0 and protobuf>=4.25. A fresh resolution, or an install
without the lock, could still pick a release below the advisory fixes.
The manifest now requires transformers>=5.10.0 and protobuf>=5.29.6. The
lock already resolved 5.15.1 and 7.36.0, so no package version changes;
only the recorded requirements do.
2026-09-10 14:35:31 -07:00
Palash Debnath aa98bb6974 Merge pull request #2038 from debpalash/fix/worker-control-teardown-flake
test(workers): give Control teardown waits a generous bound
2026-09-10 14:25:11 -07:00
Palash Debnath 1f386817cd Merge remote-tracking branch 'origin/main' into fix/sidecar-ready-diagnostics
# Conflicts:
#	CHANGELOG.md
2026-09-10 14:16:28 -07:00
Palash Debnath edc7199ab8 Merge pull request #2036 from debpalash/fix/youtube-bot-check-guidance
fix(dub): YouTube's bot check points at the app's cookie import
2026-09-10 14:15:26 -07:00
Palash Debnath 942561bbb3 test(sidecar): repair the literals in the new drain and error-frame tests 2026-09-10 14:12:04 -07:00
Palash Debnath 2e2b9fedd9 fix(sidecar): bind each stderr drain to its own process
The drain thread took its buffer from spawn but read self._proc when it
started, so a drain that started late could read a replacement process's
stderr into the old buffer. Spawn now passes the process and its buffer
together. Tests cover a late drain and the error-frame branch of the ready
diagnostics.
2026-09-10 14:09:20 -07:00
Palash Debnath 837baa922a Merge remote-tracking branch 'origin/main' into fix/cosyvoice-advisory-floors
# Conflicts:
#	CHANGELOG.md
2026-09-10 14:07:43 -07:00
Palash Debnath 0688c37f04 Merge pull request #2020 from debpalash/feat/engine-list-detail
feat(catalogue): engine list + detail panel, weights under their engine
2026-09-10 14:06:26 -07:00
Palash Debnath 973f44c0a5 docs(changelog): note the worker teardown flake fix (#2038) 2026-09-10 14:01:58 -07:00
Palash Debnath acae6bea4e test(workers): give Control teardown waits a generous bound
test_blocked_reconnect_persistence_does_not_stall_another_worker failed on
a Windows runner (#2020's Smoke job) when its final wait for the Control
stream to end expired at 2s. That wait only proves the stream ends: after
both releases, the real disconnect path persists all 64 queued tasks, and
a slow runner took longer. The assertions that matter, another worker's
heartbeat and prewarm staying under 0.2s while reconciliation is blocked,
are untouched.

The three waits that only bound a Control stream's exit now share
_CONTROL_EXIT_TIMEOUT_S = 10s. A stream that never ends still fails.
2026-09-10 14:01:50 -07:00
Palash Debnath fc9bd8c8d8 test(dub): import app modules at test time in the bot-check tests 2026-09-10 13:52:50 -07:00
Palash Debnath 9e4d67325f fix(sidecar): each spawn quotes only its own stderr
A shared deque cleared on spawn could still receive late lines from the
previous process's drain thread, and a new start-up failure would quote
them. Each spawn now gets a fresh buffer passed to its own drain thread.
2026-09-10 13:52:41 -07:00
Palash Debnath bb7eb06697 test(deps): raise the app's protobuf and transformers floors too
The app's own lock already resolves transformers 5.15.1 and protobuf
7.36.0, but PYTHON_FLOORS still allowed transformers 5.5.0 and did not
pin protobuf. A later lock change could have slipped below the fixes for
the advisories Dependabot raised on CosyVoice's manifest (#2030, #2031).
2026-09-10 13:49:32 -07:00
Palash Debnath 3a90be329f docs(changelog): note the sidecar ready-failure diagnostics (#2037) 2026-09-10 13:46:38 -07:00
Palash Debnath 6a923f5a10 fix(sidecar): a failed ready handshake names its cause
A sidecar that failed its ready handshake reported "did not signal ready:
None" for the two most likely causes. _recv returns None on EOF, and a
deadline kill closes stdout just like a crash, so the report could not
tell a slow start from a start-up crash. The exit code was never read,
and stderr went only to the log.

The error now names which it was:

- no ready frame within the deadline, so it was stopped;
- it exited with code N before signalling ready;
- it sent the wrong op, or reported an error frame (with its message).

Each ends with the sidecar's last stderr lines, scrubbed of home paths
and secrets and capped at 800 characters. The prefix is unchanged, so
existing matching still works. The echo sidecar gets test-mode hooks to
exit, stall or send the wrong op before ready.

Fixes #2026
2026-09-10 13:46:31 -07:00
Palash Debnath 8bad7a316b docs(changelog): note the YouTube bot-check guidance (#2036) 2026-09-10 13:44:29 -07:00
Palash Debnath 437593bfbb fix(dub): YouTube's bot check points at the app's cookie import
A YouTube link that hits "Sign in to confirm you're not a bot" showed
yt-dlp's raw advice to pass --cookies-from-browser or --cookies, which are
CLI flags nobody using VoiceStudio can pass. It now has its own failure
class, VIDEO_DOWNLOAD_BOT_CHECK. Its hint says to export signed-in cookies
as a cookies.txt file and attach it in Dub, or to upload the video
instead. The class is terminal, so it is neither retried as a network drop
nor escalated through player clients like a 403.

Fixes #2034
2026-09-10 13:44:21 -07:00
Palash Debnath 686d9c5fcf fix(catalogue): repair the guidance the Weights-list rename broke
The rename to "the engine's Weights list in Model Catalogue" left several
messages without a verb, and pointed others at the wrong place:

- The offline and create-voice messages say what to do again.
- pyannote has no owning engine, so diarization points at Other weights.
- The Hugging Face mirror moved to Settings → Network, and voice previews
  moved to Settings → Storage.
- Unloading and switching engines happen in the engine list, not a
  Weights list.
- A bad saved path points at Settings → Storage or the env file.
- Docstrings that read "the the" are fixed.

The dub stream-drop fallback goes through i18n in all 21 locales. A
Dictation pick on a row that is already downloading no longer starts a
second install: the row's radio is disabled while it works, and
useModelDownloads refuses a second mutation for a repo already in flight.
The Supertonic-3 license test checks for the Accept wording.
2026-09-10 13:34:54 -07:00
Palash Debnath 01d503f64f Merge remote-tracking branch 'origin/main' into fix/cosyvoice-advisory-floors 2026-09-10 13:31:49 -07:00
Palash Debnath c94585a339 Merge pull request #2032 from debpalash/fix/darwin-eperm-exit-settle
fix(lifecycle): wait for a Darwin exit to register after EPERM
2026-09-10 13:28:34 -07:00
Palash Debnath 40139bb2a2 Merge remote-tracking branch 'origin/main' into fix/cosyvoice-advisory-floors 2026-09-10 13:20:21 -07:00
Palash Debnath 045f75c30e Merge pull request #2031 from debpalash/dependabot/pip/backend/engines/cosyvoice_subprocess/transformers-5.10.1
chore(deps): bump transformers from 4.57.6 to 5.10.1 in /backend/engines/cosyvoice_subprocess
2026-09-10 13:20:16 -07:00
Palash Debnath 4a4fa6a9e0 test(cosyvoice): raise the advisory floors to GitHub's fixes
The floors came from OSV alone, which did not list the protobuf and
transformers advisories GitHub flagged once the manifest reached main
(Dependabot #2030, #2031). Raise them to the first fixed releases so a
later downgrade fails the test. Note that transformers 5 was checked
against CosyVoice's tokenizer and cached decoding.
2026-09-10 13:04:49 -07:00
Palash Debnath 5f3f35f134 Merge remote-tracking branch 'origin/main' into fix/darwin-eperm-exit-settle
# Conflicts:
#	CHANGELOG.md
2026-09-10 13:04:31 -07:00
Palash Debnath 32393613be Merge branch 'main' into feat/engine-list-detail 2026-09-10 13:03:00 -07:00
Palash Debnath 2c83f5c16c Merge pull request #2013 from debpalash/feat/catalogue-one-page
feat(catalogue): one page — setup summary over per-family engines and weights
2026-09-10 13:02:39 -07:00