Docs /Getting Started/CSM-1B

CSM-1B

Conversational speech with speaker-role slots, but no public context or expression-tag interface.

Identity

Featherless model ID: sesame/csm-1b.

Use CSM when

Choose CSM for conversational English delivery and experiments that benefit from its speaker-role conditioning. The open checkpoint is a base generation model, not a collection of stable named character voices. It is not the right choice when you need a guaranteed cloned identity, model-defined emotion chips, or a multilingual production contract.

Safest basic request

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": "sesame/csm-1b",
    "input": "I was thinking about that story you told me yesterday.",
    "response_format": "wav"
  }' \
  --output csm-1b.audio \
  --write-out "Content-Type: %{content_type}\n"

The Python examples on this page need pip install requests. The TypeScript examples use top-level await, so save each one with an .mjs extension, or set the package type to module, and run it on Node 18 or newer.

Omitting voice uses the default this model applies when no name is given. Both examples print the Content-Type of the response, which matters because the container that comes back is not guaranteed to be the one requested: WAV and MP3 are both possible. Setting delivery to json instead returns a JSON body whose format field names the container you actually received.

Speaker roles are not expression tags

The CSM tokenizer serializes a speaker ID as [0] or [1], but the reference generator Sesame published accepts text and speaker as separate values and adds that prefix internally. Do not insert [0] or [1] into the Featherless input. When discovery exposes speaker-0 or speaker-1, pass that public name in the voice field. They are role slots, not stable voice identities, and without acoustic context the generated identity can vary between requests.

Confirm the name before you run this. The three snippets below all send voice: speaker-1. Load /v1/audio/voices first and copy an exact name from that response: a name the inventory does not list is refused with 400 and the code invalid_voice, which is the failure this example exists to get you past. If speaker-1 is absent, substitute one listed name and leave the rest of the request as it is.

Pass a speaker role
curl --fail-with-body https://api.featherless.ai/v1/audio/speech \
  --header "Authorization: Bearer $FEATHERLESS_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "model": "sesame/csm-1b",
    "input": "That makes sense. Tell me what happened next.",
    "voice": "speaker-1",
    "response_format": "wav"
  }' \
  --output csm-1b-speaker.audio \
  --write-out "Content-Type: %{content_type}\n"

Named voices track the live inventory. The inventory can include speaker-0 and speaker-1 alongside conversational and read-speech presets. Always load /v1/audio/voices rather than hard-coding a name: the inventory is the authority on what is available today, and a name it does not list is refused with 400 and the code invalid_voice.

Context, cloning, and expressions

The original CSM project can condition on structured Segment objects containing prior text, speaker IDs, and audio. The Featherless request has no field for prior turns, prior audio, or speaker-tagged history, so multi-turn acoustic context is unavailable: a context key added to the body is accepted with a 200 and then discarded.

Reference audio is different in kind. The voice field does accept a cloning reference — an object with a base64 audio sample, its container format, and an optional reference_text transcript — so a clone request is a well-formed request rather than something the API cannot express. For this model it is refused up front with 400 and the code cloning_unsupported instead of being quietly ignored, which means one clone request and its status code, not this page, are the authority on whether cloning is live today.

There is no official laugh, pause, emotion, or style tag vocabulary for CSM; punctuation and wording are ordinary prompting, not a supported tag contract.

Language, limits, and streaming

Sesame describes the released checkpoint as primarily English and warns that incidental non-English capacity is unlikely to perform well. The request has no duration field of any kind: a length parameter added to the body is accepted with a 200, discarded, and the model default governs the clip. Expect short clips, so plan for short outputs and split long text yourself. SSE is a delivery envelope; generation can finish before Featherless relays the output file, so it is not proof of native low-latency generation streaming.

Output watermark

Sesame’s reference generator applies an imperceptible watermark intended to identify AI-generated audio. Whether that exact watermark is present and preserved in the audio Featherless returns still requires a production output probe.

Parameter support

The endpoint does not reject unrecognized fields. A key that is not part of the request contract is accepted, the request comes back as a normal 200 with audio, and the field is discarded before generation. A successful response is therefore never evidence that a field was honored.

Supported

Parameter

Required

Behavior

model

yes

Send sesame/csm-1b

input

yes

Target text, forwarded verbatim

voice

no

Name from the live inventory

delivery

no

stream, json, or bulk

stream

no

Boolean delivery switch

stream_format

no

sse or audio

encoding

no

binary or base64

input is forwarded verbatim: nothing rewrites, strips, or scans it, bracket prefixes and markup reach the model literally, and its length is what billing counts.

voice takes a name from the live inventory at /v1/audio/voices, such as speaker-0 or speaker-1, or an opaque voice id listed there. Omit it to use the default this model applies when no name is given.

delivery, stream, stream_format, and encoding are the Featherless delivery controls. They shape how the bytes come back, not what the model generates.

Unsupported

Rejected with an error. These fail before any audio is produced, so the status code alone tells a client what happened.

Parameter

Result

Error code

voice.clone

400

cloning_unsupported

voice set to a name that is not in the published inventory

400

invalid_voice

response_format set to a container this model cannot deliver

400

unsupported_format

speed, model, input, response_format values that fail schema validation

422

none

The reference clip is a well-formed part of the request contract, so a clone request is refused explicitly rather than ignored. Load /v1/audio/voices instead of guessing a voice name. mp3 and wav are always accepted.

Schema validation failures cover a speed outside the range 0.25 to 4.0, a missing model or input, and a response_format outside the enum. They are refused with 422 before the request reaches the model, so no audio is produced.

Accepted and ignored. These return a normal 200 with audio, raise no error, and change nothing about the output, so they need different client handling from the rejected group above.

Parameter

What happens

context

Returns 200, no effect on output

max_audio_length_ms

Returns 200, no effect on output

language

Returns 200, no effect on output

temperature, top_p, seed, repetition_penalty, and sample rate

Returns 200, no effect on output

Any other field not named above

Returns 200, no effect on output

Context segments cover prior turns, prior audio, and speaker-tagged history, none of which have a field in the request. The request carries no duration field of any kind, so the model default governs clip length, and there is no language parameter anywhere in the request. A 200 is never evidence that a parameter did anything.

Best-effort

Three fields belong in neither list, because they are accepted without being guaranteed to affect the output for this model. speed is a real parameter of the speech API, constrained to the range 0.25 to 4.0, and omitting it substitutes 1.0; instructions is a free-text steering field that is accepted and carried the same way. Treat both as best-effort: send them if you want them, but do not build an interface that promises the result.

response_format is a request rather than a guarantee. mp3 and wav are always accepted, but the only conversion available is rewrapping raw PCM as WAV, never transcoding between codecs, so an accepted request can still come back in a different container. Read the Content-Type header, or the format field of a JSON delivery, to learn which container you actually received.

Preview UI contract

Show a voice selector populated from /v1/audio/voices, but do not show expression chips, [0]/[1] insertion controls, cloning, language selection, or a speed slider. A future context-capable API should represent turns as structured speaker/text/audio blocks rather than asking users to hand-write tokenizer prefixes.

Sources

Official CSM repository, official model card.

Last edited: Aug 27, 2026