This repo is deprecated. Use cstr/orpheus-3b-0.1-ft-GGUF instead — it has F16 + Q8_0 + Q4_K quants plus the diff-harness reference file. CrispASR's model registry and auto-download now point there.
Orpheus 3B is a Llama-3.2-3B-Instruct talker finetuned to emit <custom_token_N> codec tokens that the SNAC 24 kHz codec decodes back to speech. Distributed under the Llama-3.2 community license ("Built with Llama"). 8 fixed English speakers (tara, leah, jess, leo, dan, mia, zac, zoe).
Pair this with the SNAC codec at cstr/snac-24khz-GGUF — the talker outputs codec tokens but doesn't render audio without it.
Files
File
Quant
Size
Notes
orpheus-3b-base-f16.gguf
F16
6.2 GB
Reference quality
orpheus-3b-base-q8_0.gguf
Q8_0
3.4 GB
Recommended — ASR roundtrip word-exact vs F16
The talker LM is sensitive to peaked codec distributions, so we ship F16 + Q8_0 only. Sub-Q8 quants tend to break the SNAC super-frame slot pattern and produce gibberish even when the LM perplexity remains plausible.
24 kHz mono WAV. --voice <name> picks one of the 8 baked speakers; --temperature 0.6 is the upstream engine_class.py default and is required — greedy decoding (--temperature 0) enters a 7-slot loop after a few super-frames and produces unusable audio.
For auto-download simply pass -m auto:
bash
1./build/bin/crispasr --backend orpheus -m auto \2 --voice leo --temperature 0.6\3 --tts "Auto-download fetches both files."\4 --tts-output out.wav
hubertsiuzdak/snac_24khz (RVQ, 3 codebooks × 4096) — separate GGUF
Sampling
temperature=0.6 + top-k by default; greedy is unstable
Audio
24 kHz mono float32 PCM
The talker emits a stream of <custom_token_N> LM tokens; every 7 emitted tokens form one "super-frame" that de-interleaves into 1 codes_0 / 2 codes_1 / 4 codes_2 entries (per orpheus_tts_pypi/orpheus_tts/decoder.py). 4 super-frames cover 16 SNAC frames (× 512-sample hop = 8192 PCM samples at 24 kHz).
Prompt format (verbatim from canopyai/Orpheus-TTS)
The Llama-3 BOS at position 1 is critical. Without it the talker still emits well-structured super-frames but the audio is semantically garbage. The CrispASR runtime handles this for you — direct callers of orpheus_synthesize_codes need to mirror the layout.
Stop policy
Stop on audio_end=128257or on >4 consecutive non-codec tokens. Don't stop on audio_pre_end=128009 or audio_end_b=128261 — those overlap with Llama-3 specials in the prompt and text_N<10 reserved markers in the custom_token block; the upstream tokens_decoder filters them silently rather than terminating on them.
The converter sets GGUFWriter(use_temp_file=False) because the True path buffers tensor data via tempfile.SpooledTemporaryFile and collapses throughput on near-full external disks (/Volumes/backups at 100% saw multi-MB/s spooling). The direct write holds the full tensor list in RAM during emit but completes in ~30 s on the 6.6 GB f16.
Drop-in checkpoint variants
The orpheus runtime is checkpoint-agnostic — same arch, same prompt format, same SNAC codec. Future GGUF mirrors of:
GGUF conversion + ggml runtime:CrispStrobe/CrispASR — see src/orpheus.cpp, src/orpheus_snac.cpp, models/convert-orpheus-to-gguf.py.
License
Llama-3.2 community license (inherited from the base talker). Includes the Acceptable Use Policy and the "Built with Llama" attribution requirement. Commercial use is permitted under the community license terms; review canopylabs/orpheus-3b-0.1-ft and the Llama-3.2 license before redistribution.