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.

bash
curl https://api.fluxrouter.ai/v1/audio/voices \
  -H "Authorization: Bearer $FLUX_API_KEY"
json
{
  "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 model your 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 an x-api-key header.
  • 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 idNameGenderLanguagesModelDescription
alloyAlloyneutralenSpeak (flux-voice-speak)Standard voice
ashAshneutralenSpeak (flux-voice-speak)Standard voice
balladBalladneutralenSpeak (flux-voice-speak)Standard voice
cedarCedarneutralenSpeak (flux-voice-speak)Standard voice
coralCoralneutralenSpeak (flux-voice-speak)Standard voice
echoEchoneutralenSpeak (flux-voice-speak)Standard voice
fableFableneutralenSpeak (flux-voice-speak)Standard voice
marinMarinneutralenSpeak (flux-voice-speak)Standard voice
novaNovaneutralenSpeak (flux-voice-speak)Standard voice
onyxOnyxneutralenSpeak (flux-voice-speak)Standard voice
sageSageneutralenSpeak (flux-voice-speak)Standard voice
shimmerShimmerneutralenSpeak (flux-voice-speak)Standard voice
verseVerseneutralenSpeak (flux-voice-speak)Standard voice

Voice ids by model

Model idVoices it takes
flux-voice-speakEvery voice listed for it above.
flux-voice-speak-hdA 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.

ValueMeaning
paid_clearedYour plan covers speech. A request with this voice will run.
premium_lockedYour 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:

bash
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-cache and Vary: 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.

Next