omnivoice

Local TTS, voice cloning, voice design, and video dubbing via the VoiceStudio MCP server (open-source ElevenLabs alternative; nothing leaves the machine, runs on MPS/CUDA/CPU). Use when: (1) generating speech from text in any of 646 languages, (2) cloning a voice from a 3-second reference clip, (3) designing a voice by gender/age/accent/pitch/style, (4) dubbing a video into another language, (5) listing voice profiles or personality presets, (6) producing narration where privacy, cost, or absent API keys matter, (7) non-English narration where Edge TTS/kokoro fall short, (8) batch audio for blog posts or content pipelines. Triggers: 'omnivoice', 'voice clone', 'clone this voice', 'tts', 'narrate', 'generate speech', 'voice synthesis', 'dub video', 'voice design', 'local tts', 'multilingual voice', 'narrate this post', 'elevenlabs alternative'.

Install
npx skills add 'https://github.com/debpalash/VoiceStudio/tree/main/.claude/skills/omnivoice'
Download bundle ↓
main · 4e55180Scanned 2026-09-15

Contributors

GitHub-linked commit authors for this SKILL.md at the saved revision. Co-authors and history before file renames are not included.

File history ↗
View on GitHub
← Back to SKILL.md

VoiceStudio MCP Setup, Lifecycle, Troubleshooting

Install

# Pick any location. The scripts in this skill default to ~/VoiceStudio if
# $OMNIVOICE_HOME is unset.
export OMNIVOICE_HOME="${HOME}/VoiceStudio"

git clone https://github.com/debpalash/VoiceStudio.git "$OMNIVOICE_HOME"
cd "$OMNIVOICE_HOME"
uv sync                                                  # ~1.6 GB venv on darwin arm64
VIRTUAL_ENV="$(pwd)/.venv" uv pip install 'mcp[cli]'     # SDK not in their lockfile yet

Any non-default install location works as long as $OMNIVOICE_HOME is set in the env that launches the MCP server.

MCP Wiring

Drop into your MCP client config (Claude Desktop, Claude Code at ~/.claude.json, Cursor, OpenClaw, etc.). Replace <OMNIVOICE_HOME> with the absolute path:

{
  "mcpServers": {
    "omnivoice": {
      "type": "stdio",
      "command": "uv",
      "args": [
        "--directory", "<OMNIVOICE_HOME>",
        "run", "python", "-m", "backend.mcp_server"
      ],
      "env": { "OMNIVOICE_API_URL": "http://localhost:3900" }
    }
  }
}

Restart the MCP client. The server only starts at client launch — in-session edits do not hot-reload.

Note (mcp SDK ≥ 1.10): If you see TypeError: FastMCP.__init__() got an unexpected keyword argument 'version', your VoiceStudio checkout is older than debpalash/VoiceStudio#112. Either git pull once that PR lands, or apply the 3-line patch manually: replace version="…", description=(…) with instructions=(…) in backend/mcp_server.py.

Backend Lifecycle

The MCP server needs the FastAPI backend running:

# Foreground (logs in terminal)
cd "$OMNIVOICE_HOME"
uv run uvicorn main:app --app-dir backend --host 127.0.0.1 --port 3900

# Detached, via the helper script in this skill
scripts/start-backend.sh                                  # idempotent
scripts/check-health.sh                                   # exit 0/1
scripts/stop-backend.sh                                   # graceful SIGTERM

127.0.0.1 keeps the API local-only. The project's package.json defaults to 0.0.0.0 which exposes the API on all interfaces — wider than needed for personal use.

First boot runs alembic migrations on the SQLite settings DB at <data_dir>/omnivoice.db. Idempotent — safe to re-run.

First synthesis call lazy-downloads the k2-fsa/OmniVoice model (~2.4 GB) into the HuggingFace cache. Path varies by OS:

  • macOS / Linux: ~/.cache/huggingface/hub/
  • Windows: %LOCALAPPDATA%\OmniVoice\hf_cache (VoiceStudio redirects via backend/core/config.py to keep the cache off the system drive root)

Cached on subsequent boots.

Idle Behavior

GET /system/info exposes idle_timeout_seconds: 900. After 15 min of no synthesis, the diffusion model is evicted from GPU memory but the FastAPI server stays up. Next call pays ~5-10 s warm-up.

Environment Variables

VarDefaultPurpose
OMNIVOICE_HOME~/VoiceStudioWhere the VoiceStudio repo is cloned (used by scripts in this skill)
OMNIVOICE_API_URLhttp://localhost:3900MCP server's target backend URL
OMNIVOICE_TTS_BACKENDomnivoiceSwitch engine: cosyvoice, mlx-audio, voxcpm2, moss-tts-nano, kittentts
HF_TOKEN(none)Only needed for gated pyannote diarization models — basic TTS does not require one

Troubleshooting

SymptomCauseFix
MCP tool returns connection errorBackend not runningscripts/start-backend.sh
address already in useStale uvicorn on 3900lsof -nP -iTCP:3900 -sTCP:LISTENkill -TERM <pid>
FastMCP.__init__() got unexpected keyword argument 'version'mcp SDK ≥ 1.10 dropped version/description, checkout pre-dates #112Update the checkout or apply the 3-line patch manually
First call hangs 5-10 minModel download from HuggingFaceWatch ~/.cache/huggingface/hub/models--k2-fsa--OmniVoice/ grow
/health returns 500Alembic migration failedInspect <data_dir>/crash_log.txt
Voice profile not foundprofile_id invalid or profile not yet createdlist_voices first to get valid IDs
pyannote.audio errors at startupMissing HF_TOKEN for diarizationOnly matters for dub pipeline; basic TTS unaffected
Generation slow on Apple SiliconDiffusion fell back to CPU/health should return "device":"mps". Lower steps from 16 → 8 for drafts

Clean teardown

scripts/stop-backend.sh                                   # graceful shutdown
# Uninstall: rm -rf "$OMNIVOICE_HOME" ~/.cache/huggingface/hub/models--k2-fsa--OmniVoice
# Remove the `omnivoice` entry from your MCP client config

User profiles + history live in the platform data dir (~/Library/Application Support/OmniVoice/ on macOS; ~/.local/share/VoiceStudio/ on Linux). Preserve across reinstalls if you want to keep your saved voice profiles.

Referenced from SKILL.md