Build a Text-to-Speech App with ElevenLabs and Python
Why ElevenLabs for Your TTS Projects? If you’ve been playing with voice AI, you’ve probably noticed that most services either sound robotic or charge a fortune for realistic speech. ElevenLabs strikes a sweet spot: hig
Why ElevenLabs for Your TTS Projects?
If you’ve been playing with voice AI, you’ve probably noticed that most services either sound robotic or charge a fortune for realistic speech. ElevenLabs strikes a sweet spot: high‑quality, natural‑sounding voices with a straightforward REST API and a Python SDK that makes integration painless. Whether you’re building a podcast‑generator, an accessibility tool, or a chatbot that actually talks back, ElevenLabs gives you the flexibility to generate speech on‑the‑fly and even clone a custom voice in minutes.
Pro tip: Sign up through the affiliate link to get a free credit boost and support the content you’re reading: https://try.elevenlabs.io/kr07zfuqn1bp
What You’ll Need
| Item | Reason |
|---|---|
| Python ≥ 3.8 | The SDK targets modern Python releases |
| An ElevenLabs API key | Authenticates your requests |
ffmpeg (optional) |
For converting the returned MP3 to WAV or other formats |
| A text file or string | The source material you want spoken |
You can install ffmpeg via your package manager (brew install ffmpeg, apt-get install ffmpeg, etc.) if you plan to do any post‑processing.
Grab Your API Key
- Head over to the ElevenLabs dashboard.
- Click API Keys → Create new key.
- Copy the key – you’ll need it in your script.
Remember to keep the key secret. Treat it like a password.
Install the Python SDK
ElevenLabs provides an officially supported package called elevenlabs. Install it with pip:
pip install --upgrade elevenlabs
If you prefer raw HTTP, you can also use requests and hit the REST endpoints directly. The SDK just wraps those calls for you.
A Minimal Text‑to‑Speech Script
Below is a fully‑functional example that takes a string, sends it to ElevenLabs, and saves the audio as an MP3 file.
import os
from elevenlabs import generate, save, set_api_key
# ----------------------------------------------------------------------
# 1️⃣ Set your API key – you can also set ELEVENLABS_API_KEY env var
# ----------------------------------------------------------------------
set_api_key("YOUR_ELEVENLABS_API_KEY") # ← replace with your real key
# ----------------------------------------------------------------------
# 2️⃣ Choose a voice. "Rachel" is a default English voice, but you can
# list all available voices via `elevenlabs.voices.get_all()`.
# ----------------------------------------------------------------------
voice_id = "Rachel" # or use a custom voice ID you created
# ----------------------------------------------------------------------
# 3️⃣ The text you want spoken
# ----------------------------------------------------------------------
text = """
Welcome to the future of voice AI! With ElevenLabs, you can generate
high‑fidelity speech in seconds. This demo shows how easy it is to
integrate text‑to‑speech into your Python apps.
"""
# ----------------------------------------------------------------------
# 4️⃣ Generate the audio bytes
# ----------------------------------------------------------------------
audio_bytes = generate(
text=text,
voice=voice_id,
model="eleven_monolingual_v1", # default model, change for multilingual
stream=False # set True for streaming large texts
)
# ----------------------------------------------------------------------
# 5️⃣ Save to a file
# ----------------------------------------------------------------------
output_path = "output.mp3"
save(audio_bytes, output_path)
print(f"✅ Audio saved to {output_path}")
How It Works
-
set_api_keystores the key for the session. -
generatecontacts ElevenLabs, runs the model, and returns raw audio bytes. -
savewrites those bytes to disk. The default format is MP3, but you can request WAV by addingoutput_format="wav"to thegeneratecall.
Adding Voice Cloning
One of ElevenLabs’ most exciting features is the ability to clone a voice from just a few minutes of audio. Here’s a quick walkthrough:
from elevenlabs import Voice, clone
# 1️⃣ Path to a short (≈30‑60 sec) sample of the target voice
sample_path = "my_voice_sample.wav"
# 2️⃣ Create a new voice clone
clone_response = clone(
name="MyCustomVoice",
description="A friendly, enthusiastic tone",
files=[sample_path],
# optional: you can specify `labels` for better model alignment
)
# 3️⃣ The response contains the new voice ID
custom_voice_id = clone_response.voice_id
print(f"✅ New voice created: {custom_voice_id}")
Once the clone is ready (usually under a minute), you can use it exactly like any built‑in voice:
audio = generate(
text="Hello, this is my very own cloned voice!",
voice=custom_voice_id,
model="eleven_multilingual_v2"
)
save(audio, "cloned_voice.mp3")
Note: Voice cloning consumes more credits than plain TTS, so keep an eye on your usage in the ElevenLabs dashboard.
Handling Errors Gracefully
Network hiccups and quota limits happen. Wrap your calls in try/except blocks to provide useful feedback.
from elevenlabs import ElevenLabsError
try:
audio = generate(text="Testing error handling", voice="Rachel")
save(audio, "test.mp3")
except ElevenLabsError as e:
# e.status_code, e.message give you details
print(f"❌ API error ({e.status_code}): {e.message}")
except Exception as exc:
print(f"❗ Unexpected error: {exc}")
You can also inspect the rate_limit field in the error response to back‑off automatically.
Going Beyond: Streaming & Real‑Time Use Cases
For longer passages or real‑time applications (e.g., a voice assistant), enable streaming:
for chunk in generate(
text="This is a very long paragraph that we want to stream...",
voice="Rachel",
stream=True,
chunk_size=1024
):
# `chunk` is a bytes object; you could pipe it to a media player
process_chunk(chunk) # placeholder for your own handling logic
Streaming reduces memory overhead and lets you start playback before the entire synthesis finishes.
Next Steps & Ideas
- Batch processing: Loop over a CSV of sentences and generate a podcast episode automatically.
- Web integration: Use Flask or FastAPI to expose an endpoint that returns MP3 data on demand.
-
Multilingual support: Switch the model to
eleven_multilingual_v2and feed non‑English text. - Dynamic voice selection: Store user‑preferred voice IDs in a database and retrieve them at runtime.
All of these patterns boil down to a few lines of Python once the SDK is in place.
Wrap‑Up
ElevenLabs makes high‑quality text‑to‑speech and voice cloning accessible without sacrificing developer ergonomics. With just a few lines of code you can generate natural speech, clone custom voices, and even stream audio for real‑time experiences. The SDK abstracts away the REST boilerplate, letting you focus on the product you’re building.
Ready to give your app a voice? Grab an API key, fire up the script above, and start experimenting.
🚀 Try ElevenLabs today and bring your projects to life: https://try.elevenlabs.io/kr07zfuqn1bp
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.