CoolFace
Modelpublic

q3146dq4/Supertonic-3-LiteRT-Static-MultiPreset-GELU

sourceHugging Faceopenrailupdated 21d agoView on Hugging Face
0likes699downloads
Model Card

Supertonic-3 LiteRT Static MultiPreset GELU

FP32 LiteRT conversion of [Supertone/supertonic-3](https://huggingface.co/Supertone/supertonic-3) optimized around multiple pre-specialized static text/latent shapes.

The original Supertonic-3 ONNX graphs use dynamic text (T) and latent (L) dimensions.

This release instead provides a set of static T/L presets and selects the smallest fitting signature at runtime. This keeps most of the practical flexibility of dynamic shapes while allowing LiteRT/XNNPACK to execute pre-specialized fixed-shape graphs.

An exact GELU pattern fusion is also applied during conversion.

[!IMPORTANT] This model was converted directly from the official Supertone/supertonic-3 ONNX release. It is not a modification, quantization, extraction, or redistribution of soniqo/Supertonic-3-LiteRT.

Design

Why static multi-preset?

A single large fixed-shape LiteRT graph is simple to optimize, but wastes computation on short utterances.

For example, always executing T128/L128 would make a short T32/L32 sentence pay for a much larger graph than necessary.

This model therefore provides:

text
Text presets:
T = 32, 48, 64, 80, 96, 112, 128

Latent presets:
L = 32, 48, 64, 80, 96, 112, 128

The engine selects the smallest preset that can contain the actual input.

Example:

text
token_count = 53
valid_L     = 44

Duration Predictor : T64
Text Encoder       : T64
Vector Estimator   : T64_L48
Vocoder            : L48

Signature layout

Duration Predictor

7 signatures:

text
T32
T48
T64
T80
T96
T112
T128

Text Encoder

7 signatures:

text
T32
T48
T64
T80
T96
T112
T128

Vector Estimator

49 signatures:

text
7 text presets × 7 latent presets

Examples:

text
T32_L32
T32_L48
...
T64_L64
...
T128_L128

Vocoder

7 signatures:

text
L32
L48
L64
L80
L96
L112
L128

Bucket selection

The intended runtime selection rule is:

python
T = smallest_text_preset >= token_count

valid_L = ceil(
    predicted_duration_seconds * 44100 / 3072
)

L = smallest_latent_preset >= valid_L

Then invoke:

text
duration_predictor -> T{T}
text_encoder       -> T{T}
vector_estimator   -> T{T}_L{L}
vocoder            -> L{L}

multi_preset_manifest.json contains the preset layout, signature information and model checksums.


Model files

FileApprox. size
duration_predictor.tflite5.07 MiB
text_encoder.tflite37.94 MiB
vector_estimator.tflite276.67 MiB
vocoder.tflite97.66 MiB

Total: approximately 417 MiB.

This is an FP32 release. No INT8, INT4 or FP16 quantization is applied.


Conversion

text
Official Supertone/supertonic-3 ONNX
                |
                v
        Fixed T/L specialization
                |
                v
   ONNX Runtime ORT_ENABLE_BASIC
                |
                v
          optimized ONNX
                |
                v
            onnx2torch
                |
                v
       exact GELU pattern fusion
                |
                v
           litert-torch
                |
                v
   FP32 multi-signature LiteRT/TFLite

Conversion environment:

text
Python          3.12
PyTorch         2.13.0+cpu
litert-torch    0.9.4
ai-edge-litert  2.2.0
onnx            1.21.0
onnxruntime     1.29.0
onnx2torch      1.5.15

Numerical parity

Every generated LiteRT signature was checked against its corresponding specialized ONNX reference.

Worst observed numerical errors:

ComponentWorst max abs errorWorst RMSE
Duration Predictor2.38e-62.38e-6
Text Encoder8.30e-51.22e-6
Vector Estimator7.39e-69.71e-7
Vocoder3.38e-61.83e-7

These are very small floating-point differences and indicate close numerical parity with the specialized ONNX references.

Full results:

text
parity_report.json

CPU benchmark

Methodology

Three implementations were compared:

  1. 1.Official Supertonic-3 FP32 ONNX
  2. 2.Soniqo Supertonic-3 LiteRT
  3. 3.This Static MultiPreset GELU LiteRT model

Benchmark configuration:

text
CPU threads : 8
Voice       : F1
Speed       : 1.05

Flow steps:
4 / 8 / 16 / 32 / 64

For every model × sentence-length case × step count:
1 warm-up run excluded
5 measured runs
median reported

Model/session initialization and WAV file writes are excluded from inference timing.

Execution order and sentence order were rotated during the benchmark to reduce systematic order/thermal bias.

These are PC/WSL CPU results, not Android ARM benchmark results.


Sentence-length AutoBucket sweep

The benchmark generated real sentence-length cases using the actual tokenizer and duration predictor.

The resulting New-model buckets were:

CaseTokensPredicted durationvalid LSelected bucket
C01321.84 s27T32/L32
C02472.74 s40T48/L48
C03643.99 s58T64/L64
C04785.08 s73T80/L80
C05946.26 s90T96/L96
C061097.17 s103T112/L112
C071288.82 s127T128/L128

This confirms that the AutoBucket selector traverses the complete preset range rather than always falling back to a large signature.


Speedup vs official dynamic ONNX

Values below are median end-to-end synthesis speedups.

New bucket4 step8 step16 step32 step64 step
T32/L322.236x2.108x2.241x1.869x2.465x
T48/L482.070x2.305x2.376x1.917x2.410x
T64/L642.770x2.189x2.437x2.188x2.751x
T80/L802.800x2.170x2.270x2.299x2.873x
T96/L962.636x2.254x2.548x2.260x2.778x
T112/L1122.129x1.926x2.209x2.100x2.357x
T128/L1282.678x2.330x2.601x2.420x2.732x

Across all 35 tested bucket/step combinations, this model was faster than the official dynamic ONNX CPU path.

Observed speedup range:

text
1.869x – 2.873x

Speedup vs Soniqo LiteRT

For Soniqo comparisons, short cases fit directly into its fixed T128/L64 execution shape.

Longer cases do not fit into L64 as a single utterance. For those cases, the benchmark harness split the input into the minimum number of T128/L64-compatible chunks and summed the complete DP + Text Encoder + Vector Estimator + Vocoder time.

This chunking policy is part of the benchmark harness and should not be interpreted as an official Soniqo runtime implementation.

Soniqo chunk counts in this sweep:

New bucketSoniqo execution
T32/L321 chunk
T48/L481 chunk
T64/L641 chunk
T80/L802 chunks
T96/L962 chunks
T112/L1122 chunks
T128/L1283 chunks

Median speedup:

New bucket4 step8 step16 step32 step64 step
T32/L321.710x1.716x1.496x1.630x1.696x
T48/L481.238x1.512x1.359x1.315x1.279x
T64/L641.128x0.936x1.084x0.981x0.999x
T80/L801.785x1.754x1.677x1.624x1.674x
T96/L961.414x1.438x1.380x1.392x1.398x
T112/L1121.074x1.049x1.427x1.194x1.082x
T128/L1281.765x1.699x1.810x1.927x1.576x

The T64/L64 case is effectively at parity with Soniqo for several step counts.

This is expected: both models execute an L64 graph in that region, so the major latent-length reduction advantage disappears.

The larger buckets become more favorable once Soniqo requires multiple L64 chunks.


Example absolute timings

8-step median

BucketOfficial ONNXSoniqo LiteRTThis model
T32/L320.4478 s0.3644 s0.2124 s
T48/L480.5826 s0.3820 s0.2527 s
T64/L640.8118 s0.3471 s0.3708 s
T80/L801.0294 s0.8320 s0.4743 s
T96/L961.2049 s0.7686 s0.5345 s
T112/L1121.3088 s0.7131 s0.6796 s
T128/L1281.5610 s1.1381 s0.6700 s

Vector Estimator scaling

The Vector Estimator is the dominant repeated stage.

At 64 steps, median per-step execution scaled approximately as:

BucketOfficial ONNXSoniqoThis model
T32/L3249.94 ms34.02 ms20.08 ms
T48/L4863.10 ms33.17 ms25.95 ms
T64/L6489.88 ms32.21 ms32.34 ms
T80/L80113.44 ms65.45 ms39.12 ms
T96/L96129.22 ms64.42 ms46.16 ms
T112/L112141.72 ms64.39 ms59.78 ms
T128/L128169.83 ms97.05 ms61.64 ms

The monotonic scaling across the preset range is useful evidence that the static signatures are behaving as intended.


Initialization

The same Python benchmark measured model/session initialization separately:

text
Official ONNX : 1.756 s
Soniqo LiteRT : 1.957 s
This model    : 10.234 s

The larger startup cost is associated with the large multi-signature LiteRT model and the Python LiteRT/XNNPACK initialization path.

This is not included in the steady-state synthesis benchmark above.

The 10.23 s result should also not be treated as a universal or intrinsic startup time for this model. Runtime implementation details can significantly affect multi-subgraph initialization.

For Android applications, a custom runtime can potentially reduce startup overhead by lazily preparing only the selected T/L signature instead of eagerly preparing unused subgraphs. Such a runtime optimization is separate from the model files in this repository and is not benchmarked here yet.


Maximum single-call size

The largest included preset is:

text
T128 / L128

With:

text
sample rate                = 44100 Hz
samples per latent frame   = 3072

L128 corresponds to approximately:

text
128 × 3072 / 44100 ≈ 8.92 seconds

of latent capacity.

Inputs exceeding T128 or L128 should be split by the application/engine.


Quality and parity notes

This release is FP32 and is intended to preserve the upstream model rather than reduce precision.

The graph-level parity results are the primary conversion-correctness check.

Do not interpret raw sample-by-sample waveform correlation between different T/L execution shapes as a direct speech-quality score.

Different static shapes can introduce very small floating-point differences into the iterative Vector Estimator trajectory, and those differences may accumulate over many flow steps even when the resulting speech remains perceptually equivalent.

For end-to-end evaluation:

  1. 1.use parity_report.json for graph-level conversion correctness;
  2. 2.listen to generated WAV output;
  3. 3.use perceptually relevant/aligned spectral metrics if automated audio comparison is required.

Metadata files

Recommended to keep:

text
multi_preset_manifest.json
parity_report.json

multi_preset_manifest.json documents the available signatures and bucket-selection policy.

parity_report.json contains numerical conversion validation.

build_checkpoint_v7.json is only an exporter/resume artifact and is not required for runtime or distribution.


Supported languages

Language support is inherited from upstream Supertonic-3:

CodeLanguageCodeLanguageCodeLanguage
enEnglishkoKoreanjaJapanese
arArabicbgBulgariancsCzech
daDanishdeGermanelGreek
esSpanishetEstonianfiFinnish
frFrenchhiHindihrCroatian
huHungarianidIndonesianitItalian
ltLithuanianlvLatviannlDutch
plPolishptPortugueseroRomanian
ruRussianskSlovakslSlovenian
svSwedishtrTurkishukUkrainian
viVietnamese

Limitations

  • FP32 only; this release is not designed primarily for model-size reduction.
  • Larger file size than a single-shape LiteRT export.
  • Higher eager initialization cost in the tested Python LiteRT runtime.
  • Maximum included text preset is T128.
  • Maximum included latent preset is L128.
  • Inputs beyond those limits require application-level chunking.
  • Some T/L combinations may provide only a small performance advantage over a well-optimized fixed-shape LiteRT graph.
  • CPU performance depends on LiteRT/XNNPACK version, thread count, CPU architecture, affinity, thermal state and runtime initialization policy.
  • The published benchmark is a PC/WSL CPU benchmark and is not a substitute for Android ARM device measurements.

Upstream model

This repository changes the deployment representation of Supertonic-3, not its training data or fundamental TTS capabilities.

For upstream model details, language support, voice styles and original usage documentation:

Supertone/supertonic-3

https://huggingface.co/Supertone/supertonic-3


License

The converted model is derived from Supertone/supertonic-3.

The upstream model is released under the OpenRAIL-M License.

Use and redistribution of this converted model are subject to the applicable upstream model license terms.

See the upstream LICENSE for complete terms.


Credits

  • Supertone Inc. — original Supertonic-3 model
  • Google AI Edge / LiteRT
  • XNNPACK
  • ONNX Runtime
  • onnx2torch

Static T/L specialization, multi-signature export, exact GELU fusion, parity validation, AutoBucket selection and the benchmark harness for this repository were implemented independently using the official Supertonic-3 ONNX release as the source.