Skip to main content
Glama

mcp-voice-studio

MCP server wrapper for VoiceStudio (debpalash) — local voice cloning & TTS via the OmniVoice engine.

Exposes 6 tools to any MCP client (Trae IDE, Claude Desktop, etc.):

Tool

What it does

clone_voice_from_audio

Save a voice profile from 5-30s of reference audio + transcript

synthesize_speech

Generate speech with a cloned voice OR voice design keywords (or both)

design_voice

Generate speech using only voice design (no cloned voice)

list_voices

List all saved voice profiles

get_voice_info

Get metadata of a single voice profile

delete_voice

Delete a voice profile and its ref audio

Free & local. No API costs, all inference runs on your GPU (tested on NVIDIA GB10 sm_120 / DGX Spark). Uses OmniVoice (Apache 2.0) + higgs-audio-v2-tokenizer (MIT).


Why this exists

VoiceStudio is a great local ElevenLabs alternative (AGPL-3.0, 1.3k+ stars) but it ships as a CLI + Gradio UI. This wrapper exposes it as an MCP server so you can:

  • Call voice cloning / TTS from any MCP-compatible agent

  • Programmatically manage voice profiles (create, list, delete)

  • Reuse a single VoiceStudio venv across multiple tools without spawning Gradio


Related MCP server: MCP TTS Server

Install (DGX Spark / aarch64+CUDA)

1. Clone this repo + VoiceStudio (sibling)

mkdir -p ~/Repositories
cd ~/Repositories
git clone https://github.com/debpalash/VoiceStudio.git
git clone <this-repo>   mcp-voice-studio

2. Build VoiceStudio venv (one-time, ~5min)

Follow the procedure in .agent/README-voice-studio-dgx.md (L24-L28):

cd VoiceStudio
# patch pyproject (remove aarch64 marker, pin torch 2.11+cu128, etc.)
bash /home/jagones/Repositories/trash/patch_pyproject.sh
bash /home/jagones/Repositories/trash/fix_torchvision_pin.sh
# build venv
export PATH="$HOME/.local/bin:$PATH"
rm -rf .venv uv.lock
uv lock && uv sync --python 3.12
# install torchcodec + cu12 NPP
source .venv/bin/activate
bash /home/jagones/Repositories/trash/install_torchcodec.sh
bash /home/jagones/Repositories/trash/install_nvidia_cu12.sh
bash /home/jagones/Repositories/trash/upgrade_nvidia_cu128.sh
# verify
python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
# True NVIDIA GB10

3. Build this MCP venv (lightweight, ~30s)

cd ../mcp-voice-studio
cp .env.template .env
# edit .env: set HF_TOKEN (free at https://huggingface.co/settings/tokens)
export PATH="$HOME/.local/bin:$PATH"
uv sync

The MCP venv reuses the heavy torch+CUDA libs from VoiceStudio's venv via the engine wrapper (mcp_voice_studio/core/engine.py). The MCP venv only needs mcp + pydantic.

4. Test

uv run python -c "from mcp_voice_studio.server import mcp; print('tools:', [t.name for t in mcp._tool_manager._tools.values()])"

Expected:

tools: ['tool_clone_voice_from_audio', 'tool_synthesize_speech', 'tool_design_voice', 'tool_list_voices', 'tool_get_voice_info', 'tool_delete_voice']

Register in MCP clients

Trae IDE (Windows)

Add to .mcp.json (project root or ~/.trae/mcp.json):

{
  "mcpServers": {
    "voice-studio": {
      "command": "ssh",
      "args": [
        "dgx",
        "cd /home/jagones/Repositories/mcp-voice-studio && /home/jagones/.local/bin/uv run --no-sync python -m mcp_voice_studio"
      ],
      "env": {
        "HF_TOKEN": "hf_xxx",
        "VOICESTUDIO_VENV": "/home/jagones/Repositories/VoiceStudio/.venv"
      }
    }
  }
}

Replace dgx with your SSH host alias, and hf_xxx with your real HF token (free).

Claude Desktop

claude_desktop_config.json:

{
  "mcpServers": {
    "voice-studio": {
      "command": "ssh",
      "args": ["dgx", "cd /home/jagones/Repositories/mcp-voice-studio && /home/jagones/.local/bin/uv run --no-sync python -m mcp_voice_studio"]
    }
  }
}

Usage examples (from an MCP client)

Clone a voice from a 6-second sample

> Use clone_voice_from_audio to save a voice called "claudia_asmr"
> from /home/jagones/Repositories/VoiceStudio/inputs/asmr_sample.wav
> with ref_text "Hola, soy Claudia. Esta es una muestra de mi voz en estilo ASMR."

Tool response:

{
  "status": "ok",
  "voice_name": "claudia_asmr",
  "profile_path": "/home/jagones/Repositories/mcp-voice-studio/mcp_voice_studio/data/voices/claudia_asmr/profile.json",
  "ref_audio_path": ".../data/voices/claudia_asmr/ref_audio.wav"
}

Generate ASMR speech with the cloned voice

> Use synthesize_speech with voice_name="claudia_asmr", text="Benvenuto, chiudi gli occhi, fai un respiro profondo..."

Tool response:

{
  "output_path": "/home/jagones/Repositories/mcp-voice-studio/mcp_voice_studio/data/outputs/synth_1757062500.wav",
  "duration_s": 24.04,
  "sample_rate": 24000,
  "channels": 1,
  "model": "k2-fsa/OmniVoice",
  "voice_name": "claudia_asmr",
  "generation_time_s": 47.3
}

ASMR enhancements (post-synth DSP pipeline)

synthesize_speech and design_voice accept 5 optional ASMR parameters. All are applied as a deterministic post-processing pipeline on the generated mono WAV (numpy + scipy, no extra GPU). The output is stereo whenever any pan/reverb effect is active.

The pipeline runs in this order: highpass (60Hz) → lowpass → stereo_pan → reverb (with HF damping) → binaural_beat → silence_padding. The highpass is always on by default to remove DC offset and sub-bass rumble that synthetic voices can carry.

Param

Type

Effect

ASMR sweet spot

stereo_pan

center | L | R | L<->R | L->R | R->L

Stereo panning law (constant-power). L<->R = alternating L/R per period_s; L->R/R->L = sawtooth sweep.

L<->R with period_s=2.03.0

silence_padding_ms

int (0–5000)

Inserts ms of silence at every . ? ! boundary (position weighted by sentence length).

400–800 ms

reverb

none | small_room | large_room

Schroeder reverb (4 comb + 2 allpass filters, 18 % mix) with HF damping filter (damping=0.5 default) on each comb to avoid the classic "metallic" ring.

small_room

binaural_beat_hz

float (0–40)

Adds a sine wave to L (200 Hz) and a slightly-detuned sine to R. Perceived as a brainwave entrainment tone. Amplitude is fixed at 0.0005 (-66dBFS, true sub-audible carrier) — only the 4–8 Hz pulsation is heard, never the 200 Hz tone itself. OFF by default to keep the output clean; pass a positive value to enable.

4–8 Hz (theta-alpha)

lowpass_cutoff_hz

float (0–20000)

2nd-order Butterworth lowpass for "warmth" / intimacy.

5000–7000 Hz

Example — full ASMR stack:

> Use synthesize_speech with:
    voice_name="claudia_asmr"
    text="Ascolta il mio respiro. Lascia andare ogni tensione. Sei al sicuro."
    stereo_pan="L<->R"
    silence_padding_ms=600
    reverb="small_room"
    lowpass_cutoff_hz=6500.0

Response:

{
  "output_path": ".../synth_1757064500.wav",
  "duration_s": 8.83,
  "sample_rate": 24000,
  "channels": 2,
  "asmr_applied": [
    "lowpass(6500Hz)", "stereo_pan(L<->R)", "reverb(small_room)",
    "binaural_beat(6Hz)", "silence_padding(600ms)"
  ],
  "generation_time_s": 17.6
}

The asmr_applied list reports exactly which effects ran (so you can distinguish "nothing applied" from "applied but no audible effect"). Order in the pipeline: lowpass → pan → reverb → binaural → silence padding.

Voice design without cloning

> Use design_voice with instruct="whisper, female, low pitch", text="Hello world"

Combine cloning + design

> Use synthesize_speech with voice_name="claudia_asmr", instruct="whisper", text="..."

(cloned voice + extra style instruction)

List / inspect / delete

> list_voices
> get_voice_info(voice_name="claudia_asmr")
> delete_voice(voice_name="claudia_asmr")

Voice design keywords (OmniVoice)

Only these are accepted by OmniVoice's --instruct (case-sensitive, comma+space separated, English OR Chinese, never mix):

English: american accent, australian accent, british accent, canadian accent, child, chinese accent, elderly, female, high pitch, indian accent, japanese accent, korean accent, low pitch, male, middle-aged, moderate pitch, portuguese accent, russian accent, teenager, very high pitch, very low pitch, whisper, young adult

Chinese (full-width comma ,): 东北话,中年,中音调,云南话,低音调,儿童,四川话,女,宁夏话,少年,极低音调,极高音调,桂林话,河南话,济南话,甘肃话,男,石家庄话,老年,耳语,贵州话,陕西话,青岛话,青年,高音调

For ASMR whisper: whisper, female, low pitch


Architecture

mcp-voice-studio/
├── pyproject.toml                 # mcp + pydantic + numpy + scipy (no torch!)
├── mcp_voice_studio/
│   ├── server.py                  # FastMCP entry, registers 6 tools
│   ├── core/
│   │   ├── config.py              # paths, env (HF_TOKEN, VOICESTUDIO_VENV, CUDA_VISIBLE_DEVICES)
│   │   ├── models.py              # Pydantic: VoiceProfile, SynthRequest, SynthResult
│   │   ├── storage.py             # JSON+ref_audio persistence per voice profile
│   │   ├── engine.py              # auto-fallback: subprocess omnivoice-infer → inproc import
│   │   └── asmr.py                # DSP post-processor: pan, padding, reverb, binaural, lowpass
│   ├── tools/
│   │   ├── clone_voice.py         # clone_voice_from_audio
│   │   ├── synthesize.py          # synthesize_speech, design_voice
│   │   └── manage.py              # list_voices, get_voice_info, delete_voice
│   └── data/                      # gitignored runtime data
│       ├── voices/<name>/         # per-voice: ref_audio.wav, ref_text.txt, profile.json
│       ├── outputs/               # generated WAVs
│       ├── logs/                  # synthesis logs
│       └── inputs/                # default reference audio
├── tests/                         # pytest
├── examples/                      # usage examples + mcp_config.json
└── docs/                          # architecture, API

Engine wrapper: auto-fallback

mcp_voice_studio/core/engine.py tries two execution modes:

  1. Subprocess (default): spawns uv run --no-sync omnivoice-infer ... from VoiceStudio's venv.

    • Pro: isolates GPU state, most robust, no version coupling

    • Con: ~1s spawn overhead per call

  2. In-process (fallback): adds VoiceStudio's site-packages to sys.path and imports omnivoice directly.

    • Pro: faster (no spawn)

    • Con: requires VoiceStudio venv to be importable in this venv

Auto-fallback: if subprocess fails because the binary is missing, switches to in-process.

LD_LIBRARY_PATH for cu12 NPP

torchcodec (used by torchaudio 2.11) loads libnppicc.so.12. DGX Spark only has CUDA 13 system libs. The engine wrapper sets LD_LIBRARY_PATH to point at the pip-installed nvidia-npp-cu12==12.4.1.87 (from VoiceStudio venv) BEFORE the system CUDA 13 path. This avoids the TLS clash caused by symlinks (see .agent/README-voice-studio-dgx.md L26).


Standalone scripts (no MCP client needed)

Two scripts under scripts/ let you run the cloning + ASMR pipeline from a terminal (useful for batch jobs or quick testing).

apply_asmr_effects.py — DSP-only on an existing WAV (no GPU, runs anywhere)

python scripts/apply_asmr_effects.py INPUT.wav OUTPUT.wav --text "..." [options]

Flag

Default

Effect

--stereo-pan

off

center/L/R/L<->R/L->R/R->L

--period-s

2.0

L<->R/L->R period in seconds

--silence-padding-ms

0

silence padding at sentence boundaries (0-5000)

--reverb

off

none/small_room/large_room

--reverb-damping

0.5

HF damping 0..1 (0=classic Schroeder)

--binaural-beat-hz

0.0

0=off, 4-8=theta-alpha

--binaural-amplitude

0.0005

carrier peak (default -66dBFS sub-audible)

--lowpass-cutoff-hz

0

0=off, 5000-7000 sweet spot

--highpass-cutoff-hz

60.0

0=off, 60Hz = DC/sub-bass cleanup

Example:

python scripts/apply_asmr_effects.py voice.wav out.wav \
    --text "Benvenuto. Chiudi gli occhi. Respira." \
    --stereo-pan "L<->R" --period-s 2.5 \
    --silence-padding-ms 600 \
    --reverb small_room \
    --lowpass-cutoff-hz 6500.0

clone_and_speak.py — E2E: clone/design + synthesize + ASMR (needs DGX/GPU)

# Cloned voice
python scripts/clone_and_speak.py --voice claudia_asmr \
    --text "Ascolta il mio respiro. Sei al sicuro." \
    --out out.wav \
    --stereo-pan "L<->R" --silence-padding-ms 600 --reverb small_room

# Voice design (no clone)
python scripts/clone_and_speak.py --instruct "whisper, female, low pitch" \
    --text "Hello world" --out out.wav --reverb small_room

Both scripts call the same code paths the MCP tools use (synthesize_speech for TTS, apply_asmr_pipeline for DSP), so output is identical to what you'd get from an MCP client.


License

MIT. See LICENSE and THIRD_PARTY_LICENSES.md for the full picture.

TL;DR for publishing on GitHub:

  • This wrapper (this repo) is MIT — you can publish, fork, modify freely.

  • VoiceStudio is AGPL-3.0 — installed separately via git clone, NOT bundled here. Subprocess invocation does not extend AGPL to this wrapper (mere aggregation per FSF interpretation).

  • OmniVoice is Apache 2.0, higgs-audio-v2-tokenizer is MIT — both downloaded from Hugging Face at runtime, NOT bundled.

  • If you offer VoiceStudio's functionality as a network service, AGPL section 13 requires you to make the VoiceStudio source available to your users (irrelevant for local/personal use).

Available Tools

6 tools
tool_clone_voice_from_audioA

Save a voice profile from a reference audio (5-30s WAV ideal).

Two input modes (EITHER ref_audio_path OR audio_url must be provided, not both): A) Local file: pass ref_audio_path='/path/to/sample.wav'. B) URL clip: pass audio_url='https://youtu.be/...', ts=30, tf=45. yt-dlp downloads the audio and ffmpeg slices [ts, tf] into a 24kHz mono 16-bit PCM WAV, which is then used as the reference.

Workflow:

  1. Pick a clean 5-30s speech sample (local file OR URL clip).

  2. Write the exact transcript in ref_text.

  3. Pick a memorable voice_name (used later as voice_name= in synthesize_speech).

  4. Returns a dict with 'status', 'voice_name', 'profile_path', 'ref_audio_path', and (for URL mode) 'source_url', 'ts', 'tf', 'clip_duration_s'.

Common errors:

  • both ref_audio_path and audio_url provided: pick one.

  • voice_exists: pass overwrite=True or pick a different voice_name.

  • bad local path: check the path exists and is readable.

  • bad URL: yt-dlp/ffmpeg failure will be reported in the raised RuntimeError.

ParametersJSON Schema
NameRequiredDescriptionDefault
tfNoMode B only: end second of the URL clip (default: end of stream). Example: ts=30, tf=45 yields a 15-second clip from 30s to 45s. Voice cloning needs >=3s; 5-30s is the ideal range. Ignored if audio_url is not provided.
tsNoMode B only: start second of the URL clip (default 0). Example: ts=30 starts at 30s into the video. Combined with tf, defines the [ts, tf] clip window.
languageNoLanguage of the reference audio. 'auto' (default, OmniVoice detects), or one of: 'English', 'Italian', 'French', 'German', 'Spanish', etc.auto
ref_textYesExact transcript of what is spoken in the reference audio, including punctuation. OmniVoice uses this for prosody matching. Wrong transcripts degrade clone quality. Required in BOTH input modes (local file or URL clip).
audio_urlNoMode B: YouTube (or any yt-dlp-supported) URL. Combined with ts/tf it downloads + slices a clip into a temp file and uses that as the reference. Example: 'https://www.youtube.com/watch?v=21X5lGlDOfg'. SUGGESTED DURATION: 5-30 seconds ideal for voice cloning. Pipeline: yt-dlp download -> ffmpeg slice [ts, tf] -> 24kHz mono 16-bit PCM WAV. Use EITHER this OR ref_audio_path, not both.
overwriteNoIf True, replace an existing profile with the same voice_name. Default: False.
voice_nameYesUnique identifier for this voice (alphanumeric + underscores, 1-64 chars). Will be slugified. Use a memorable name like 'claudia_asmr' or 'nasa_male_v1'. Used in subsequent synthesize_speech(voice_name=...) calls.
descriptionNoOptional human-readable description (e.g. 'ASMR whisper, female, CC0 from archive.org' or 'NASA mission audio, male, PD US Gov').
ref_audio_pathNoMode A: absolute path to the reference audio file (WAV, 16-bit PCM, 24kHz ideal). 5-30 seconds of clear, single-speaker speech works best. Example: '/home/jagones/Repositories/VoiceStudio/inputs/asmr_sample.wav'. Use EITHER this OR audio_url, not both. Omit both to get a validation error.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral burden and delivers rich disclosure: the exact transformation pipeline (yt-dlp download -> ffmpeg slice [ts, tf] -> 24kHz mono 16-bit PCM WAV), validation behavior (providing both modes fails; omitting both fails), overwrite semantics, voice_name slugification, and precise failure reporting ('yt-dlp/ffmpeg failure will be reported in the raised RuntimeError'). It even discloses the full return-dict shape, which is essential given there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but exceellently structured: purpose line up front, mode blocks, numbered workflow, and error bullet list — highly scannable. Minor redundancy exists (the 5-30s ideal and 24kHz format appear multiple times across description and schema), but the length is proportionate to a 9-parameter, two-mode tool and every block serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-complexity tool with no annotations and no output schema, this description is remarkably complete: it covers input modes, prerequisites, transformation side-effects, exact return keys, and all realistic failure modes. The only omissions (rate limits, timeouts) are minor for a local-file/URL pipeline, and the description compensates fully for the missing structured metadata.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds meaning beyond the per-property schema text by grouping parameters into modes (A: ref_audio_path; B: audio_url + ts + tf), sequencing them in a workflow ('Write the exact transcript in ref_text' before picking a name), and linking voice_name to downstream synthesize_speech calls. This cross-parameter framing helps an agent reason about parameter relationships without redundantly restating schema content.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific action verb and resource: 'Save a voice profile from a reference audio (5-30s WAV ideal)'. The two input modes (local file vs URL clip) and the numbered workflow make the tool's function unambiguous, and the explicit tie to 'used later as voice_name= in synthesize_speech' positions it distinctly from siblings like list_voices, delete_voice, and design_voice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: prerequisites (5-30s clean single-speaker speech, exact transcript), a numbered 4-step workflow, mode-selection rules ('EITHER ref_audio_path OR audio_url must be provided, not both'), and common-error remedies (overwrite=True for existing voice names). It does not explicitly name tool_design_voice as the alternative when no reference audio exists, so the exclusions dimension is slightly incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_delete_voiceA

Delete a voice profile and its reference audio file. Cannot be undone.

Use this to free disk space or clean up test voices. The voice will no longer appear in list_voices and synthesize_speech with this voice_name will fail.

ParametersJSON Schema
NameRequiredDescriptionDefault
voice_nameYesVoice name to delete. IRREVERSIBLE - removes profile + reference audio.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and directly discloses the key behavioral traits: irreversibility, removal of the reference audio file, and resulting failures in list_voices and synthesize_speech. This is strong transparency for a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no filler. The action and irreversibility come first, followed by use cases and then downstream effects. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool with no output schema, the description fully covers what is deleted, when to use it, and what changes afterward. An agent has enough information to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the voice_name parameter as IRREVERSIBLE and states that it removes profile plus reference audio. The description adds downstream consequence context but does not need to explain parameter format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Delete a voice profile and its reference audio file.' It clearly distinguishes this from sibling tools by stating the destructive action and permanent consequences.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit use cases: 'free disk space or clean up test voices.' It does not name alternatives because no sibling deletion tool exists, and it clearly warns about the effects after deletion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_design_voiceA

Generate speech using voice design keywords only (no cloned voice).

Same ASMR params as synthesize_speech. Use this when you want a one-off voice without persisting a profile. For reusable voices, clone first with clone_voice_from_audio then call synthesize_speech with voice_name.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to speak (same as synthesize_speech).
speedNoSpeech rate. 1.0 = normal.
reverbNoReverb mode: 'none' (off), 'small_room' (ASMR-tight, ~18% mix, HF-damped), 'large_room' (spacious, longer tail). None = off. Default = off.
instructYesVoice design keywords (REQUIRED for this tool). English OR Chinese, comma+space separated. Examples: 'whisper, female, low pitch' (ASMR), 'male, young adult, british accent', '女,低音调' (Chinese).
languageNoTarget language. Default: 'Italian'.Italian
num_stepNoDiffusion steps. 32 = default.
period_sNoL<->R period in seconds. ASMR sweet spot: 2-3s.
stereo_panNoStereo panning mode for ASMR. One of: 'center' (mono -> stereo, equal L/R), 'L' (hard left, R muted), 'R' (hard right, L muted), 'L<->R' (alternating L/R, ASMR 'whisper in each ear' effect, sweet spot period_s=2-3s), 'L->R' (slow sweep L to R then back, sawtooth), 'R->L' (slow sweep R to L then back, sawtooth). None = no panning (passthrough).
output_pathNoOutput WAV path. Default: data/outputs/<ts>.wav.
guidance_scaleNoCFG scale. 2.0 default.
reverb_dampingNoReverb HF damping. 0.5 default.
binaural_beat_hzNoBinaural beat frequency in Hz (L channel = 200Hz carrier, R channel = 200Hz+beat). 0 = off (default, RECOMMENDED for clean output). Perceived as brainwave entrainment: 4-8 Hz = theta-alpha (sleep/relax), 10-15 Hz = alpha-beta (focus), 15-40 Hz = beta (alert). Carrier amplitude is fixed at 0.0005 (-66dBFS, sub-audible).
lowpass_cutoff_hzNoLowpass cutoff in Hz for warmth/intimacy. 0 = off. ASMR sweet spot: 5000-7000 Hz (cuts above 7kHz for 'headphones' feel).
highpass_cutoff_hzNoHighpass cutoff in Hz for DC/sub-bass cleanup. Default = 60 Hz (always on). 0 = off. ASMR standard: 60-80 Hz to remove room rumble without affecting voice.
silence_padding_msNoMilliseconds of silence inserted between sentences (split on . ? !). Position is weighted by sentence length. 0 = off. ASMR sweet spot: 400-800 ms.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden, and it clearly discloses the key non-obvious trait: this tool does not persist a voice profile and does not use a cloned voice. It does not explicitly describe the return value or file-writing behavior, though those are partially implied by the output_path parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, no filler, with the core purpose and key distinction first, then usage guidance and alternative workflow. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter tool with no annotations and no output schema, the description covers selection, invocation, and routing to the right sibling, while the schema covers parameter details. It stops short of stating what the tool returns or writes, which would make it fully complete, but the output_path parameter fills most of that gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by tying the parameter set to synthesize_speech ('Same ASMR params') and by clarifying that instruct is a keyword-based design, not a cloned voice reference. That cross-tool context is genuinely useful and not already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific action ('Generate speech') and a specific resource/method ('voice design keywords only (no cloned voice)'), which immediately distinguishes it from cloned-voice synthesis. It also names the sibling tools that share the ASMR parameter space, so the agent can tell this tool apart from synthesize_speech and clone_voice_from_audio.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this tool for a one-off voice without persisting a profile, and it gives the alternative workflow: clone first with clone_voice_from_audio, then call synthesize_speech with voice_name for reusable voices. This is direct when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_get_voice_infoA

Get full metadata of a single saved voice profile: name, description, language, ref_audio_path, ref_text, created_at.

Use this to verify a profile exists and inspect its reference audio path before calling synthesize_speech with that voice_name.

ParametersJSON Schema
NameRequiredDescriptionDefault
voice_nameYesVoice name to inspect (from list_voices output).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the burden; it clearly indicates a read-only operation through 'Get', 'verify', and 'inspect'. It details the returned metadata fields and provides practical context, though it does not describe failure behavior when the voice does not exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loads the operation and return fields, then adds a single actionable usage sentence. Every sentence contributes value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with no output schema, the description is nearly complete: it states the result fields and the recommended invocation scenario. It could mention behavior when the profile does not exist, but an agent can reasonably infer standard error semantics from 'verify a profile exists'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents voice_name as 'from list_voices output', and the description adds that the same voice_name will be used with synthesize_speech. Since schema coverage is 100%, a baseline of 3 is appropriate; the description adds usage context but no new parameter format or type details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Get full metadata of a single saved voice profile' and enumerates the exact fields returned. It clearly distinguishes itself from siblings like list_voices by emphasizing 'single' versus collection-level listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit when-to-use scenario: 'verify a profile exists and inspect its reference audio path before calling synthesize_speech.' It does not explicitly name alternatives like list_voices for listing all profiles, but the guidance is concrete enough for an agent to select this tool correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_list_voicesA

List all saved voice profiles.

Returns: list of dicts, each with 'name', 'description', 'language', 'source', 'created_at'. Use this to discover available voice_name values before calling synthesize_speech.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral transparency burden. It clearly presents this as a read-only listing operation and discloses the return shape: 'list of dicts, each with name, description, language, source, created_at.' It does not discuss auth or rate limits, but those are not pressing for a no-parameter list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core action appears in the first sentence, the return format is summarized in one line, and the usage guidance is a single actionable sentence. No words are wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter listing tool, the description is complete. It states what the tool lists, what it returns, and provides a concrete workflow context with synthesize_speech. There are no gaps that would prevent an agent from calling it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description adds useful context by explaining that the returned voice_name values are what should be passed to synthesize_speech, which is more helpful than the empty input schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List all saved voice profiles.' It also specifies the return fields and states the tool's role in discovering available voice_name values, making it clearly distinct from sibling tools like tool_get_voice_info or tool_synthesize_speech.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit usage context: 'Use this to discover available voice_name values before calling synthesize_speech.' This clearly tells the agent when to use this tool relative to synthesis, though it does not explicitly state when not to use it or mention alternatives like tool_get_voice_info.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_synthesize_speechA

Generate speech audio with a cloned voice (from voice_name) OR voice design (from instruct), or both.

Three usage modes:

  1. Cloned voice: pass voice_name='claudia_asmr', omit instruct.

  2. Voice design: pass instruct='whisper, female, low pitch', omit voice_name.

  3. Hybrid: pass both voice_name AND instruct to add style to a cloned voice.

Returns dict with: output_path, duration_s, sample_rate, channels, model, voice_name, generation_time_s, and (if any ASMR effect ran) asmr_applied.

ASMR pipeline: highpass(60Hz) -> lowpass -> stereo_pan -> reverb -> binaural -> padding. All ASMR params default to OFF (passthrough). Output is stereo whenever any stereo-capable effect (stereo_pan, reverb, binaural_beat_hz) is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to speak. Use punctuation (. ? !) for natural pauses; combine with silence_padding_ms for ASMR-style long pauses between sentences.
speedNoSpeech rate factor. 1.0 = normal. <1 = slower (ASMR-like), >1 = faster.
reverbNoReverb mode: 'none' (off), 'small_room' (ASMR-tight, ~18% mix, HF-damped), 'large_room' (spacious, longer tail). None = off. Default = off.
instructNoVoice design keywords (OmniVoice specific, case-sensitive, English OR Chinese, comma+space separated, NEVER mix). Examples: English: 'whisper, female, low pitch' (ASMR sweet spot) English: 'male, young adult, british accent' Chinese (full-width comma ,): '女,低音调,耳语' See README §'Voice design keywords' for the full list of 22+ accepted keywords. Combine with voice_name to add style to a cloned voice.
languageNoTarget language for synthesis. Default: 'Italian'. OmniVoice supports 600+ languages. Common: 'English', 'Italian', 'French', 'German', 'Spanish', 'Japanese', 'Chinese', 'Korean'.Italian
num_stepNoDiffusion steps. Higher = better quality, slower. 32 (default) is a good balance. 16 for fast drafts, 64 for production quality.
period_sNoPeriod in seconds for L<->R/L->R/R->L panning modes. ASMR sweet spot: 2.0-3.0s. Ignored if stereo_pan is None or 'center'/'L'/'R'.
stereo_panNoStereo panning mode for ASMR. One of: 'center' (mono -> stereo, equal L/R), 'L' (hard left, R muted), 'R' (hard right, L muted), 'L<->R' (alternating L/R, ASMR 'whisper in each ear' effect, sweet spot period_s=2-3s), 'L->R' (slow sweep L to R then back, sawtooth), 'R->L' (slow sweep R to L then back, sawtooth). None = no panning (passthrough).
voice_nameNoSaved voice name from a prior clone_voice_from_audio call (e.g. 'claudia_asmr'). Optional: omit to use only voice design via 'instruct'.
output_pathNoOutput WAV path. Default: 'mcp_voice_studio/data/outputs/synth_<timestamp>.wav'. For long ASMR tests use a stable path like '/home/.../outputs/asmr_test.wav'.
guidance_scaleNoClassifier-free guidance scale. 2.0 default. Higher = more prompt-faithful.
reverb_dampingNoReverb HF damping 0..1. 0 = classic Schroeder (metallic ring at high reverb). 0.5 (default) = soft HF rolloff in reverb tail, recommended. 1.0 = heavy damping (dark tail). Ignored if reverb is None or 'none'.
binaural_beat_hzNoBinaural beat frequency in Hz (L channel = 200Hz carrier, R channel = 200Hz+beat). 0 = off (default, RECOMMENDED for clean output). Perceived as brainwave entrainment: 4-8 Hz = theta-alpha (sleep/relax), 10-15 Hz = alpha-beta (focus), 15-40 Hz = beta (alert). Carrier amplitude is fixed at 0.0005 (-66dBFS, sub-audible).
lowpass_cutoff_hzNoLowpass cutoff in Hz for warmth/intimacy. 0 = off. ASMR sweet spot: 5000-7000 Hz (cuts above 7kHz for 'headphones' feel).
highpass_cutoff_hzNoHighpass cutoff in Hz for DC/sub-bass cleanup. Default = 60 Hz (always on). 0 = off. ASMR standard: 60-80 Hz to remove room rumble without affecting voice.
silence_padding_msNoMilliseconds of silence inserted between sentences (split on . ? !). Position is weighted by sentence length. 0 = off. ASMR sweet spot: 400-800 ms.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the behavioral transparency burden, and it does so well: it discloses the ASMR pipeline order, default passthrough behavior, when output becomes stereo, and the exact return dict fields. It slightly overstates by saying 'All ASMR params default to OFF' when highpass_cutoff_hz defaults to 60 Hz (always on), which is a minor accuracy gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections: purpose, three usage modes, return value, and pipeline. It is dense but every sentence contributes useful information, and the most important decision (which mode to use) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter tool with no output schema, the description is unusually complete: it explains usage modes, return contents, effect pipeline, and stereo behavior. The main gap is that it never explicitly states that voice_name, instruct, or both are effectively required, despite the schema only listing text as required. This could lead an agent to attempt a call with only text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds genuine semantic value beyond the schema by explaining how voice_name and instruct interact in the hybrid mode, how the ASMR pipeline orders effects, and when stereo output is triggered. This goes beyond the individual parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific, action-oriented statement: 'Generate speech audio with a cloned voice OR voice design, or both.' It clearly identifies the resource (speech audio) and the two primary input sources, and the three usage modes make it easy to distinguish this synthesis tool from sibling tools like clone_voice_from_audio or design_voice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The three usage modes provide explicit, actionable instructions: pass voice_name only, pass instruct only, or pass both. It also references voice_name coming from a prior clone_voice_from_audio call, which helps route the workflow. However, it does not explicitly name sibling alternatives or say when not to use this tool, so it stops short of full when-vs-alternatives guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 6 tool updatesv0.1.0
    • First observedtool_clone_voice_from_audio
    • First observedtool_delete_voice
    • First observedtool_design_voice
    • First observedtool_get_voice_info
    • First observedtool_list_voices
    • First observedtool_synthesize_speech

TDQS

A4.4/5.0
Disambiguation3/5

Profile management tools (list/get/delete) are clearly distinct, and clone/synthesize have clear roles. However, design_voice overlaps with synthesize_speech because synthesize_speech also supports voice design via the instruct parameter; the descriptions mitigate this, but an agent could still be unsure which to call.

Naming Consistency5/5

All tool names follow a consistent tool_verb_noun snake_case pattern, with each verb clearly indicating the action. The minor noun variation between 'voice' and 'speech' is natural and does not create confusion.

Tool Count5/5

Six tools is a well-scoped size for a voice cloning and synthesis server. Each tool contributes to a clear lifecycle: profile creation, inspection, deletion, and audio generation.

Completeness5/5

The server covers the full voice-profile lifecycle: create via clone, read via list and get info, delete, and use for speech synthesis. It also offers a one-off design path, leaving no obvious critical gaps for its stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    A local voice interface providing high-performance speech recognition and natural text-to-speech with voice cloning capabilities. It enables AI assistants to speak, listen, and engage in character-based voice conversations through integrated MCP tools.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides text-to-speech conversion through a unified MCP interface, supporting both local Kokoro and cloud OpenAI TTS engines with streaming audio, voice selection, and customization via natural language instructions.
    7
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jagones84/mcp-voice-studio'

If you have feedback or need assistance with the MCP directory API, please join our Discord server