Choose a voice
List the speech voices your Flux key can use, pick a voice id for each speech model, and cache the list with an ETag so you only fetch it when it changes.
Every text to speech request names a voice, and the voice has to belong to the model you ask for. This page shows where the voice ids come from and which ones each model takes.
Voice list: Live
How voices are listed
GET https://api.fluxrouter.ai/v1/audio/voices returns the voices your key can use. It makes no speech and is not billed, and it works on any valid key, including the Free plan, so you can build a voice picker before you upgrade.
curl https://api.fluxrouter.ai/v1/audio/voices \
-H "Authorization: Bearer $FLUX_API_KEY"
{
"object": "list",
"data": [
{
"id": "nova",
"model": "flux-voice-speak",
"name": "Nova",
"gender": "neutral",
"description": "Standard voice",
"languages": ["en"],
"entitlement": "paid_cleared"
}
]
}
Use a row's model and id as the model and voice of a speech request.
- The list is filtered by your key. It shows only voices whose
modelyour key may use. If a model is missing from your key's model list, its voices are missing here too. Read the list with the key that will make the speech. - Send the key as
Authorization: Bearer. This endpoint does not read anx-api-keyheader. - Other fields may appear. Read the fields above and ignore anything else.
The full contract is in the endpoint reference.
The voices
The catalogue has 61 voices in all. The table lists the voices on the two speech models these docs cover, read from the live list. Your key's own list is the final word.
| Voice id | Name | Gender | Languages | Model | Description |
|---|---|---|---|---|---|
alloy | Alloy | neutral | en | Speak (flux-voice-speak) | Standard voice |
ash | Ash | neutral | en | Speak (flux-voice-speak) | Standard voice |
ballad | Ballad | neutral | en | Speak (flux-voice-speak) | Standard voice |
cedar | Cedar | neutral | en | Speak (flux-voice-speak) | Standard voice |
coral | Coral | neutral | en | Speak (flux-voice-speak) | Standard voice |
echo | Echo | neutral | en | Speak (flux-voice-speak) | Standard voice |
fable | Fable | neutral | en | Speak (flux-voice-speak) | Standard voice |
marin | Marin | neutral | en | Speak (flux-voice-speak) | Standard voice |
nova | Nova | neutral | en | Speak (flux-voice-speak) | Standard voice |
onyx | Onyx | neutral | en | Speak (flux-voice-speak) | Standard voice |
sage | Sage | neutral | en | Speak (flux-voice-speak) | Standard voice |
shimmer | Shimmer | neutral | en | Speak (flux-voice-speak) | Standard voice |
verse | Verse | neutral | en | Speak (flux-voice-speak) | Standard voice |
Voice ids by model
| Model id | Voices it takes |
|---|---|
flux-voice-speak | Every voice listed for it above. |
flux-voice-speak-hd | A smaller set of the same voices: alloy, ash, coral, echo, fable, nova, onyx, sage and shimmer. The list has no rows of its own for this model, so pick from these. |
The voice list can include voices on other speech models too. Those models are not covered in these docs yet; if you use them, keep the model and id from the same row together.
A voice that does not belong to the model gets 400 with param: "voice", and the error message lists the voices that model takes.
On the Flux tools server, the speak tool takes a voice id on its own and picks the model that owns it.
Entitlement values
Each row carries an entitlement that says whether your key can make speech with that voice right now. Every row in one response has the same value, because it depends on your plan, not on the voice.
| Value | Meaning |
|---|---|
paid_cleared | Your plan covers speech. A request with this voice will run. |
premium_locked | Your plan does not cover speech yet. A request will get 402 premium_locked; show an upgrade prompt instead of a play button. See Plans. |
Caching the list
The list changes rarely. Cache it per key and ask for it again with the ETag you were given:
curl -i https://api.fluxrouter.ai/v1/audio/voices \
-H "Authorization: Bearer $FLUX_API_KEY" \
-H 'If-None-Match: "<etag from the last response>"'
When nothing has changed you get 304 Not Modified with no body, and you keep your copy.
- The response is marked
Cache-Control: private, no-cacheandVary: Authorization. Shared caches do not store it, and your own cache should check it with the ETag before each use. - Keep one cached copy per key, not one per app. Two keys can see different lists.
Do not call the speech endpoint to preview a voice for a "try it" button: every call is billed. Make one short sample per voice once, store it, and play that.