Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Convert documents and text to audio using ElevenLabs text-to-speech. Use this skill when the user wants to create a podcast, narrate a document, read aloud text, generate audio from a file, or convert text to speech.
.claude/skills/sanjay3290-elevenlabs/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -21% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -36% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 14% | 0% |
This skill converts text and documents into high-quality audio using ElevenLabs TTS API. It supports two modes: single-voice narration and two-host conversational podcast generation.
Activate when the user mentions:
Config at skills/elevenlabs/config.json:
json{ "api_key": "your-elevenlabs-api-key", "default_voice": "JBFqnCBsd6RMkjVDRZzb", "default_model": "eleven_multilingual_v2", "podcast_voice1": "JBFqnCBsd6RMkjVDRZzb", "podcast_voice2": "EXAVITQu4vr4xnSDxMaL" }
Only api_key is required. Or set ELEVENLABS_API_KEY env var.
Dependencies: pip install PyPDF2 python-docx (only needed for PDF/DOCX files).
Requires ffmpeg for multi-chunk narration and podcasts.
bashpython skills/elevenlabs/scripts/elevenlabs.py voices python skills/elevenlabs/scripts/elevenlabs.py voices --json
Use this to find voice IDs for the user.
bash# From text python skills/elevenlabs/scripts/elevenlabs.py tts --text "Hello world" --output ~/Downloads/hello.mp3 # From document python skills/elevenlabs/scripts/elevenlabs.py tts --file /path/to/doc.pdf --output ~/Downloads/narration.mp3 # With specific voice python skills/elevenlabs/scripts/elevenlabs.py tts --file doc.md --voice VOICE_ID --output out.mp3
The script handles text extraction, chunking at sentence boundaries (~4000 chars), TTS per chunk with voice continuity, and ffmpeg concatenation automatically.
Podcast mode requires a JSON script file with conversation segments:
json[ {"speaker": "host1", "text": "Welcome to our podcast! Today we're diving into..."}, {"speaker": "host2", "text": "That's right! I found the section on..."}, {"speaker": "host1", "text": "Let's break that down..."} ]
bashpython skills/elevenlabs/scripts/elevenlabs.py podcast --script /tmp/script.json --voice1 ID1 --voice2 ID2 --output ~/Downloads/podcast.mp3
When the user asks to create a podcast from a document:
bash python skills/elevenlabs/scripts/extract.py /path/to/document.pdf
python # Write to /tmp/podcast_script.json [ {"speaker": "host1", "text": "Welcome to today's episode..."}, {"speaker": "host2", "text": "Thanks for having me..."}, ... ]
bash python skills/elevenlabs/scripts/elevenlabs.py podcast --script /tmp/podcast_script.json --output ~/Downloads/podcast.mp3
voices first to let the user pick voices they like~/Downloads/ unless the user specifies otherwise| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | pass→pass | 4,431 | 7,782 | +76% | 1 | 1 | 0% | 748 | 2,415 | +223% | 0 | 0 | — |
case-01 | fail→pass | 7,288 | 15,684 | +115% | 1 | 1 | 0% | 1,430 | 1,452 | +2% | 0 | 0 | — |
case-02 | fail→fail | 7,408 | 4,553 | -39% | 1 | 1 | 0% | 1,330 | 1,401 | +5% | 0 | 0 | — |
case-03 | fail→fail | 18,304 | 3,728 | -80% | 1 | 1 | 0% | 2,922 | 1,250 | -57% | 0 | 0 | — |
case-04 | fail→fail | 3,716 | 4,142 | +11% | 1 | 1 | 0% | 648 | 1,273 | +96% | 0 | 0 | — |
case-05 | fail→fail | 12,003 | 3,775 | -69% | 1 | 1 | 0% | 2,543 | 1,875 | -26% | 0 | 0 | — |
case-06 | fail→fail | 3,918 | 4,729 | +21% | 1 | 1 | 0% | 358 | 1,349 | +277% | 0 | 0 | — |
case-07 | pass→pass | 11,082 | 2,207 | -80% | 1 | 1 | 0% | 1,993 | 1,504 | -25% | 0 | 0 | — |
case-08 | fail→pass | 5,447 | 1,965 | -64% | 1 | 1 | 0% | 916 | 1,453 | +59% | 0 | 0 | — |
case-09 | fail→pass | 9,416 | 1,855 | -80% | 1 | 1 | 0% | 1,834 | 1,452 | -21% | 0 | 0 | — |
case-10 | fail→pass | 12,055 | 1,930 | -84% | 1 | 1 | 0% | 2,045 | 1,309 | -36% | 0 | 0 | — |
case-11 | fail→pass | 6,437 | 1,807 | -72% | 1 | 1 | 0% | 1,209 | 1,384 | +14% | 0 | 0 | — |
case-12 | fail→pass | 10,296 | 1,568 | -85% | 1 | 1 | 0% | 1,842 | 1,284 | -30% | 0 | 0 | — |
case-13 | pass→pass | 5,336 | 1,725 | -68% | 1 | 1 | 0% | 866 | 1,277 | +47% | 0 | 0 | — |
case-19 | pass→pass | 9,780 | 2,522 | -74% | 1 | 1 | 0% | 1,626 | 1,445 | -11% | 0 | 0 | — |
case-14 | fail→pass | 8,050 | 1,146 | -86% | 1 | 1 | 0% | 1,423 | 1,242 | -13% | 0 | 0 | — |
case-15 | pass→pass | 7,849 | 1,272 | -84% | 1 | 1 | 0% | 1,413 | 1,264 | -11% | 0 | 0 | — |
case-16 | fail→pass | 3,415 | 1,263 | -63% | 1 | 1 | 0% | 529 | 1,324 | +150% | 0 | 0 | — |
case-17 | pass→pass | 4,774 | 1,304 | -73% | 1 | 1 | 0% | 758 | 1,304 | +72% | 0 | 0 | — |
case-18 | pass→pass | 10,510 | 2,493 | -76% | 1 | 1 | 0% | 1,786 | 1,408 | -21% | 0 | 0 | — |
case-21 | pass→pass | 5,863 | 4,008 | -32% | 1 | 1 | 0% | 824 | 1,784 | +117% | 0 | 0 | — |
case-22 | pass→pass | 9,096 | 8,190 | -10% | 1 | 1 | 0% | 1,617 | 2,459 | +52% | 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 18 counted toward the lift figure. The other 4 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 +36 percentage points is the difference between those two pass rates over the 18 comparable cases.
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.