Self-hosted synthesis server for 22 Indian languages.
WebSocket streaming + Batch REST API. Zero API costs. Full data sovereignty.
A single container on port 8080 serves both real-time streaming via WebSocket and async batch transcription via REST — designed for every workflow.
indic-parler-tts
model — fine-tuned on Indian language corpora, supporting 44+ pre-built voices and emotion control.
/health
endpoint is always exempt for Cloud Run probes. Backwards-compatible when key is unset.From Hindi to Malayalam, Telugu to Sanskrit — a single model handles the full breadth of India's linguistic landscape.
Local setup, Docker, or Cloud Run — pick your environment. The deploy script handles APIs, Artifact Registry, Cloud Build, and deployment automatically.
$ export GCP_PROJECT_ID=my-project $ export HF_TOKEN=hf_xxxx $ ./deploy.sh → Enabling GCP APIs... → Building via Cloud Build (~15 min)... → Deploying to asia-south1... ✓ Service URL: https://vexyl-tts-xxx.run.app ✓ WebSocket: wss://vexyl-tts-xxx.run.app
# One-command setup $ ./setup.sh Downloads model, sets up venv... # Start the server $ ./run.sh ✓ Listening on ws://127.0.0.1:8092 # Health check $ curl http://localhost:8092/health {"status":"ok","model":"indic-parler-tts"}
# Build (bakes model at build time) $ docker build \ --build-arg HF_TOKEN=$HF_TOKEN \ -t vexyl-tts . # Run with API key $ docker run -p 8080:8080 \ -e VEXYL_TTS_API_KEY=secret \ vexyl-tts
// .env VEXYL_TTS_URL=wss://vexyl-tts-xxx.run.app VEXYL_TTS_API_KEY=your-secret TTS_PROVIDER=vexyl-tts // Usage const tts = new VexylTTS('ml-IN'); await tts.connect(); tts.synthesize('നമസ്കാരം', audioChunk => play(audioChunk));
Submit audio files and poll for results. CORS-enabled, API key protected, file-format agnostic.
# 1. Submit a job $ curl -X POST https://vexyl-tts-xxx.run.app/batch/synthesize \ -H "X-API-Key: your-secret" \ -H "Content-Type: application/json" \ -d '{"text":"नमस्ते दुनिया","lang":"hi-IN"}' {"job_id":"batch_a1b2c3d4e5f6","status":"queued","language":"hi-IN","text_length":14} # 2. Poll for completion $ curl https://vexyl-tts-xxx.run.app/batch/status/batch_a1b2c3d4e5f6 \ -H "X-API-Key: your-secret" {"job_id":"batch_a1b2c3d4e5f6","status":"completed","audio_b64":"...","latency_ms":2400} # Health check (no auth required) $ curl https://vexyl-tts-xxx.run.app/health {"status":"ok","active_connections":0,"batch_jobs_queued":0,"uptime_seconds":42.3}
| Limit | Value | Notes |
|---|---|---|
| Max text length | 5,000 characters | HTTP 400 returned if exceeded |
| Max pending jobs | 1,000 | HTTP 429 when queue is full |
| Job result TTL | 1 hour | Cleaned up every 5 minutes |
| Voice Styles | default · warm · formal | Controls the speaker selection |
Cloud Run bills per-second. With --min-instances=0, you pay
nothing when there's no traffic. The free tier covers most light usage entirely.
| Usage | Requests / Month | Estimated Cost |
|---|---|---|
| Light — Testing / Dev | ~100 | ~$0.06 |
| Medium — Internal Tool | ~1,000 | ~$0.60 |
| Heavy — Production | ~10,000 | ~$6.00 |
| Always-Warm (min-instances=1) | Any | ~$50–70 / month |
| GCP Free Tier | First 180K vCPU-sec + 360K GiB-sec | FREE |
Apache 2.0 licensed. Self-host it, fork it, integrate it into your stack. Contributions welcome.