All chunks fired at once — your browser does the merging. Unlimited text length, 580+ voices, lightning fast, no queue.
/api/voices · POST /api/tts. No API key required.Zero auth. GET /api/voices returns the voice list. POST /api/tts synthesizes one chunk of text (max 1950 chars) and returns raw audio/mpeg bytes. For long text, split client-side, fire all chunks with Promise.all(), and concatenate the Blobs.
/api/voices
json
Returns all available voices with 1-based index numbers, grouped by language. Use the returned index in TTS calls.
{
"success": true,
"total": 580,
"voices": [
{ "index": 1, "id": "voice-107",
"name": "Andrew Multilingual",
"gender": "Male",
"language": "Multilingual",
"country": "United States" }
],
"grouped": { "Multilingual": [...], "English": [...] }
}
curl "__BASE__/api/voices"
/api/tts
audio/mpeg
Synthesizes one chunk of text and returns raw audio/mpeg binary. Max 1950 chars per call. Response headers include X-Pitch, X-Rate, X-Voice-Name, X-Char-Count.
| Param | Type | Description | |
|---|---|---|---|
| voiceIndex | number | required | 1-based index from /api/voices |
| text | string | required | Text to synthesize (max 1950 chars per call) |
| pitch | number | optional | -100 (deeper) to 100 (higher). Default 0. |
| rate | number | optional | -100 (slower) to 100 (faster). Default 0. |
curl -X POST "__BASE__/api/tts" \ -H "Content-Type: application/json" \ -d '{"voiceIndex":1,"text":"Hello, world!","pitch":10,"rate":-5}' \ --output speech.mp3
// 1. Split text at sentence boundaries into <=1950-char chunks const chunks = splitText(text, 1950); // 2. Fire ALL chunks simultaneously — no queue const blobs = await Promise.all( chunks.map(chunk => fetch('/api/tts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ voiceIndex, text: chunk, pitch, rate }) }).then(r => r.blob()) ) ); // 3. Concat Blobs — MP3 is a stream, this just works const merged = new Blob(blobs, { type: 'audio/mpeg' }); const url = URL.createObjectURL(merged);
fetch() in code.HTTP status codes
/api/voices, POST on /api/ttsYes — 100% free with no sign-up, no API key, no usage limits. 580+ voices, unlimited text length, MP3 download included.
Your text is split at sentence boundaries into ~900-char chunks. All chunks are fetched in parallel via Promise.all(), then the resulting MP3 Blobs are concatenated in the browser — MP3 is a stream format, so pure Blob concat works.
The UI first tries to call the upstream TTS provider directly from the browser (fastest path). If CORS blocks it, it automatically falls back to our own /api/tts proxy endpoint. You always get audio.
Yes. Both sliders range from -100 to +100 and are passed to /api/tts as the pitch and rate parameters.
Yes. Two endpoints: GET /api/voices and POST /api/tts. No auth. See the API section above for the full docs.
Raw MP3 (audio/mpeg) binary. Max 1950 chars per single call; the client handles chunking + merging.
New tools, updates, and exclusive resources delivered to WhatsApp.
SpeechSter is a free text-to-speech tool by AHM7xMakki — part of a 16-tool free API platform. Owned by AHM7. Built and managed by Makki. About us →
Your text is streamed to the TTS provider and returned as MP3. We don't retain text or generated audio. Full policy →
For personal and non-commercial use. Don't use it for impersonation, deceptive content, or unlawful activity. Full terms →
SpeechSter by AHM7xMakki is a free ultra-fast text-to-speech converter with 580+ natural voices, adjustable pitch and speed, unlimited text length, MP3 download and a free REST API.