Skip to main content
The Text to Speech (TTS) service converts written text into spoken audio. The unified POST /tasks/audio/speech endpoint is served by the RunPod Orpheus-3B deployment (sunbird-orpheus-tts) — multilingual and multi-speaker, covering 20 African languages with 40+ voices. Voices are catalog tags (e.g. salt_lug_0001); list them with GET /tasks/voice/speakers.
Breaking change (v2.1). This endpoint previously accepted model, platform, and max_new_audio_tokens, and offered a spark-tts model. RunPod Orpheus is now the only TTS backend: those parameters are rejected, and the legacy per-provider routes (/tasks/modal/tts, /tasks/runpod/tts, /tasks/modal/orpheus/*, /tasks/tts, the /stream* and speaker-listing routes, and refresh-url) were removed. Use the endpoints below.

Single Synthesis

Parameters

Response

The audio_url is a temporary signed URL valid for ~30 minutes. Download or stream the audio promptly, or re-sign it with GET /tasks/audio/speech/url.

Response Modes

response_mode controls how the audio is returned:
  • url — synthesize, upload to GCP, return a signed URL (valid ~30 minutes) — default
  • stream — stream the raw audio bytes straight back (constant client memory; no GCS upload)
  • both — stream the raw audio bytes and return the signed URL in the X-Audio-Url response header
RunPod synthesizes the full waveform before sending the first byte, so stream bounds client memory but does not reduce time-to-first-audio.

Languages and Voices

Speaker IDs encode both the source corpus (salt_*, waxal_*, slr32_*, slr129_*, bateesa_*) and the language. Languages marked with an em dash are present in the model’s training mix but do not currently expose individual voice IDs in this checkpoint.
Per-language quality scales with the amount of training data collected for that language. Audition the voices before relying on a particular speaker — use the discovery snippet under Listing Voices.

Listing Voices

Batch Synthesis

Synthesize up to 16 items in a single request (RunPod cap). Per-item failures are reported with status="error"; the request returns 200 if at least one item succeeds and 502 if every item fails.

Refreshing an Expired URL

Signed URLs expire after ~30 minutes. Re-sign a stored object with GET /tasks/audio/speech/url: