Renames what users see. The app, the installers, the window title, the
docs and all 21 locales now say VoiceStudio, with "(previously
OmniVoice-Studio)" noted near the title of each doc surface so people
recognise it.
Deliberately NOT renamed, because renaming any of them silently breaks
an existing install — there is no legacy-path fallback anywhere in this
codebase:
- bundle identifier com.debpalash.omnivoice-studio (MSI UpgradeCode,
macOS TCC grants, managed venv, WebView localStorage, the
single-instance lock)
- data directories OmniVoice / .omnivoice and omnivoice.db
- the ~150 OMNIVOICE_* environment variables
- the X-OmniVoice-* HTTP headers (a wire protocol)
- the published Docker image paths
- the OmniVoice ENGINE, which is a model name and not this product
tests/test_identity_paths_survive_the_rename.py pins every one of those
so a future well-meaning sweep cannot orphan a user's library.
Linux .deb users install a new package name and should apt remove
omnivoice-studio; that note is in the changelog.
2.8 KiB
VoiceStudio — Speaker Diarization
Diarization splits a single audio stream into per-speaker tracks: who said what, and when. VoiceStudio uses pyannote + WhisperX under the hood — the same stack the original WhisperX paper used.
What diarization buys you
- Multi-speaker dubbing: each detected speaker gets its own voice clone in the target language.
- Subtitle styling: speaker labels (
SPEAKER_00:,SPEAKER_01:, …) on the exported SRT/VTT files. - Audio editing: per-speaker tracks in the timeline view.
License acceptance flow
The diarization model — pyannote/speaker-diarization-3.1 — is gated on
HuggingFace. A valid HF token alone is not enough: you also need to accept
the model's license once.
- Get a HF token if you don't have one — see docs/setup/huggingface-token.md.
- Set the token via Settings → API Keys (or any of the other supported paths).
- While signed in to HuggingFace with the same account, visit:
- https://huggingface.co/pyannote/speaker-diarization-3.1 → "Agree and access repository".
- https://huggingface.co/pyannote/segmentation-3.0 → same.
- Restart the dub job. The first run downloads ~600 MB of model weights.
If you skip the license acceptance, the HF API returns 401 Unauthorized for
the download — the same error class the in-app "Open docs for this error"
button deeplinks to.
Fallback behaviour
When diarization is unavailable (no HF token, license not accepted, model
download failed mid-run), VoiceStudio's dub pipeline falls back to a
silence-gap heuristic that splits speakers on long quiet stretches.
You'll see a warning toast and the dub_core.py reason string surfaces in
the job log:
"diarization_skipped:no_token"— no token resolved from the cascade."diarization_skipped:401"— token present but unauthorised on the gated model (license not accepted)."diarization_skipped:network"— model download interrupted.
The heuristic is not as accurate as pyannote — speakers with similar pitch or rapid turn-taking conversation get merged — but it lets the dub finish end-to-end instead of erroring.
HF token requirement
Diarization is the one VoiceStudio feature where a HF token is required, not just recommended. See docs/setup/huggingface-token.md for the three-source cascade and how the in-app Settings → API Keys panel works.
Troubleshooting
- HF 401 → see troubleshooting.md#2-hf-401--pyannote-license-not-accepted.
- Model download stuck → check
~/.cache/huggingface/hub/models--pyannote--*size grows during the dub; if it stalls at 0 bytes, your token isn't being read — confirm in Settings → API Keys that the active source has a green checkmark.