Docs /Getting Started/Dia 1.6B

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.

Generate dialogue
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.

Generate with reference audio
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"
}
JSON

A 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

model

yes

Use nari-labs/Dia-1.6B

input

yes

The whole script, forwarded verbatim

voice.clone.audio.data

no

Bare base64 reference clip

voice.clone.audio.format

no

The container that clip is in

voice omitted

no

The default unless you send a cloning clip

delivery

no

stream, json, or bulk

stream_format

no

sse or audio

stream

no

Boolean

encoding

no

binary or base64

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

speed outside 0.25 to 4.0

422

None

response_format outside the six recognized names

422

None

response_format naming a container this model cannot deliver

400

unsupported_format

voice as a named preset that is not in the inventory for this model

400

invalid_voice

voice.clone.audio.format in a container this model cannot accept

400

unsupported_clone_format

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

seed

Returns 200, no effect on output

language

Returns 200, no effect on output

speed_factor

Returns 200, no effect on output

Sampling, guidance, and maximum-token controls

Returns 200, no effect on output

Any other field

Returns 200, no effect on output

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.

Sources

Official Dia repository, official model card.

Last edited: Aug 27, 2026