File size: 4,251 Bytes
7d6e690 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | ---
license: apache-2.0
language:
- en
library_name: phoonnx
pipeline_tag: text-to-speech
tags:
- onnx
- tts
- orpheus
- snac
- codec-lm
base_model:
- canopylabs/orpheus-3b-0.1-ft
- hubertsiuzdak/snac_24khz
---
# phoonnx-orpheus — Orpheus 3B (English), ONNX
ONNX weights for [Orpheus TTS](https://github.com/canopyai/Orpheus-TTS) by
[Canopy Labs](https://canopylabs.ai), packaged for
[phoonnx](https://github.com/TigreGotico/phoonnx). This repository holds converted
weights only — no new training was done. Original model and code are Apache-2.0;
all credit for the model belongs to Canopy Labs.
Orpheus is a Llama-3.2-3B causal LM whose vocabulary carries 28 672 audio tokens.
It emits a flat token stream; every seven tokens form one
[SNAC](https://huggingface.co/hubertsiuzdak/snac_24khz) frame, which SNAC's decoder
turns into 2048 samples at 24 kHz.
## Read this before you use it: Orpheus is not a CPU model
A 3B backbone needs about **0.37 s per decode step** on 12 CPU cores, and SNAC needs
~82 tokens for every second of audio. That is roughly **37-41x slower than real time**
on CPU. Canopy Labs announced 1B / 400M / 150M tiers but **never released them** —
their own loader still raises `"not supported ... will be released very soon"` — so
there is no smaller Orpheus to fall back to.
Use this on a GPU. It is mirrored for completeness, not as an offline CPU default.
## Files (`orpheus-3b-en-onnx/`)
| File | What it is |
|---|---|
| `model.onnx` + `model.onnx_data`..`model.onnx_data_6` | Llama backbone, fp32, KV-cached. **The graph needs all seven `.onnx_data` shards next to it.** |
| `snac_decoder.onnx` | SNAC 24 kHz decoder, fp32, copied from [onnx-community/snac_24khz-ONNX](https://huggingface.co/onnx-community/snac_24khz-ONNX) (Apache-2.0), unmodified. |
| `tokenizer.json` | The checkpoint's own BPE, copied from upstream. |
`model.onnx` comes from
[onnx-community/orpheus-3b-0.1-ft-ONNX](https://huggingface.co/onnx-community/orpheus-3b-0.1-ft-ONNX),
re-verified against the torch reference before mirroring (see below).
## Voices
`tara`, `leah`, `jess`, `leo`, `dan`, `mia`, `zac`, `zoe` — in Canopy Labs' own order of
conversational realism. The voice is a **name written into the prompt text**, not an
embedding or a speaker id.
Emotive tags are ordinary text the same BPE encodes: `<laugh>`, `<chuckle>`, `<sigh>`,
`<cough>`, `<sniffle>`, `<groan>`, `<yawn>`, `<gasp>`.
## Verification
Measured against the torch reference (`unsloth/orpheus-3b-0.1-ft`, an ungated copy of
the gated original) on a 19-token served prompt, fp32 both sides:
| Variant | Size | Prefill max abs logit diff | Greedy agreement, 25 steps | ms / decode step | Verdict |
|---|---|---|---|---|---|
| `model` (fp32) | 12.7 GB | 0.166 | **25/25** | 369 | mirrored |
| `model_q4` | 2.4 GB | 8.65 | 23/25 | 371 | rejected — loses parity **and** is not faster |
| `model_q4f16` | 2.1 GB | 8.53 | 10/25 | 96 | rejected — fails parity |
Only fp32 is mirrored. The quantized variants either lose the greedy path or, in the
q4 case, buy nothing: its weights are int4 but its activations stay fp32, so
onnxruntime dequantizes on the fly and the step cost is unchanged.
SNAC's decoder is **stochastic** — it contains a noise block, so two decodes of the
same codes differ. Its ONNX export was therefore checked against the model's own
run-to-run spread (mean of 40 decodes, relative RMS) rather than by exact diff:
| SNAC decoder | Relative RMS vs torch mean | Ratio to noise floor | Verdict |
|---|---|---|---|
| `decoder_model` (fp32) | 0.0200 | 0.89x | pass |
| `decoder_model_fp16` | 0.0233 | 1.03x | pass |
| `decoder_model_int8` | 0.1356 | 6.02x | fail |
| `decoder_model_uint8` / `_quantized` | 0.1089 | 4.83x | fail |
`decoder_model_q4` and `decoder_model_bnb4` are byte-for-byte the same size as fp32 and
produce identical output — the quantizer skipped this convolutional graph entirely, so
those names are misleading rather than smaller.
## Licensing
- Orpheus model and code: Apache-2.0, © Canopy Labs.
- SNAC: Apache-2.0, © Hubert Siuzdak.
- This repository: Apache-2.0. Converted weights only.
Canopy Labs ask that the model not be used for impersonation without consent,
misinformation, or deception.
|