Dia 1.6B
English dialogue with explicit speaker turns, parenthesized vocal cues, and optional audio-prompt cloning.
Identity
Featherless model ID: nari-labs/Dia-1.6B.
Use Dia when
Choose Dia when a script needs two alternating speakers, laughter or other nonverbal moments, or a short audio prompt that carries tone and speaker identity. Dia currently generates English only. For a stable named preset across unrelated requests, choose a model that publishes a fixed voice inventory.
Dialogue request
Every example on this page reads your key from FEATHERLESS_API_KEY, and nothing else needs editing. The Python examples need pip install requests. The TypeScript examples use top-level await, so save each one with an .mjs extension (or set "type": "module" in package.json) and run it on Node 18 or newer.
curl --fail-with-body https://api.featherless.ai/v1/audio/speech \
--header "Authorization: Bearer $FEATHERLESS_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "nari-labs/Dia-1.6B",
"input": "[S1] I finally fixed it. (laughs) [S2] You sound surprised. [S1] Honestly, I am.",
"response_format": "wav"
}' \
--output dia.audio \
--write-out "Content-Type: %{content_type}\n"The speaker markers are exact and case-sensitive. Start with [S1]. For dialogue, alternate [S1] and [S2]; repeated turns with the same marker tend to reduce quality. Keep the markers in input—they are Dia prompt syntax, not values for the voice field.
Vocal cues
Dia recognizes parenthesized cues. The list published by the model authors is: (laughs), (clears throat), (sighs), (gasps), (coughs), (singing), (sings), (mumbles), (beep), (groans), (sniffs), (claps), (screams), (inhales), (exhales), (applause), (burps), (humming), (sneezes), (chuckle), and (whistles). These are generative cues rather than a validator-enforced enum; Nari Labs warns that even listed cues can produce unexpected output. Use them sparingly.
Voice cloning request
These examples read a WAV recording named reference.wav from the working directory and send it as bare base64. Put a clean single-speaker clip there first, then run the snippet.
reference_audio=$(base64 < reference.wav | tr -d '\n')
curl --fail-with-body https://api.featherless.ai/v1/audio/speech \
--header "Authorization: Bearer $FEATHERLESS_API_KEY" \
--header "Content-Type: application/json" \
--data-binary @- \
--output dia-clone.audio \
--write-out "Content-Type: %{content_type}\n" <<JSON
{
"model": "nari-labs/Dia-1.6B",
"input": "[S1] This new sentence should follow the reference voice.",
"voice": {
"clone": {
"audio": {
"data": "$reference_audio",
"format": "wav"
}
}
},
"response_format": "wav"
}
JSONA short, clean 5–10 second reference clip works best. Reference clips are accepted only in the containers this model accepts, and wav and mp3 are the safe choices; a clip in any other container is rejected with a 400 (unsupported_clone_format) rather than degraded, so validate the container before uploading. Nari Labs also recommends an exact transcript using the same [S1]/[S2] structure. The request schema accepts voice.clone.reference_text and sending it is harmless, but it is not guaranteed to affect the output for this model, so do not rely on it to improve consistency. Without an audio prompt or an exposed seed, speaker identity can vary between requests.
Length and controls
Nari Labs recommends moderate scripts: content corresponding to less than roughly five seconds can sound unnatural, while content over roughly 20 seconds can become too fast. Beyond input itself, the API reads only the fields listed under Parameter support below: sampling, guidance, maximum-token, and speed_factor controls are not part of the request contract and are discarded if sent. The global speed field is read and range-checked, but it is not guaranteed to affect the output for this model, so do not ship a speed slider that promises an effect.
Formats and streaming
response_format accepts mp3 and wav for every speech model, plus the container this model emits natively and anything reachable from that container by a rewrap between pcm and wav. A value this model cannot reach is rejected with a 400 (unsupported_format), and a value that is not one of the six recognized format names fails request validation with a 422. Only container rewrapping is performed, never codec transcoding, so an accepted request can come back in a different container than the one you asked for. The delivered container is labeled honestly rather than relabeled as the format you requested: binary responses carry it in Content-Type, and JSON responses carry it in the format field of the envelope. SSE responses carry it nowhere, so use binary or JSON delivery when you need to know the container for certain. SSE is deferred chunk delivery rather than a promise of incremental generation.
Parameter support
The API reads a fixed set of request fields. Anything else you send is accepted rather than rejected: the request returns 200 with audio and the unrecognized field is discarded. A successful response is therefore never evidence that a field was honored.
Supported
Parameter | Required | Behavior |
|---|---|---|
| yes | Use |
| yes | The whole script, forwarded verbatim |
| no | Bare base64 reference clip |
| no | The container that clip is in |
| no | The default unless you send a cloning clip |
| no |
|
| no |
|
| no | Boolean |
| no |
|
Every character of input counts toward the billable input length, including the speaker markers and the parenthesized cues. When you send a cloning clip, send the base64 audio together with the container it is in; wav and mp3 are the safe containers. delivery, stream_format, stream, and encoding are delivery selectors resolved by the API: they change how the audio is returned, not how it is generated.
Unsupported
Rejected with an error — these fail before any audio is produced, so the failure is visible to the caller.
Parameter | Result | Error code |
|---|---|---|
|
| None |
|
| None |
|
|
|
|
|
|
|
|
|
The two 422 rows are request validation failures. The six recognized response_format names are mp3, opus, aac, flac, wav, and pcm; a value outside that set fails validation, while a recognized name this model cannot deliver is the 400 case. Omitting speed substitutes 1.0. A clone clip in a container this model cannot accept is rejected outright rather than degraded.
Accepted and ignored — these return 200 with audio, raise no error, and have no effect on the result. Nothing in the response distinguishes them from a field that worked.
Parameter | What happens |
|---|---|
| Returns |
| Returns |
| Returns |
Sampling, guidance, and maximum-token controls | Returns |
Any other field | Returns |
seed is discarded, so speaker identity can still vary between requests when no audio prompt is supplied. language is discarded because Dia generates English only. speed_factor is not a field the API reads; the field that is read is speed. Sampling controls, guidance controls, and maximum-token limits are not part of the request contract for this model. The request is built from a fixed set of fields, so an unlisted key has nothing to travel on.
Best-effort
A few fields sit in neither list because they are accepted and validated but are not guaranteed to affect the output for this model. Treat speed, instructions, and response_format as best-effort: each is accepted and validated, none raises an error on its own, and each may or may not change the result. voice.clone.reference_text is in the same category — the schema accepts a transcript, but it is not guaranteed to affect the output, so do not rely on it to improve consistency. Two guarantees always hold: speed is always range-checked against 0.25 to 4.0, and the delivered audio is always labeled with the container it is actually in.
Preview UI contract
Show [S1] and [S2] speaker chips plus a separate vocal-cue picker that inserts exact text at the caret. Cloning from a reference clip is available here, so expose it — but make the transcript limitation explicit rather than presenting transcript-assisted cloning as available. Do not show named voices, a language selector, speed, instructions, or sampling controls. Validate that the script starts with [S1], warn on consecutive identical speaker markers, and count all markers toward input length.