Four Python text-to-speech options cover nearly every use case: pyttsx3 for offline/no-API-key needs, gTTS for quick cloud-based conversion, Coqui TTS for open-source customization, and ElevenLabs for near-human quality. Here’s how each actually works in code, and which one fits your project.
pyttsx3: Offline, No API Key Required
pyttsx3 works entirely offline, unlike every other option here — no internet connection or API key needed, which makes it the right default for scripts that need to run in restricted environments or without external dependencies. The tradeoff is voice quality: it uses your OS’s built-in TTS engines, so output sounds noticeably more robotic than cloud alternatives.
import pyttsx3
engine = pyttsx3.init()
engine.setProperty('rate', 150) # words per minute
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)
engine.save_to_file('Your text here.', 'output.mp3')
engine.runAndWait()
gTTS: Fast, Simple, 100+ Languages
gTTS uses the Google Text-to-Speech API and requires an internet connection, but leads on language breadth — over 100 languages supported — and setup couldn’t be simpler. It’s the right choice when you need quick, decent-quality output and don’t need fine-grained voice control.
from gtts import gTTS
tts = gTTS(text='Your text here.', lang='en', slow=False)
tts.save('output.mp3')
Coqui TTS: Open-Source and Customizable
Coqui TTS offers advanced, open-source models capable of highly realistic and expressive speech, including voice cloning through its XTTS models — output quality that can now rival mid-tier commercial voices. The real cost is setup complexity: it requires meaningfully more technical effort than gTTS or pyttsx3, and it isn’t built for real-time responsiveness, so it fits engineering-heavy projects better than a quick script.
from TTS.api import TTS
tts = TTS(model_name="tts_models/en/ljspeech/tacotron2-DDC")
tts.tts_to_file(text="Your text here.", file_path="output.wav")
ElevenLabs: Near-Human Quality via API
ElevenLabs delivers the most realistic output of the four, with expressive speech and voice cloning suited to production applications — podcasts, audiobooks, video narration — where listeners will notice robotic-sounding TTS immediately. It’s API-based and paid beyond a limited free tier, but the quality gap over the free/open-source options is real and easy to hear.
from elevenlabs.client import ElevenLabs
client = ElevenLabs(api_key="YOUR_API_KEY")
audio = client.text_to_speech.convert(
voice_id="JBFqnCBsd6RMkjVDRZzb",
text="Your text here.",
model_id="eleven_multilingual_v2"
)
with open("output.mp3", "wb") as f:
for chunk in audio:
f.write(chunk)
Which One to Actually Use
- Offline scripts, no API budget → pyttsx3
- Quick prototype, many languages, don’t need it to sound amazing → gTTS
- Need customization/voice cloning and have engineering time → Coqui TTS
- Production content where listeners will notice quality → ElevenLabs
Frequently Asked Questions
Which library is free?
pyttsx3, gTTS, and Coqui TTS are all free and open-source. ElevenLabs has a limited free tier, with paid plans required for regular or commercial use.
Can I use these for a real product, or just prototyping?
All four are used in production — the choice is about quality bar and budget, not maturity. gTTS and pyttsx3 power plenty of shipped internal tools; ElevenLabs and Coqui power consumer-facing audio content where voice quality is part of the product.
Conclusion
Match the tool to the constraint that matters most for your project: pyttsx3 when you need offline and free, gTTS when you need fast and simple, Coqui when you need open-source customization, ElevenLabs when quality is non-negotiable and you have budget for it.
📑 About the author: I also build Digital Bizz Card — hosted digital business cards you can share with a QR code, no app required.


