Loading…
Loading…
ResembleAI/chatterbox-nanoS3CFM.mlpackage/Data/com.apple.CoreML/weights/weight.bin 147 MBS3Tokenizer.mlpackage/Data/com.apple.CoreML/weights/weight.bin 130 MBT3LM.mlpackage/Data/com.apple.CoreML/weights/weight.bin 120 MBS3Encoder.mlpackage/Data/com.apple.CoreML/weights/weight.bin 93 MBS3Vocoder.mlpackage/Data/com.apple.CoreML/weights/weight.bin 35 MBCAMPPlus.mlpackage/Data/com.apple.CoreML/weights/weight.bin 29 MBMatchaMel.mlpackage/Data/com.apple.CoreML/weights/weight.bin 8 MBVELSTM.mlpackage/Data/com.apple.CoreML/weights/weight.bin 6 MBVEMel.mlpackage/Data/com.apple.CoreML/weights/weight.bin 338 kBdefault-conds.safetensors 164.8 kBOn-device Apple Silicon build of ResembleAI Chatterbox Nano for iOS 18+ / macOS 15+. Prefill + decode run fully on the Apple Neural Engine as one weight-shared multifunction CoreML model; the audio synth runs as three further CoreML packages.
Nano is Chatterbox Turbo with a smaller language model — upstream's
tts_nano.py is byte-identical to tts_turbo.py except for the backbone
(GPT2_small vs GPT2_medium) and the T3 checkpoint. Everything downstream is
the same: the S3Gen MeanFlow synth (2 CFM timesteps), the tokenizer, the
conditioning, and the sampler.
| Nano | Turbo | |
|---|---|---|
| T3 backbone | GPT-2 small — 12 layers / 768 hidden / 12 heads | GPT-2 medium — 24 / 1024 / 16 |
| T3 params | 217 M | ~430 M |
T3LM.mlpackage |
120 MB (8-bit palettized) | 328 MB (8-bit palettized) |
| S3 synth stack | identical (bit-for-bit same upstream weights) | — |
| File | What | Backend |
|---|---|---|
T3LM.mlpackage |
T3 prefill + decode, multifunction (q=512 prefill, q=1 decode, shared MLState KV cache) |
CoreML (ANE) |
S3Encoder / S3CFM / S3Vocoder .mlpackage |
speech-token → mel → 24 kHz waveform (MeanFlow CFM, 2 timesteps) | CoreML (ANE/GPU) |
CAMPPlus / MatchaMel / VEMel / VELSTM / S3Tokenizer .mlpackage |
voice-cloning encoders | CoreML |
text_emb.npy, speech_emb.npy |
embedding tables (host-side lookups), 768-wide | — |
spkr_enc_weight.npy, spkr_enc_bias.npy |
speaker conditioning linear (256→768) | — |
default-conds.safetensors, tokenizer files |
supporting artifacts | — |
The four .npy tables are hidden-width-specific. The Swift runtime checks them
against the loaded graph at load time and refuses to run on a mismatch — pairing
Turbo's 1024-wide tables with this 768-wide graph would otherwise produce
garbage audio silently.
Measured on device against a Python-CoreML-CPU baseline, same phone and harness, Turbo shown for reference:
| Nano | Turbo | |
|---|---|---|
| prefill predict (q=512, ANE) | 22 ms | 64 ms |
| prefill ANE parity (cos_sim vs CPU) | 0.9996 | 0.9998 |
Both are 8-bit palettized (k-means, per_grouped_channel, group 16). Nano's
wpe and speech_head stay fp16 — speech_head's 6563 output channels are
prime, so no group size divides them.
Mac (M5, Release CLI, same sentence): Nano generates 4.16 s of audio in 0.65 s (≈6.4× realtime); Turbo 4.00 s in 1.02 s (≈3.9× realtime). The sampler is nondeterministic, so utterance length varies run to run — read these as a rough ratio, not an exact benchmark.
text → BPE → host-assemble inputs_embeds + position_ids + masks
→ T3LM "prefill" function (CoreML, ANE) — writes shared KV state
→ T3LM "decode" function (CoreML, ANE) — autoregressive, reads/writes same state
→ S3Encoder → S3CFM → S3Vocoder (CoreML) — 24 kHz waveform
All attention masks (attn_mask, write_mask, decode update_mask) are built
on the Swift host and passed in, and the prefill's attention is hand-decomposed
rather than fused — on iPhone the ANE's fused attention kernel silently drops the
attn_mask for q_len >> 1.
MIT. These weights are a CoreML format conversion of ResembleAI/chatterbox-nano, which Resemble AI publishes under the MIT licence; the conversion inherits those terms, and copyright in the weights stays with Resemble AI — no claim of ownership is made over them here. Redistribute with attribution to Resemble AI.
The Swift runtime that loads them is separately MIT-licensed; see the LICENSE and
NOTICE files in iliasaz/chatterbox-coreml.