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 |
|
|
British English |
|
|
Japanese |
|
|
Mandarin Chinese |
|
|
Spanish |
|
|
French |
| — |
Hindi |
|
|
Italian |
|
|
Brazilian Portuguese |
|
|
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.
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 |
|---|---|---|
| yes | Use |
| yes | The text to speak, forwarded unchanged |
| no | A preset voice ID from the inventory above, such as |
| no |
|
| no | Boolean alias for |
| no |
|
| no |
|
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 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
| none, from request-schema validation |
|
| 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 |
|---|---|
| Returns |
| Returns |
Any other field the request body does not define | Returns |
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.