Choose models, voices, and output
Choose the model first: it determines which voices, controls, and output modes you can use. The Console shows the voices and languages currently enabled for your project.
1. Choose a model
luna-tts.luna-tts-character.| Compare | Luna-TTS | Luna-TTS Character |
|---|---|---|
| Best for | Voiceovers, content narration, and voice prompts | Character voiceovers, game dialogue, and companion experiences |
model_id | luna-tts | luna-tts-character |
| Voices | Luna-TTS system voices and cloned voices | Character system voices only; does not support cloned voices |
| Output | Complete audio or streaming audio | Complete audio only |
Omitting model_id selects luna-tts. When you switch models, choose a new voice_id from the corresponding voice list. System voices cannot be used across models.
2. Choose a voice and controls
Pass a voice_id enabled for the current project. Set language to a language code enabled for the current account.
model_id.| Setting | Luna-TTS | Luna-TTS Character |
|---|---|---|
Speed speed | 0.6–1.2; omit it or set it to 0 for the default speed | Not supported |
Volume volume | -5–5 | -5–5 |
Delivery scene scene | Not supported | normal: Normal (default)whisper: whispering delivery |
Text normalization text_normalization | true enables normalization (default); false preserves the input text | Accepted but ignored by the synchronous HTTP API; omit this field |
| Expression tags | Add an official tag, such as [laughs], directly to text | Not supported |
Generate one representative sentence with the default controls, then change only one setting for the next request. This makes differences in voice, speed, volume, and delivery easier to evaluate.
3. Choose an output mode
| Use this when | Model | Endpoint | Response |
|---|---|---|---|
| You need the complete file before playback or storage | Luna-TTS or Luna-TTS Character | POST /v1/text-to-speech | Complete audio bytes |
| You want to begin consuming audio as it is generated | Luna-TTS only | POST /v1/text-to-speech/stream | HTTP-chunked audio |
Both endpoints default to WAV: omit audio_format or set it to wav. Both accept audio_format: "pcm" for raw signed PCM16LE without a WAV container; streaming supports Luna-TTS only.
The streaming response is HTTP-chunked audio, not an SSE or JSON event stream. Consume the bytes in order. WAV includes its file header and needs a WAV-capable decoder. For PCM, use X-Audio-Sample-Rate, X-Audio-Channels, and X-Audio-Bit-Depth from the response to configure playback; do not assume a fixed sample rate. See the streaming contract and PCM example.
4. Review the result
- Start with a short piece of text that represents the real product experience.
- Confirm the target language and accent, then test names, numbers, abbreviations, uncommon symbols, pauses, and pacing.
- Adjust only one control at a time and compare the new result with the previous one.
- Test in the actual playback environment. For phone and IVR use, confirm that the channel accepts the selected WAV or PCM format and its sample rate and channel count; convert the audio if needed.
- Save the approved
model_id,voice_id, language, and control values as one configuration.
See the Text to Speech API for the complete request contract and Request Limits for current limits.