Docs /Getting Started/Kokoro 82M

Kokoro 82M

Fast preset-voice speech with language-bearing voice names and pronunciation control.

Identity

Featherless model ID: hexgrad/Kokoro-82M.

Use Kokoro when

Choose Kokoro for lightweight, fast preset-voice synthesis, straightforward narration, and applications that need a broad built-in voice set. Choose a cloning-first model when matching a supplied speaker is more important than preset speed and simplicity.

Voices and languages

Always load the active inventory from /v1/audio/voices. Voice prefixes encode language and voice group: af/am for American English, bf/bm for British English, jf/jm for Japanese, zf/zm for Mandarin Chinese, ef/em for Spanish, ff for French, hf/hm for Hindi, if/im for Italian, and pf/pm for Brazilian Portuguese. A voice prefix is the practical language selector; the public API has no separate language field.

Featherless currently exposes 54 preset voices for hexgrad/Kokoro-82M. Voice IDs are case-sensitive. The first prefix character identifies the language or accent, while f and m identify the female and male voice groups. The discovery-reported default is af_bella. Pass a voice explicitly when the selection must be deterministic.

Current voice inventory

The following 54 voice IDs are returned by /v1/audio/voices?model=hexgrad/Kokoro-82M: 27 female and 27 male voice presets. Query the endpoint at runtime because the published inventory and default can change.

Language / accent

Female voices

Male voices

American English

af_alloy, af_aoede, af_bella, af_heart, af_jessica, af_kore, af_nicole, af_nova, af_river, af_sarah, af_sky

am_adam, am_echo, am_eric, am_fenrir, am_liam, am_michael, am_onyx, am_puck, am_santa

British English

bf_alice, bf_emma, bf_isabella, bf_lily

bm_daniel, bm_fable, bm_george, bm_lewis

Japanese

jf_alpha, jf_gongitsune, jf_nezumi, jf_tebukuro

jm_kumo

Mandarin Chinese

zf_xiaobei, zf_xiaoni, zf_xiaoxiao, zf_xiaoyi

zm_yunjian, zm_yunxi, zm_yunxia, zm_yunyang

Spanish

ef_dora

em_alex, em_santa

French

ff_siwis

Hindi

hf_alpha, hf_beta

hm_omega, hm_psi

Italian

if_sara

im_nicola

Brazilian Portuguese

pf_dora

pm_alex, pm_santa

Basic request

Every example below reads your key from the FEATHERLESS_API_KEY environment variable, so export it once before running any of them. The Python examples need the requests library: install it with pip install requests. The TypeScript examples use top-level await, so save one with an .mjs extension (or set "type": "module" in package.json) and run it on Node 18 or newer, which supplies the built-in fetch they rely on.

Generate speech
curl --fail-with-body https://api.featherless.ai/v1/audio/speech \
  --header "Authorization: Bearer $FEATHERLESS_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "model": "hexgrad/Kokoro-82M",
    "input": "A compact model can still sound remarkably natural.",
    "voice": "af_bella",
    "response_format": "wav"
  }' \
  --output kokoro-basic.audio \
  --write-out "Content-Type: %{content_type}\n"

Parameter support

The request body accepts fields it does not recognize. An unrecognized field is not an error: the request returns a normal 200 with audio, and the field is discarded before synthesis. A successful response is therefore never evidence that a field was honored.

Supported

Parameter

Required

Behavior

model

yes

Use hexgrad/Kokoro-82M

input

yes

The text to speak, forwarded unchanged

voice

no

A preset voice ID from the inventory above, such as af_bella

delivery

no

stream, json, or bulk

stream

no

Boolean alias for delivery

stream_format

no

sse or audio

encoding

no

binary or base64; json delivery defaults to base64

input is forwarded unchanged: it is not stripped, escaped, or rewritten before synthesis. Voice IDs are case-sensitive, and the default applied when voice is omitted is not guaranteed to match the default that discovery reports, so pass a voice explicitly whenever the selection must be deterministic. delivery, stream, stream_format, and encoding select how the response is delivered and do not change how the audio is generated.

Best-effort

Three fields sit in neither list because acceptance does not prove an effect: speed, instructions, and response_format. All three are accepted and validated, but none of them is guaranteed to affect the output for this model. Treat them as best effort and verify by measuring the result rather than by checking for an error — compare the duration of returned audio across two speed values, and read the Content-Type header or the format field of the JSON envelope to learn which container you actually received. A response_format is a request rather than a guarantee: only raw pcm and wav convert freely and no codec transcoding exists, so an accepted request can come back in a different container, labelled with what was actually produced.

Unsupported

Rejected with an error

Parameter

Result

Error code

voice.clone

400

cloning_unsupported

voice set to an ID that is not in the published inventory

400

invalid_voice

response_format set to a container this model cannot deliver

400

unsupported_format

response_format set to a value outside the accepted enum

422

none, from request-schema validation

speed outside 0.25 through 4.0

422

none, from request-schema validation

One-shot voice cloning is not offered for this model, so a request that supplies a reference clip fails loudly instead of quietly falling back to a preset voice. Voice matching is exact, so a difference in letter case is enough to trigger invalid_voice. mp3 and wav are always accepted, while opus, aac, flac, and pcm are not guaranteed for this model. An out-of-range speed is rejected before any audio is produced, and omitting speed applies 1.0.

Accepted and ignored

Parameter

What happens

language

Returns 200, no effect on output

emotion

Returns 200, no effect on output

Any other field the request body does not define

Returns 200, no effect on output

There is no language field in the request contract, and the voice name prefix is the only language selector. No emotion vocabulary is defined for this model, so delivery is shaped only by the wording and punctuation inside input. Any other undefined field is accepted, discarded, and never reported back, so send only the fields you need.

Speed and text length

Featherless validates speed between 0.25 and 4.0 and rejects anything outside that range with HTTP 422, before any audio is produced. Omitting speed applies 1.0. Inside the range, speed is best effort: verify it by measuring the duration of the returned audio rather than by checking for an error. The model authors recommend chunks around 100–200 tokens. Very short input can sound weak, while overly long unsplit text can rush or lose phrasing.

Pronunciation and expression

Kokoro does not define a supported emotion-tag vocabulary for the UI. Punctuation and wording shape delivery. The Kokoro tokenizer supports inline IPA pronunciation overrides such as [word](/IPA/); treat this as advanced syntax from the original project and test the exact phrase before production use.

Voice cloning

Featherless does not expose one-shot voice cloning for Kokoro through /v1/audio/speech.

Streaming and delivery

Set delivery to stream. A successful stream returns Kokoro audio through speech.audio.delta events followed by speech.audio.done.

SSE controls response delivery only. Featherless may relay audio progressively, or the full clip may be generated before the first audio chunk is sent. Streaming therefore does not guarantee live synthesis or a shorter wait for the first audio.

Sources

Official Kokoro model card and official voice inventory.

Last edited: Aug 27, 2026