API reference
Lifelike Malayalam & Indic text-to-speech over a simple REST API. Free while in beta.
Quickstart
- Create an API key in your dashboard.
- Set it as
SKILLIES_API_KEY. - Call the endpoint — you get back a WAV.
curl https://voice.skillies.ai/v1/text-to-speech \
-H "Authorization: Bearer $SKILLIES_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"നമസ്കാരം! Welcome to Skillies Voice.","voice_id":"ehsan"}' \
--output speech.wavPOST /v1/text-to-speech
Synthesize speech. Returns audio/wav(24 kHz, mono).
textstring, required
The text to speak. Malayalam, English, or mixed. Max 800 chars.
voice_idstring, required
A voice from GET /v1/voices (e.g. "ehsan").
languagestring, optional
BCP-47-ish hint (e.g. "ml"). Auto-detected if omitted.
Node.js
const res = await fetch("https://voice.skillies.ai/v1/text-to-speech", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SKILLIES_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ text: "നമസ്കാരം!", voice_id: "ehsan" }),
});
const buf = Buffer.from(await res.arrayBuffer());
require("fs").writeFileSync("speech.wav", buf);Python
import os, requests
res = requests.post(
"https://voice.skillies.ai/v1/text-to-speech",
headers={"Authorization": f"Bearer {os.environ['SKILLIES_API_KEY']}"},
json={"text": "നമസ്കാരം!", "voice_id": "ehsan"},
)
open("speech.wav", "wb").write(res.content)GET /v1/voices
List the voices you can synthesize with.
curl https://voice.skillies.ai/v1/voices \
-H "Authorization: Bearer $SKILLIES_API_KEY"Errors & limits
401 unauthorizedMissing or invalid/revoked API key.
400 invalid_inputBad body — check text length and voice_id.
404 unknown_voiceThat voice_id isn't in your catalog.
429 rate_limitedSlow down (60 requests/min per key in beta).
502 synthesis_failedVoice engine hiccup — retry. First call may be slow (cold start).
Errors are JSON: { "error": "code", "message": "..." }. Every synth response carries an x-request-id header.