Files
VoiceStudio/README.md
T
Palash DebnathandClaude Opus 4.7 715766cb04 Phase 1 Wave 2: per-OS install docs + Settings UI + error→docs deeplinks (#94)
* docs(install): per-OS install pages + drift validator + CI gate

Splits the 600-line README install section into self-contained per-OS docs
under docs/install/{macos,windows,linux,docker}.md plus a Top-10
troubleshooting index. Each OS doc is end-to-end: a user opens it and
reaches a working app following only commands inside that file.

Adds:
- docs/install/{macos,windows,linux,docker}.md  (OS-specific install paths)
- docs/install/troubleshooting.md               (top 10 install errors)
- docs/engines/cosyvoice.md                     (closes #55 docs half)
- docs/features/diarization.md                  (pyannote license flow)
- docs/setup/huggingface-token.md               (3-source cascade guide)
- scripts/validate-install-docs.py              (INST-06 docs-drift gate)
- tests/scripts/test_validate_install_docs.py   (B-5: validator self-tests)
- .github/workflows/ci.yml step running the validator on every PR

Implements INST-02 (README routing), INST-03 (macOS Gatekeeper anchor),
INST-12 docs half (Windows torch-compile-oom anchor), DOCS-01..05.

The validator is a one-way diff: every `<!-- validate -->`-tagged line
in docs must appear in scripts/desktop-prod.sh after normalisation
(prompt-prefix strip, CRLF, trailing whitespace, blank-and-comment skip).
A `<!-- validate: skip -->` marker opts out for human-readability blocks.
Its own 10 unit tests catch regressions in the gate itself.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(deeplinks): links.py + error_docs_map (Python + TS mirror)

Adds the single source of truth for the project repo URL and the 4-class
error → docs taxonomy that both the in-app ErrorBoundary deeplink button
(Wave 2 Task 3) and the Phase 5 bug reporter will consume.

New:
- backend/core/links.py            — PROJECT_REPO_URL + BLOB_MAIN resolver
                                      (Tauri config first, pyproject fallback)
- backend/core/error_docs_map.py   — lookup(error_class) → docs URL
- frontend/src/utils/errorDocsMap.ts (TS mirror with classifyError helper)
- tests/backend/core/test_links.py + test_error_docs_map.py
- frontend/src/utils/errorDocsMap.test.ts

Resolves checker B-6 (links.py ownership) and Open Question #3 (which fork
the deeplinks resolve to — the Tauri updater endpoint wins, which points
at the desktop app fork debpalash/OmniVoice-Studio).

The TS BASE constant is documented as the second hardcoded URL drift site;
the keys-sync test (`test_keys_match_python_map` equivalent) guards the
4-class taxonomy contract between Python + TS halves.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(ui): Settings → API Keys panel + ErrorBoundary docs deeplink

Wave 2 AUTH-03 UI half + ErrorBoundary deeplink wiring.

ErrorBoundary fallback now renders an "Open docs for this error" button
that classifies the thrown Error message (heuristic: pkg_resources → 401 /
HfHubHTTP → WebKit / white screen → quarantine / Gatekeeper) and opens the
matching docs anchor via Tauri shell.open (with a window.open fallback
in browser dev mode).

ApiKeysPanel consumes the Wave 1 resolver state endpoint:
  - 3 source rows (App / Env var / HF CLI) with set/unset indicator,
    masked token preview, whoami username + green check
  - "Active" badge on whichever source is currently serving the cascade
  - App-row only: Save (POST /api/settings/hf-token) +
    Clear (DELETE with optional "also clear HF CLI" confirm dialog)
  - "Test now" button refetches state (invalidates the resolver's
    validation cache via the same endpoint hit)

Panel mounted in the existing Settings → Credentials tab; the legacy
HF_TOKEN row from CREDENTIAL_FIELDS is filtered out so the two paths
don't fight over the same key.

Threat T-02-02: the panel never displays the full token. The masked
value comes from the resolver state endpoint; the full token only
crosses the IPC boundary on Save (POST) and is cleared from local
state on success.

Closes AUTH-03 fully (Wave 1 backend + this Wave 2 UI).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(perf): INST-12 Disable torch.compile (Windows) toggle (backend + UI)

Wave 2 Task 4 — full INST-12 delivery per checker B-2/B-7 v0.3.0 fat-release
decision. Both the docs half (windows.md anchor, shipped in earlier commit)
and the runtime toggle are now in Phase 1.

Backend:
- backend/services/settings_store.py: adds get_text/set_text helpers for
  non-secret config (refuses to write to the encrypted hf_token key).
- backend/api/routers/settings.py: GET + PUT
  /api/settings/perf/torch-compile-disabled, both under the existing
  loopback guard (threat T-02-04).
- backend/services/engine_env.py: new `build_engine_env()` helper that
  centralises HF_TOKEN/YOUR_HF_TOKEN injection from the 3-source resolver
  AND injects TORCH_COMPILE_DISABLE=1 when the flag is set on win32.
  Phase 2 SubprocessBackend launchers should adopt the same helper.
- backend/services/sonitranslate.py: migrated to engine_env.build_engine_env()
  while preserving the source-level `env["HF_TOKEN"]` sentinel that
  test_sonitranslate_module_uses_resolver checks.

Frontend:
- frontend/src/components/settings/PerformancePanel.{jsx,css,test.jsx}:
  toggle UI with the explainer for #65; renders disabled with a "not
  applicable" badge on macOS/Linux.
- frontend/src/pages/Settings.jsx: mounts the panel into the Credentials
  tab alongside the API Keys panel.

Tests:
- tests/backend/test_perf_settings.py: 7 backend tests (default state,
  PUT persistence, T-02-04 non-loopback rejection, settings_store round-
  trip, env injection on win32, NO injection on macOS/Linux, NO injection
  when disabled).
- frontend PerformancePanel.test.jsx: 5 tests (renders from GET state,
  PUT on toggle, disabled on non-Windows platforms, pre-enabled state).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(planning): Wave 2 SUMMARY + REQUIREMENTS status updates

- .planning/phases/01.../01-02-SUMMARY.md: full implementation report
  per template (truths, commits, tests, deviations, drift-site
  acknowledgments per W-3, launcher seam name for Phase 2,
  taxonomy keys for Phase 5).
- .planning/REQUIREMENTS.md: flips Wave 2 closures to Done:
    AUTH-03, INST-02, INST-03 (docs half), INST-06, INST-12,
    DOCS-01..05.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 06:22:10 +05:30

20 KiB
Raw Blame History

OmniVoice Logo

OmniVoice Studio

The open-source ElevenLabs alternative.

Real-time dictation, zero-shot voice cloning, and cinematic video dubbing — all on your desktop.
Open-source, no API keys, fully local. 646 languages.

Stars Release License Issues Discord

Quickstart · Features · Why OmniVoice Studio? · TTS Engines · Contributing · Discord

Download macOS DMG Download Windows MSI Download Linux AppImage Download Debian .deb


OmniVoice Studio — The open-source ElevenLabs alternative

Warning

OmniVoice Studio is in active beta. Things may break between releases. For the latest features and fixes, clone the repo and run from source rather than using pre-built installers. Bug reports and PRs are very welcome — open an issue or join Discord.


Join Discord
Get setup help · Share your dubs · Vote on the roadmap · Early access to new engines

Features

🎙️ Voice Cloning

3-second clip → mirror any voice.
646 languages, zero-shot.

🎨 Voice Design

Gender, age, accent, pitch, speed,
emotion, dialect — dial it in.

🎬 Video Dubbing

YouTube URL or file → transcribe →
translate → re-voice → MP4.

⌨️ Dictation Widget

⌘+⇧+Space from any app.
Transcribes, auto-pastes, disappears.

🔊 Vocal Isolation

Demucs-powered. Splits speech
from music, keeps the background.

👥 Speaker Diarization

Pyannote + WhisperX.
Auto-identifies who said what.

📦 Batch Queue

Drop 50 videos, walk away.
Progress bars per job.

🤖 MCP Server

Use OmniVoice from Claude,
Cursor, or any MCP client.

🛡️ AI Watermark

AudioSeal (Meta). Invisible,
survives compression.

🔐 100% Local

No keys, no cloud, no accounts.
Your machine only.

⚡ GPU Auto-Detect

CUDA · MPS · ROCm · CPU.
≤8 GB? Auto-offloads.

🧩 Extensible

Subclass TTSBackend,
add any engine in ~50 lines.


Quickstart

Per-OS install guides — pick yours and follow it end-to-end:

Stuck? See docs/install/troubleshooting.md for the top 10 install errors. The in-app error UI deeplinks to those entries when something breaks at runtime.

For Hugging Face token setup, see docs/setup/huggingface-token.md. For diarization-specific gating, see docs/features/diarization.md.

Screenshots

Voice Clone
Voice Clone
Drop a 3-second clip → mirror any voice. 646 languages, zero-shot.
Voice Design
Voice Design
Build new voices from scratch — gender, age, accent, pitch, style.
Video Dubbing
Video Dubbing
Upload or paste a YouTube URL. Transcribe, translate, re-voice, export.
Voice Gallery
Voice Gallery
Search YouTube, browse categories, download clips, build your library.
Settings — Models
Settings → Models
15 models. One-click install. Auto-detects your platform (CUDA / MPS / CPU).
Projects
Projects
Dub projects, voice profiles, generation history, exports — all searchable.
Settings — Logs
Settings → Logs
Live backend, frontend, and Tauri runtime logs. Filter, refresh, clear.

Why OmniVoice Studio?

ElevenLabs charges $5–$330/mo and processes your audio on their servers. OmniVoice Studio runs on your hardware, with no usage limits.

ElevenLabs OmniVoice Studio
Pricing $5–$330/mo, per-character billing Free for personal use · Commercial license for business
Voice Cloning ✅ 3s clip ✅ 3s clip, zero-shot
Voice Design ✅ Gender, age ✅ Gender, age, accent, pitch, style, dialect
Languages 32 646
Video Dubbing ✅ Cloud-only ✅ Fully local
Data Privacy Audio sent to cloud Nothing leaves your machine
API Keys Required Not needed
GPU Support N/A (cloud) CUDA · Apple Silicon · ROCm · CPU
Desktop App ❌ ✅ macOS · Windows · Linux
Customizable ❌ Closed ✅ Fork it, extend it, ship it

OmniVoice Studio gives you professional-grade AI tools without the subscription or the cloud.


Convinced? Come build with us.
Join Discord


System Requirements

Minimum Recommended
OS Windows 10, macOS 12+, Ubuntu 20.04+ Any modern 64-bit OS
RAM 8 GB 16 GB+
VRAM (GPU) 4 GB (auto-offloads TTS to CPU) 8 GB+ (NVIDIA RTX 3060+)
Disk 10 GB free (models + cache) 20 GB+ SSD
Python 3.10+ (managed by uv) 3.11–3.12
GPU Optional — CPU works NVIDIA CUDA · Apple Silicon MPS · AMD ROCm

Tip

On GPUs with ≤8 GB VRAM, OmniVoice automatically offloads TTS to CPU during transcription — no config needed. A dedicated GPU is not required; the entire pipeline runs on CPU (just slower).

TTS Engines

OmniVoice ships a multi-engine TTS backend. The default engine (OmniVoice) is always available; additional engines are opt-in and auto-detected. Switch engines in Settings → TTS Engine or via the OMNIVOICE_TTS_BACKEND env var.

Engine Languages Clone Instruct Linux macOS ARM Windows License
OmniVoice (default) 600+ ✅ ✅ ✅ CUDA/CPU ✅ MPS ✅ CUDA/CPU Built-in
CosyVoice 3 9 + 18 dialects ✅ ✅ ✅ CUDA/CPU ✅ MPS ✅ CUDA/CPU Apache-2.0
MLX-Audio (Kokoro, Qwen3-TTS, CSM, Dia, …) Multi Varies Varies ❌ ✅ Native ❌ Varies
VoxCPM2 30 ✅ ✅ ✅ CUDA/CPU ✅ MPS ✅ CUDA/CPU Apache-2.0
MOSS-TTS-Nano 20 ✅ ❌ ✅ CUDA/CPU ✅ CPU ✅ CUDA/CPU Apache-2.0
KittenTTS English ❌ ❌ ✅ CPU ✅ CPU ✅ CPU MIT

CUDA = GPU-accelerated · MPS = Apple Silicon Metal · CPU = runs everywhere, slower for large models · KittenTTS and MOSS-TTS-Nano run realtime on CPU · MLX-Audio is Apple Silicon only.


Architecture

┌─────────────────────────────────────────────────┐
│                  Frontend (React)                │
│  DubTab · VoicePreview · BatchQueue · Gallery    │
├─────────────────────────────────────────────────┤
│                Backend (FastAPI)                  │
│  97 API endpoints · SSE streaming · SQLite       │
├──────────┬──────────┬──────────┬────────────────┤
│ WhisperX │  Demucs  │OmniVoice │   Pyannote     │
│   ASR    │  Source  │   TTS    │  Diarization   │
│          │  Sep.    │          │                │
└──────────┴──────────┴──────────┴────────────────┘
        CUDA / MPS / ROCm / CPU (auto-detected)

Roadmap

✅ Shipped

Category Features
Dubbing Full pipeline (transcribe→translate→synthesize→mux), scene-aware splitting, lip-sync scoring, streaming TTS
Voice Zero-shot cloning, voice design, A/B comparison, voice preview widget, gallery with favorites/tags
Audio Demucs vocal isolation, per-segment gain, selective track export, stem/SRT/VTT/MP3 export
Multi-Lang Multi-language batch picker, batch dubbing queue with sequential GPU execution
Diarization Pyannote ML diarization, auto speaker clone extraction, per-speaker voice assignment
Infra Docker deployment, CUDA/MPS/ROCm auto-detect, cuDNN 8 compat, VRAM-aware model offloading
AI Provenance AudioSeal invisible watermarking (SynthID-like), video logo overlay, watermark detection API
UX Undo/redo, keyboard shortcuts, drag-and-drop, session persistence, glassmorphism design system
Real-time Events WebSocket event bus — instant sidebar refresh on data mutations, exponential backoff reconnect
State Management Zustand store migration — uiSlice, pillSlice, dubSlice, generateSlice, prefsSlice, glossarySlice
Desktop Cross-platform Tauri installers (macOS DMG, Windows MSI, Linux deb/AppImage), auto-update infrastructure
Windows Hardening Cross-platform log paths, Triton workaround, HF symlink bypass, 300s health check timeout
Dictation Global system-wide hotkey (⌘+⇧+Space), frameless floating widget, streaming ASR via WebSocket, auto-paste
Batch Pipeline Full batch TTS: extract → transcribe → translate → generate → mix → export, with live progress tracking

🔜 Up Next

  • 🎬 Lip-sync v2 — visual speech timing with wav2lip
  • 📖 Audiobook Editor — chapter-aware long-form narration
  • 🌐 Hosted Demo — try OmniVoice without installing anything
  • 🔌 Plugin Marketplace — community-contributed TTS engines and effects

Community

Join Discord

Channel What happens there
#showcase Members share their dubs, clones, and voice designs
#help Setup issues, GPU troubleshooting, model questions
#feature-requests Vote on what gets built next
#dev Architecture discussions, PR reviews, engine integrations
#announcements Release notes, breaking changes, early access

→ Join the Discord — we respond to setup questions within hours, not days.


Contributing

We welcome contributions of all kinds — bug fixes, new TTS engine adapters, UI improvements, docs, and translations.


FAQ

Is this really as good as ElevenLabs?
For voice cloning and dubbing, yes — OmniVoice uses a state-of-the-art diffusion TTS model with 646 languages (ElevenLabs supports 32). Quality is comparable for most use cases. Where ElevenLabs wins is in their polished cloud API and pre-made voice library. OmniVoice wins on privacy, cost, language coverage, and customizability.
Does it work on Apple Silicon (M1/M2/M3/M4)?
Yes. MPS acceleration is auto-detected. MLX-optimized Whisper models are available for faster transcription on Apple hardware.
How much VRAM do I need?
4 GB minimum. With ≤8 GB, the TTS model is automatically offloaded to CPU during transcription. With 8+ GB, everything runs on GPU simultaneously. No GPU at all? CPU mode works — just slower (~3× for TTS).
Can I use this commercially?
Personal, educational, internal-team, and non-commercial use is free under FSL-1.1-ALv2. Building a competing product or service on top of OmniVoice Studio requires a commercial license — see License. Pricing tiers coming soon. Each release converts to Apache 2.0 two years after publication.
What languages are supported?
646 languages for TTS via the OmniVoice model. Transcription (WhisperX) supports 99 languages. Translation coverage depends on the target language pair.
Can I add my own TTS engine?
Yes. OmniVoice uses a built-in backend registry. To add an engine in ~50 lines, subclass TTSBackend in backend/services/tts_backend.py and add it to the _REGISTRY dictionary at the bottom. Six engines are built in: OmniVoice, CosyVoice, MLX-Audio (14+ sub-engines), VoxCPM2, MOSS-TTS-Nano, and KittenTTS. See the TTS Engines section for details.

License

OmniVoice Studio is source-available under the Functional Source License (FSL-1.1-ALv2).

Free for personal, educational, research, internal team, and non-commercial use. Each release converts to Apache 2.0 automatically two years after publication.

Business / enterprise users building a competing product or service on top of OmniVoice Studio need a commercial license. Pricing tiers coming soon. For inquiries in the meantime, reach out at OmniVoice@palash.dev.

See LICENSE for the full terms.


Acknowledgments

OmniVoice Studio is built on the shoulders of exceptional open-source work:

Project Role
OmniVoice (k2-fsa) Zero-shot diffusion TTS engine — the core voice synthesis model
WhisperX Word-level speech recognition and alignment
Demucs (Meta) Music source separation for vocal isolation
Pyannote Speaker diarization — who said what
CTranslate2 Optimized Transformer inference on CPU and GPU
AudioSeal (Meta) Invisible neural audio watermarking for AI provenance
Tauri Native desktop app framework


If you read this far, you're our kind of person.
⭐ Star this repo so others can find it too.
💬 Join the Discord to share what you build.


Star History