Downloads · 30 days
0
REALBITS/MOSS-TTS-Nano-100M-ONNX-fp16
MOSS-TTS-Nano-100M-ONNX-fp16 is a text-to-speech model from REALBITS. Use it when you need text read aloud. It is set up for onnx. The card lists the license as apache-2.0.
Half-precision-quantized version of OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX, re-exported with shared external weight data so prefill and decodestep mmap the same 220 MB blob instead of duplicating weights. Tuned for ARM…
Downloads · 30 days
0
Access
Public
Updated Apr 27, 2026
Repo size
336 MB
Likes
0
Public
Click a slice to open those files.
.data334 MB · 99%
From the Hugging Face model README
Half-precision-quantized version of OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX, re-exported with shared external weight data so prefill and decode_step mmap the same 220 MB blob instead of duplicating weights. Tuned for ARM CPUs with native fp16 SIMD (Snapdragon 8 Gen 2/3, Apple A14+, etc).
Audio codec is unchanged from upstream. Use this repo for the language model graphs and pull the codec from OpenMOSS-Team/MOSS-Audio-Tokenizer-Nano-ONNX.
| File | Size | Purpose |
|---|---|---|
moss_tts_prefill.onnx | 476 KB | global LM, full-context prefill |
moss_tts_decode_step.onnx | 503 KB | global LM, autoregressive single step (KV cache) |
moss_tts_local_fixed_sampled_frame.onnx | 819 KB | local LM with baked-in sampling |
moss_tts_global_shared_fp16.data | 220 MB | fp16 weights shared by prefill + decode_step |
moss_tts_local_fixed_sampled_frame_fp16.data | 113 MB | fp16 weights for the local sampler |
tokenizer.model | 471 KB | SentencePiece (unchanged from upstream) |
browser_poc_manifest.json | 503 KB | prompt templates + 18 builtin voices |
tts_browser_onnx_meta.json | 4 KB | I/O metadata |
| Total | ~336 MB | (vs 640 MB upstream fp32 LM, 196 MB int8) |
| Variant | LM size | Quality vs FP32 | Use when |
|---|---|---|---|
| FP32 (upstream) | 640 MB | reference | offline rendering, high-end devices |
| FP16 (this repo) | 336 MB | indistinguishable from FP32 | mobile devices with native fp16 |
| INT8 (sister repo) | 196 MB | ~3 dB envelope shift, slightly more monotone delivery | size-constrained, fastest |
Triple A/B objective analysis (Adam voice, same long demo, seed=42):
| Metric | FP32 | FP16 | INT8 |
|---|---|---|---|
| RMS dBFS | -20.79 | -20.49 | -20.18 |
| F0 mean (Hz) | 110.0 | 110.7 | 114.0 |
| F0 std (Hz) | 32.7 | 35.1 | 21.9 ← more monotone |
| Voice-band envelope MAE vs FP32 | 0 dB | 9.7 dB ← content-length variance | 13.4 dB |
| Silent-region noise floor RMS | 0.0014 | 0.0016 | 0.0017 |
The conversion uses
onnxruntime.transformers.float16.convert_float_to_float16(keep_io_types=True)
with these ops kept at fp32 (precision-sensitive):
LayerNormalizationGroupNormalizationSoftmaxCastThis preserves the standard "fp16 forward pass with fp32 norm/softmax" recipe that's robust across most transformer architectures. The audio output is visually indistinguishable from fp32 in spectral envelope (within the noise floor of run-to-run sampling variance — the model has stochastic decoding).
| Hardware | FP16 RTF | Notes |
|---|---|---|
| x86 desktop CPU (no AVX-512 BF16) | ~0.75 (slower than fp32 0.38) | ORT-CPU has no fp16 GEMM; expands to fp32 + downconverts |
| Snapdragon 8 Gen 2/3 ARM cores | TBD | Native fp16 SIMD; expect close to int8 |
| Apple A14+ | TBD | Native fp16 SIMD |
| ARM Cortex-X1 / older | varies | Less native support |
If you're targeting x86 CPU, use the int8 variant instead — fp16 is a loss there.
from onnxruntime import InferenceSession, SessionOptions
from huggingface_hub import snapshot_download
lm_dir = snapshot_download("REALBITS/MOSS-TTS-Nano-100M-ONNX-fp16")
codec_dir = snapshot_download(
"OpenMOSS-Team/MOSS-Audio-Tokenizer-Nano-ONNX",
allow_patterns=["moss_audio_tokenizer_decode_*", "*.json"],
)
# Drive prefill → loop {sampler → decode_step} → codec.decode_full
# (or codec.decode_step for streaming) per upstream onnx_tts_runtime.py.
This repo is a v2 candidate for the Fictures MOSS-TTS-Nano Android prototype. Switch to it via:
adb shell setprop debug.mosstts.variant FP16
then restart the app and tap Download.
Repro: see
_dryrun/13_quantize_fp16.py.
Three steps:
onnx.load(load_external_data=True) for each LM graphconvert_float_to_float16(keep_io_types=True, op_block_list=[LayerNorm, GroupNorm, Softmax, Cast])save_as_external_data=True; hash the resulting .data files;
collapse byte-identical pairs (prefill + decode_step share the underlying
transformer weights) into one shared moss_tts_global_shared_fp16.data
and rewire both graphs' external_data location attributes.Apache 2.0, inherited from upstream OpenMOSS/MOSS-TTS-Nano.
Same as the upstream and int8 variant: English / Chinese / Japanese only;
no microphone voice cloning out of the box (use the 18 builtin voices in
browser_poc_manifest.json); codec stays fp32.