Docs /Getting Started/Orpheus 3B

Orpheus 3B

English preset voices with eight verified inline vocal-event tags.

Identity

Featherless model ID: canopylabs/orpheus-3b-0.1-ft.

Use Orpheus when

Choose Orpheus for expressive English speech with a named preset and explicit laughter, sighs, coughs, or similar vocal events. The active model is the English finetune; multilingual Orpheus research checkpoints are separate models and do not make this model multilingual.

Basic request

The Python examples need 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.

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": "canopylabs/orpheus-3b-0.1-ft",
    "input": "I thought the demo was finished. <chuckle> Then it started answering back.",
    "voice": "tara",
    "response_format": "wav"
  }' \
  --output orpheus.audio \
  --write-out "Content-Type: %{content_type}\n"

Keep voice separate from input. Orpheus expects its prompt to begin with a voice name followed by a colon, but Featherless applies that formatting for you. Do not write tara: at the beginning of the text or the voice can be prefixed twice.

Voices

Always load /v1/audio/voices. Tara and dan are the two names Featherless lists consistently for this model. The current inventory also lists emma, jess, josh, leah, leo, mia, and zac, but those names are not guaranteed for this model, so treat the discovery response as the source of truth. The Orpheus documentation also names zoe; Featherless does not list it, so do not offer it in the UI unless discovery returns it.

Vocal events

The English finetune documents exactly eight lowercase inline markers: <laugh>, <chuckle>, <sigh>, <cough>, <sniffle>, <groan>, <yawn>, and <gasp>. They are standalone event markers, not opening and closing tags. Canopy does not document case-insensitive aliases, nesting, maximum counts, or arbitrary emotion names. Insert only these canonical spellings and test important scripts before production.

Cloning and controls

Orpheus is driven by the voice you name and the text you send. The sampling controls of a text model — temperature, top_p, repetition_penalty, max_tokens — have nowhere to land in a speech request, and neither does language, since this model is the English finetune. They are accepted and discarded rather than rejected, which is why a 200 here proves nothing about what was read.

Voice cloning is the exception: a reference clip is refused rather than ignored, failing with 400 and the code cloning_unsupported instead of quietly falling back to a preset voice, so a single attempt tells you whether it is available. Parameter support below carries the field-by-field verdicts, including the ones for speed and instructions.

Parameter support

The endpoint does not reject unrecognized fields. A key that is not part of the request contract is accepted, the response comes back as a normal 200 with audio, and the field is discarded before synthesis. A successful response is therefore never evidence that a field was read, so use the lists below instead of the status code.

Supported

Parameter

Required

Behavior

model

yes

Send canopylabs/orpheus-3b-0.1-ft

input

yes

Target text, forwarded verbatim

voice

no

Preset name from the live inventory

delivery

no

stream, json, or bulk

stream

no

Boolean delivery selector

stream_format

no

sse or audio

encoding

no

binary or base64

input is forwarded verbatim. The eight inline vocal-event markers are ordinary characters to the API: nothing parses or strips them, they reach the model exactly as written, and they count toward the input characters you are billed for.

voice takes a preset name from the live inventory at /v1/audio/voices. Send it as its own field rather than writing it into input. Omit it to accept the default this model applies when no name is given.

delivery wins over stream_format, which wins over stream. These selectors shape how the bytes come back, not what the model generates. encoding applies to the non-SSE modes and defaults to base64 for json.

Best-effort

speed, instructions, and response_format belong in neither list. Each one is a real field of the speech request and each one is validated, but none of them is guaranteed to affect the output for this model. Send them if you want them, and do not build an interface that promises the result.

speed is constrained to 0.25 to 4.0, and a value outside that range fails the request with 422 before any audio is produced. Omitting it substitutes 1.0 rather than leaving the field unset.

instructions is free-text steering. It is accepted and validated as a string, and it may be discarded before synthesis for this model, so treat any effect it has as a bonus rather than a contract.

response_format names the container you want back rather than guaranteeing it. mp3 and wav are always accepted, the only conversion available is rewrapping between pcm and wav, and no codec transcoding is performed, 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 received.

Unsupported

Rejected with an error

These fail before any audio is produced, so the status code and the error code together tell a client exactly what to fix.

Parameter

Result

Error code

voice.clone

400

cloning_unsupported

voice naming a preset that is not in the published inventory

400

invalid_voice

response_format set to a container this model cannot deliver

400

unsupported_format

speed outside 0.25 to 4.0, and other schema validation failures

422

none

A reference clip is a well-formed part of the request contract, so a cloning request is refused explicitly rather than ignored: one attempt tells you whether cloning is available, and there is no silent fallback to a preset voice. mp3 and wav are always accepted as response_format values. The 422 cases are schema validation failures, so nothing is synthesized and no named error code is returned.

Accepted and ignored

These return 200 with normal audio, raise no error, and change nothing about the output, so a client cannot detect them from the response at all. Do not surface them as controls.

Parameter

What happens

temperature, top_p, and repetition_penalty

Returns 200, no effect on output

max_tokens

Returns 200, no effect on output

language

Returns 200, no effect on output

Any other field outside the tables above

Returns 200, no effect on output

None of these fields are part of the speech request body. This model is the English finetune and takes no language selection, so language is discarded with the rest. A 200 is never evidence that one of these fields was applied.

Formats, limits, and streaming

response_format is a request, not a guarantee. mp3 and wav are always accepted as values. The container you receive can still differ from the one you asked for, so read Content-Type, or JSON delivery’s format field, instead of assuming the requested container was produced. Featherless does not expose a universal generation limit or character ceiling for this model. Orpheus can stream incrementally in the original project’s runtime, but that does not guarantee native streaming through Featherless: delivery may be deferred or progressive.

Preview UI contract

Show the live voice inventory and an eight-item Vocal events picker that inserts a marker at the caret. Do not expose arbitrary emotion tags, voice cloning, language selection, speed, or sampling sliders. Preserve the exact lowercase angle-bracket marker in the request and count it as input text.

Sources

Official Orpheus repository.

Last edited: Aug 27, 2026