POST /v1/audio/speech converts text to 24 kHz mono audio with Qwen 3 TTS (qwen3-tts).
Request
model(string, required) —qwen3-tts.voice(string, required) — Voice id from List voices.input(string, required) — Text to speak, up to 1000 characters.response_format(string, optional, defaultwav) —wav, orpcmfor headerless signed 16-bit little-endian samples at 24 kHz.stream(boolean, optional, defaultfalse) — Writes the audio bytes as they are generated.
qwen3-tts rejects any other generation parameter, including speed, with 400 unsupported_parameter.
The response body is audio/wav or audio/pcm.
This example picks a featured voice that is ready for qwen3-tts and writes the streamed audio to speech.wav.
List voices
GET /voices returns the voices your key can use, newest first.
scope(string, optional, defaultall) —featuredfor the voices Hopper publishes,minefor the voices your organization created.limit(integer, optional, default 50) — Between 1 and 200.cursor(string, optional) —next_cursorfrom the previous page.
{"voices": [...], "next_cursor": ...}, where each voice carries:
id(string) — Pass this asvoiceon/v1/audio/speech.name(string) — Display name.language(string) — Language of the voice.profiles(array) — One{model_id, status}per model the voice is prepared for; the voice works with that model oncestatusisready.
GET /voices/{id} returns one voice. DELETE /voices/{id} deletes a voice your organization created.
Clone a voice
POST /voices/clone creates a voice from a single clip and returns 201 with the voice object. The request is multipart/form-data.
name(string, required) — Name for the new voice.clip(file, required) — One file, wav, mp3, or flac, 5 to 30 seconds of one speaker. Clips with under 3 seconds of speech return 400reference_audio_too_short.transcript(string, optional) — What is said in the clip.model_id(string, optional, defaultqwen3-tts) — Model to prepare the voice for.
id as voice on /v1/audio/speech.
Error codes are listed in Errors.