Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate ElevenLabs text-to-speech audio from scripts or inline text using local voice profiles. Use when the user asks for ElevenLabs, text-to-speech, TTS, narration, voiceover, speech audio, or voice generation; load voice names, voice ids, emails, owners, and account-specific defaults only from local config outside the skill.
.claude/skills/mengto-elevenlabs-tts/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -19% | 0% |
| case-17 | ✗→✓ | ▲ Improved | -6% | 0% |
Use this skill for ElevenLabs text-to-speech generation. Keep the skill reusable and non-personal:
ELEVENLABS_API_KEY from the process environment or the nearest .env.Prefer one of these config sources, in order:
--config /path/to/profiles.jsonELEVENLABS_TTS_CONFIG=/path/to/profiles.jsonlocal/elevenlabs/profiles.jsonProject-local profile files are also fine when they are gitignored, for example config/local/elevenlabs-tts.json.
The helper script expects this shape:
json{ "default_profile": "default", "profiles": { "default": { "voice_name": "Voice name from the local account", "voice_id": "optional-direct-voice-id", "voice_id_env": "OPTIONAL_ENV_VAR_WITH_VOICE_ID", "model_id": "eleven_multilingual_v2", "output_format": "mp3_44100_128", "voice_settings": { "stability": 0.5, "similarity_boost": 1.0, "style": 0.0, "speed": 1.0, "use_speaker_boost": true }, "output_dir": "outputs/voiceovers", "emails": [] } } }
Fields like emails, owners, aliases, and notes are for local routing/context only. The script ignores unknown metadata fields.
--profile, ELEVENLABS_TTS_PROFILE, or default_profile.python3 <skill-root>/scripts/generate_voice.py --text-file script.txt --profile default --output output.mp3
voice_id, use it. If it has voice_id_env, read that env var. Otherwise search ElevenLabs by voice_name.model_id, output_format, and voice_settings unless the user overrides them for this generation.output_dir, then outputs/voiceovers/.The bundled script supports:
--text "..." for inline text--text-file path.txt for script files--text nor --text-file is provided--profile name to select a local profile--config path.json to select a local profile file--voice-id, --voice-name, --model-id, --output-format, and --settings-json for one-off overrides--output path.mp3 to choose the output file--dry-run to print the resolved request payload without calling the text-to-speech endpoint--list-voices to list matching ElevenLabs voices without generating audioUse the current ElevenLabs endpoints:
GET https://api.elevenlabs.io/v2/voicesPOST https://api.elevenlabs.io/v1/text-to-speech/:voice_id?output_format=...Send the API key as xi-api-key.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 6,636 | 4,558 | -31% | 1 | 1 | 0% | 1,095 | 1,138 | +4% | 0 | 0 | — |
case-02 | fail→fail | 4,818 | 4,292 | -11% | 1 | 1 | 0% | 961 | 1,099 | +14% | 0 | 0 | — |
case-03 | fail→fail | 6,366 | 5,687 | -11% | 1 | 1 | 0% | 1,181 | 1,311 | +11% | 0 | 0 | — |
case-04 | pass→pass | 10,383 | 2,090 | -80% | 1 | 1 | 0% | 1,833 | 1,267 | -31% | 0 | 0 | — |
case-05 | fail→pass | 4,888 | 1,311 | -73% | 1 | 1 | 0% | 903 | 1,110 | +23% | 0 | 0 | — |
case-06 | pass→pass | 3,297 | 1,712 | -48% | 1 | 1 | 0% | 742 | 1,175 | +58% | 0 | 0 | — |
case-07 | pass→pass | 1,864 | 1,420 | -24% | 1 | 1 | 0% | 360 | 1,115 | +210% | 0 | 0 | — |
case-08 | pass→pass | 6,666 | 2,631 | -61% | 1 | 1 | 0% | 1,025 | 1,109 | +8% | 0 | 0 | — |
case-09 | fail→pass | 6,545 | 1,629 | -75% | 1 | 1 | 0% | 1,204 | 1,159 | -4% | 0 | 0 | — |
case-10 | fail→pass | 5,917 | 2,034 | -66% | 1 | 1 | 0% | 1,029 | 1,212 | +18% | 0 | 0 | — |
case-11 | fail→pass | 8,075 | 1,630 | -80% | 1 | 1 | 0% | 1,417 | 1,151 | -19% | 0 | 0 | — |
case-12 | pass→pass | 7,417 | 1,611 | -78% | 1 | 1 | 0% | 1,204 | 1,216 | +1% | 0 | 0 | — |
case-13 | pass→pass | 5,193 | 1,724 | -67% | 1 | 1 | 0% | 853 | 1,235 | +45% | 0 | 0 | — |
case-14 | pass→pass | 5,943 | 1,812 | -70% | 1 | 1 | 0% | 1,000 | 1,242 | +24% | 0 | 0 | — |
case-15 | pass→pass | 5,066 | 1,931 | -62% | 1 | 1 | 0% | 1,013 | 1,318 | +30% | 0 | 0 | — |
case-16 | pass→pass | 9,648 | 3,803 | -61% | 1 | 1 | 0% | 2,094 | 1,566 | -25% | 0 | 0 | — |
case-17 | fail→pass | 7,613 | 1,470 | -81% | 1 | 1 | 0% | 1,191 | 1,114 | -6% | 0 | 0 | — |
case-18 | fail→pass | 7,661 | 2,984 | -61% | 1 | 1 | 0% | 1,345 | 1,436 | +7% | 0 | 0 | — |
case-19 | pass→pass | 5,290 | 1,722 | -67% | 1 | 1 | 0% | 816 | 1,118 | +37% | 0 | 0 | — |
case-20 | pass→pass | 11,590 | 10,240 | -12% | 1 | 1 | 0% | 2,335 | 3,128 | +34% | 0 | 0 | — |
case-21 | pass→pass | 9,744 | 5,553 | -43% | 1 | 1 | 0% | 1,915 | 1,952 | +2% | 0 | 0 | — |
case-22 | pass→pass | 5,577 | 2,793 | -50% | 1 | 1 | 0% | 1,196 | 1,420 | +19% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +27 percentage points is the difference between those two pass rates over the 19 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.