October 19, 2026ResearchPost-Training

Post-Training NVIDIA Nemotron-Labs-Audex-2B, Qwen3-TTS 1.7B, & other Open TTS Models on Alphanumerics with LoRA & Full-Weight SFT

We post-trained and improved five of eight open TTS models via SFT, LoRA and full-weight, on just 1 hr 22 min of Ocular AI's Hi-Fi TTS Alphanumeric Dataset.

Louis MurerwaMichael Moyo
Louis M. and Michael M.
  • Base
  • Gain from fine-tuning
  1. Audex 2B (NVIDIA)

    23.6% → 37.2%+13.6 pts

  2. Llasa 1B (HKUST Audio)

    14.5% → 28.1%+13.6 pts

  3. Spark-TTS 0.5B (SparkAudio)

    19.6% → 31.7%+12.1 pts

  4. Orpheus 3B (Canopy Labs)

    32.0% → 39.3%+7.3 pts

  5. Qwen3-TTS 1.7B (Alibaba Qwen)

    23.6% → 30.5%+6.9 pts

Values read by the human rule on the 331 held-out values, base weights against the published fine-tune. Paired over the same 240 scripts, scored by AssemblyAI raw transcription.

We post-trained and improved five of eight open text-to-speech models via SFT on just 1 hr 22 min of Ocular AI's Hi-Fi TTS Alphanumeric Dataset, studio recordings of expert readers speaking alphanumeric values, LoRA adapters on seven and a full-weight fine-tune on Magpie. We evaluated each model on a private, internal TTS benchmark, a Converse-TTS variant for alphanumeric reading. The five that moved gained 6.9 to 13.6 points from a dataset smaller than a feature film. Spark-TTS learned the order-number rule from two training scripts, 0% to 55%.

Every curve and score below is drawn from the training logs and evaluation transcripts of each run. The next section covers why alphanumerics are hard for TTS, then how the internal benchmark scores a reading.

Why alphanumerics

A text-to-speech model is trained on text paired with speech, and alphanumeric strings are rare in that pairing. Prose is abundant; recorded readings of #29-262-753 or v15.12.17 are not. So the model has no learned rule for what the symbols mean. It reads # as nothing, a dash as a pause or a minus, and a run of digits as whatever number they most resemble. Base Audex reads #29-262-753 as a run of cardinals. None of the five open bases broken out by value type below reads a single order number. Across 22 commercial systems the score is 23.3% to 71.9%, and the best open base reads 32.0%.

The voice is not the problem. Given the spoken form instead of the written form, the same models read 92% to 99%; Kokoro 82M goes from 12% to 99%. What is missing is the mapping from the written value to the convention a person uses, and that mapping is specific to the value type. A phone number is read in groups, a code letter by letter, a version number with "point", an amount with "dollars". Those conventions live in human recordings, and almost nowhere else.

This is where TTS is deployed. Customer-service voice agents confirm order numbers, read back confirmation codes, quote balances, and give callback numbers and appointment dates. Each of those is an alphanumeric value, and each misreading costs a repeat, a transfer to a person, or a caller who writes down the wrong thing. A model that reads prose well and order numbers at 0% is not usable for the turn that matters most in the call. The gap between the written form and the spoken form is the gap between a demo and a deployment, and the data in this post is the data that closes it.

The measurement

The evaluation is an internal benchmark, a variant of Converse-TTS built for alphanumeric reading. It scores whether a model reads a value the way a person does. Each model synthesizes the written script with one default voice, one seed per script, and no reference audio. AssemblyAI transcribes the clip in raw mode, and a value counts when the transcript contains the human reading, allowing swaps that change no information: oh/zero, dot/point, times/by, a dropped "and". The score is the share of the 331 held-out values that pass.

Every base-versus-fine-tune comparison is paired on the same 240 scripts, with a 95% bootstrap interval over scripts and an exact McNemar test on the values that changed status. Judge noise is about two values in 331.

Commercial models score 23.3% to 71.9% across 22 systems. Gemini 3.8 Flash TTS leads at 71.9%. The best open base, Orpheus 3B, reads 32.0%.

Training data

Ocular AI records its Hi-Fi TTS Alphanumeric Dataset in-house: American English alphanumeric speech, read in a studio by expert readers. They record customer-service scripts that carry order numbers, codes, phone numbers, dates, amounts, version numbers, IP addresses and screen sizes, each under a stated reading policy, and every clip is reviewed before it enters the collection. The collection is proprietary and is not published.

The training set for this post is Batch 3 of that collection: 300 clips, 1 hr 22 min, 4 expert readers, 62 scripts. We used all 300 clips for training, with none set aside for validation. That is the whole dataset. No synthetic augmentation, no scraped audio, no second source; every minute is a professional reader in a studio under a stated reading policy.

Readers and sessions

Six sessions of 50 scripts. Four readers, one of whom recorded three sessions. The 62 scripts are Batch 2's 50 plus 12 new ones. Batch 2 is 200 clips and 56.0 minutes, and appears in the Spark-TTS comparison below.

Reading policy

Each script carried a reading policy. Seven of the eight rules are those instructions. Screen sizes follow the readers' consistent pair reading.

Eight conventions

Written value, and the reading the policy asked for.

Value typeWrittenHuman reading
Order number#29-262-753number two nine dash two six two dash seven five three
CodeLHS402702KL H S four zero two seven zero two K
Money$13,569.00thirteen thousand five hundred sixty-nine dollars
Versionv15.12.17V fifteen point twelve point seventeen
Phone(212) 195-1072two one two, one nine five, one zero seven two
Screen size1366×768thirteen sixty-six by seven sixty-eight
IP:port10.49.253.70:22ten dot forty-nine dot two hundred fifty-three dot seventy colon twenty-two
Date06/09/2025June ninth, twenty twenty-five

IP:port is the one rule stricter than the readers, who also say “one ninety-two” for 192.

Audio and transcripts

24-bit 48 kHz FLAC, as recorded. Clips run 4.7 to 60.3 s, median 15.3 s. Each clip carries the written script and a verified transcript. Training uses the written script as the text, so the convention has to come from the audio.

How a training clip is made

  • 01

    A script mixes value types in one customer-service sentence, with a reading policy for each value.

  • 02

    An expert reader records it. Six sessions of 50 scripts, four readers.

  • 03

    The clip is kept as 24-bit 48 kHz FLAC with the written script and a verified transcript.

  • 04

    The trainer sees the written script. The reading is in the audio.

Scored by the same judge, the readers' own Batch 2 recordings land 92% in the rule's form, 5% in another digit form, 3% wrong. That is the human ceiling for this measurement.

Coverage

Supervision per convention is small. Two of the 62 scripts contain an order number; ten contain a code. No held-out value appears in any training script.

Code: 10 scripts, 25.0%Phone: 7 scripts, 17.5%Version: 5 scripts, 12.5%IP:port: 5 scripts, 12.5%Money: 4 scripts, 10.0%Date: 4 scripts, 10.0%Screen size: 3 scripts, 7.5%Order number: 2 scripts, 5.0%
40values in 62 scripts
Training scripts, of 62, that contain each held-out value type, and each type's share of the 40 mentions. A script can contain several types, and some scripts carry value shapes outside the eight.

The held-out set

240 scripts, 331 values. Each script is a templated customer-service sentence with a fresh random value. 40 values per type, 41 screen sizes, 50 dates. Any script whose value appears in training was rejected.

Training configuration

Every open model with a public fine-tuning path on a single 16–24 GB GPU was trained from its own published notebook or official code.[1] Spark-TTS[3], Orpheus[4], NVIDIA Audex[5], Llasa[6], Qwen3-TTS[7], Sesame CSM[8], OuteTTS, NVIDIA Magpie. We changed the data, the epoch count, and the sequence length for 60-second clips. Learning rates and ranks are the recipe's. Where a first attempt failed for a reason in the recipe, the corrected attempt is the published one.

Method

Every run is supervised fine-tuning. The model is given the written script and trained to predict the audio tokens of the human reading, with the same teacher-forced cross-entropy it was pretrained on. The training loss in the tables below is that objective. The benchmark never enters training: there is no reward model, no preference pairs, no judge in the loop. The score is measured afterward on held-out values the model did not see.

Seven of the eight models train LoRA adapters. The base weights stay frozen, and small low-rank matrices are added to the attention and MLP projections and trained in their place. Rank sets how much the adapter can express; the recipes here use 32 to 128. Freezing the base keeps the voice and the pretrained speech ability intact, lets a 2B–3B model train on a single 16–24 GB GPU, and produces a small adapter file instead of a new copy of the model. On 1 hr 22 min of audio it also bounds how far the model can drift from its pretraining, which is what the one full fine-tune of a larger model did: Qwen3-TTS 0.6B with all weights unfrozen ran to the length cap and read 0 of 331.

Magpie trains all 357M weights. Its NeMo recipe is a full fine-tune, and at that size the whole model fits in a T4. It is the one published run with no adapter.

We kept each model's own published method rather than imposing one recipe across all eight. The question is whether this audio moves an open model under the fine-tuning path its authors ship, so the data is the variable and the recipe is held fixed. Six of those recipes are the Unsloth notebooks, which are plain SFT trainers over text and audio pairs. Qwen3-TTS uses its official code and Magpie uses NeMo.

Method by model

What each published run trained, and where the recipe came from.

ModelMethodTrained weightsRankRecipe
Spark-TTS 0.5BLoRAq, k, v, o, gate, up, down128Unsloth notebook
Orpheus 3BLoRAq, k, v, o, gate, up, down64Unsloth notebook
Audex 2BLoRAq, k, v, o, up, down64Unsloth notebook
Llasa 1BLoRAq, k, v, o, gate, up, down64Unsloth notebook
Qwen3-TTS 1.7BLoRATalker projections128Official code
Sesame CSM 1BLoRANotebook targets32Unsloth notebook
OuteTTS 1BLoRAq, v128Unsloth notebook
Magpie 357MFull fine-tuneAll 357M—NeMo

Trained weights are the projections the adapters attach to. Attempt 1 of Llasa adapted q and v only in fp16 and emptied 11 clips; the published run adapts all projections in bf16.

Shared protocol

Six trainers are the Unsloth notebook pointed at this audio folder: Spark, Orpheus, Llasa, CSM, Audex, Oute.

  • AdamW 8-bit, weight decay 0.001, linear decay, 5 warmup steps, seed 3407.
  • LoRA dropout 0, base weights frozen. No checkpoints, no validation split.
  • bf16 on the A10G. Spark and Oute train in fp32 on a T4, as their notebooks are written.
  • Text field is the written script. Packing off.

Generation uses each model's own inference path, one default voice, one seed per script, no reference audio.

Published runs

One published run per model. The table lists the recipe, the step count, and the first and last logged training loss. Six of the eight follow the Unsloth notebook; Qwen3-TTS runs under Accelerate and Magpie under NeMo.

Published attempt

Recipe, steps, and logged training loss for each model.

ModelRecipeEpochsLearning rateStepsLossGPUTime
Spark-TTS 0.5BLoRA r=12851e-41906.76 → 5.31T431 min
Orpheus 3BLoRA r=6432e-42254.71 → 3.71A10G9 min
Audex 2BLoRA r=64, attempt 232e-42259.00 → 6.54A10G7 min
Llasa 1BLoRA r=64, all projections, bf1631e-41116.99 → 5.71A10G4 min
Qwen3-TTS 1.7BLoRA r=128 on the talker63e-590014.11 → 4.59A10G15 min
Sesame CSM 1BLoRA r=32, attempt 131e-41145.01 → 4.18A10G27 min
OuteTTS 1BLoRA r=12832e-41143.81 → 3.07T482 min
Magpie 357MFull fine-tune, NeMo35e-611210.67 → 8.38T4—

Loss is the first and last logged value. Qwen3-TTS and Llasa list the attempt that recovered after the notebook recipe failed. Magpie's wall-clock time was not recorded.

Trainer settings

Adapters go on all seven attention and MLP projections (q, k, v, o, gate, up, down) for Spark, Orpheus, and Llasa, with alpha equal to rank. Audex has no gate projection, so its adapters cover six. Oute's notebook adapts q and v only. CSM uses the notebook's targets at r=32.

Sequence length is 2,048 tokens for Spark, Llasa, CSM, and Oute, and 4,608 for Orpheus and Audex so a minute-long clip fits. Gradient accumulation is 4 everywhere. The micro-batch is 2 on the 0.5B–1B models, an effective batch of 8, and 1 on Orpheus 3B and Audex 2B, an effective batch of 4. That is why Orpheus and Audex log 225 steps over three epochs and Spark logs 190 over five.

Qwen3-TTS runs under Accelerate with AdamW, weight decay 0.01, grad clip 1.0, accumulation 4, bf16, and LoRA r=128 on the talker projections only. Magpie is NeMo in fp32, a constant 5e-6, full 357M weights.

Attempts

Spark-TTS and Orpheus worked on the first run and are not listed. For the other six models the table carries every attempt, including the ones the recipe broke, with the logged loss and the held-out score of each.

Every scored attempt

The notebook recipe, and what changed when the audio failed.

ModelAttemptConfigurationLossBy rule
Llasa 1B1fp16, LoRA r=128 on q and v, 3 epochs, 2e-46.99 → 6.055.1%
Llasa 1B2bf16, LoRA r=64 on all projections, 3 epochs, 1e-46.99 → 5.7128.1%
Qwen3-TTS10.6B full fine-tune, 3 epochs, 2e-5, 450 steps12.52 → 3.310.0%
Qwen3-TTS2Adapters on the code predictor as well—unscored
Qwen3-TTS31.7B talker LoRA r=128, 3 epochs, 1e-4, 450 steps13.40 → 5.126.3%
Qwen3-TTS4Talker LoRA r=128, 6 epochs, 3e-5, 900 steps14.11 → 4.5930.5%
Audex 2B1LoRA r=64, 3 epochs, 2e-4, 225 steps9.00 → 6.5431.1%
Audex 2B2Same recipe, second seed9.00 → 6.5437.2%
CSM 1B1LoRA r=32, 3 epochs, 1e-4, 114 steps5.01 → 4.1820.8%
CSM 1B4Backbone only, 1 epoch, 5e-5, no padding5.01 → 4.9716.0%
CSM 1B5Backbone only, stop frame weighted ×20108.6 → 2.2416.9%
OuteTTS 1B1LoRA r=128 on q and v, 3 epochs, 2e-43.81 → 3.075.4%
Magpie 357M1Full fine-tune, 3 epochs, 5e-6, 112 steps10.67 → 8.380.0%

CSM attempt 5's loss is divided by 8 to sit on the same scale as the other CSM runs; the raw log opens at 868.5.

Llasa's first run emptied 11 of 240 clips. Qwen's 0.6B full fine-tune ran to the length cap, 0 of 331. Qwen attempt 2 produced a tone. Audex's two identical runs scored 31.1% and 37.2%; that spread is the seed variance on every number here.

Training loss

The grid below is a side-by-side of the training outcomes: one panel per model, every scored attempt for that model drawn in its panel, so the eight recipes can be compared on the same axes. One point per logged step, no smoothing. The loss is the teacher-forced cross-entropy over audio tokens, so a falling curve means the human reading got easier to predict. The held-out score is a separate measurement. The x-axis is epochs rather than steps: runs log between 38 and 900 steps depending on batch size and length, and the epoch count is what the recipes actually fix.

Where a model has several curves, the legend marks the published run; the others are attempts that failed or were superseded. Across panels, the y-axis differs because each tokenizer has its own loss scale, so compare the shape and the drop, not the absolute level. Hover a curve for the loss at that epoch.

Training loss

Every attempt, cross-entropy by epoch.

ocular-orpheus-3b

3.544.550123EPOCHTRAINING LOSSocular-orpheus-3b
  • attempt 1 · LoRA r=64

ocular-spark-tts-0.5b

567012345EPOCHTRAINING LOSSocular-spark-tts-0.5b
  • run 1 · Batch 2 full FT
  • run 2 · Batch 2 LoRA
  • run 3 · Batch 3 LoRA (published)

ocular-audex-2b

67890123EPOCHTRAINING LOSSocular-audex-2b
  • attempt 1 · LoRA r=64
  • attempt 2 · same recipe (published)

ocular-llasa-1b

66.570123EPOCHTRAINING LOSSocular-llasa-1b
  • attempt 1 · fp16, 2 projections
  • attempt 2 · bf16, all projections (published)

ocular-qwen3-tts-1.7b

510150123456EPOCHTRAINING LOSSocular-qwen3-tts-1.7b
  • attempt 1 · 0.6B full FT
  • attempt 3 · 1.7B talker LoRA
  • attempt 4 · 1.7B talker LoRA, 6 ep (published)

ocular-csm-1b

0501000123EPOCHTRAINING LOSSocular-csm-1b
  • attempt 1 · LoRA r=32
  • attempt 2 · no padding
  • attempt 4 · backbone, 1 epoch
  • attempt 5 · stop frame ×20 (loss ÷8)
  • attempt 6 · trimmed tails (loss ÷8)

ocular-oute-1b

33.50123EPOCHTRAINING LOSSocular-oute-1b
  • attempt 1 · LoRA r=128

ocular-magpie-357m

810120123EPOCHTRAINING LOSSocular-magpie-357m
  • attempt 1 · full FT (NeMo)
Source: log_history.json for each attempt, with the step index divided by steps per epoch. CSM attempts 5 and 6 are divided by 8. Spark run 1 has no step index, so its log row stands in for the step.

Qwen3-TTS

The 0.6B full fine-tune falls 12.5 → 3.3 and the audio is unintelligible. The published talker LoRA falls 14.1 → 4.6 over 900 steps and moves the score 23.6% → 30.5%. The same adapter for 3 epochs at 1e-4 drops the score to 6.3%. On the chart the three curves are nearly indistinguishable by shape; the run that collapsed is the one that ends lowest.

ocular-qwen3-tts-1.7b

510150123456EPOCHTRAINING LOSSocular-qwen3-tts-1.7b
  • attempt 1 · 0.6B full FT
  • attempt 3 · 1.7B talker LoRA
  • attempt 4 · 1.7B talker LoRA, 6 ep (published)
Qwen3-TTS, three scored attempts. The 0.6B full fine-tune reaches the lowest loss and reads 0 of 331. The published 1.7B talker LoRA runs six epochs at a third of the learning rate.

Llasa

Attempt 1 falls 6.99 → 6.05, the score falls 14.5% → 5.1%, and 11 clips are empty. Attempt 2, bf16 on all projections at 1e-4, ends at 5.71 and scores 28.1%. The two curves start at the same loss and separate within the first epoch.

ocular-llasa-1b

66.570123EPOCHTRAINING LOSSocular-llasa-1b
  • attempt 1 · fp16, 2 projections
  • attempt 2 · bf16, all projections (published)
Llasa 1B, both attempts. fp16 on q and v against bf16 on all seven projections, same data, same epoch count. The lower curve is the one that reads.

Sesame CSM

Attempt 1 falls 5.01 → 4.18 and the score rises 16.6% → 20.8%. The clips run past the sentence; WER goes 39% → 114%. Restoring the stop (attempts 4 and 5) returns the score to 16.0% and 16.9%. No run produced both the reading and a clean stop. Attempt 5 weights the stop frame ×20, which is why its curve opens far above the others even after dividing by 8.

ocular-csm-1b

251020501000123EPOCHTRAINING LOSS, LOG SCALEocular-csm-1b
  • attempt 1 · LoRA r=32
  • attempt 2 · no padding
  • attempt 4 · backbone, 1 epoch
  • attempt 5 · stop frame ×20 (loss ÷8)
  • attempt 6 · trimmed tails (loss ÷8)
Sesame CSM 1B, five attempts, on a log loss axis so the ×20 stop-frame runs and the plain runs can be read together. Attempts 5 and 6 are divided by 8. Attempt 4 trains the backbone alone for one epoch.

Magpie

Loss falls 10.67 → 8.38. Score stays at 0 of 331. The NeMo tokenizer drops #, $, ×, and : before the model sees them.[2] Behind NVIDIA's normalizer the same weights read 44%. The curve is noisy step to step and trends down across all three epochs, and what it measures is a model learning to predict audio for text it cannot see the symbols of.

ocular-magpie-357m

810120123EPOCHTRAINING LOSSocular-magpie-357m
  • attempt 1 · full FT (NeMo)
Magpie 357M, full fine-tune under NeMo. The loss falls by a fifth across three epochs. Every one of the 331 held-out values is still read wrong.

Loss against score

Put every scored attempt on one chart, loss drop on one axis and score change on the other, and there is no line to draw through it. The three largest drops are the three Qwen runs, and two of them end below where they started. Magpie's drop matches Spark's and Orpheus's and yields nothing. The runs that gained the most, Audex, Llasa, and Spark, sit in the same 18–28% band as Oute and Magpie, which gained nothing.

-20-100+100%20%40%60%80%TRAINING LOSS DROP, SHARE OF FIRST LOGGED LOSSREAD BY RULE, CHANGE IN POINTSSpark-TTS 0.5BOrpheus 3BAudex 2BLlasa 1BQwen3-TTS 0.6B full FTQwen3-TTS 1.7BCSM 1BOuteTTS 1BMagpie 357M
  • published run
  • other scored attempt
  • Orpheus 3B
  • Spark-TTS 0.5B
  • Audex 2B
  • Llasa 1B
  • Qwen3-TTS 1.7B
  • CSM 1B
  • OuteTTS 1B
  • Magpie 357M
One point per scored attempt with a logged curve. Loss drop is first logged loss minus last, as a share of the first. Score change is read-by-rule after fine-tuning minus the base, in points. Filled circles are published runs. The Qwen 0.6B full fine-tune is plotted against the 1.7B base. CSM attempt 5 is omitted because its loss is a differently weighted objective.

Results

Each fine-tune is scored against its own base on the same 240 scripts. Five intervals exclude zero. CSM attempt 1 also excludes zero and is left out, because the audio does not stop.

Read by the human rule

Base model against the fine-tune, on 331 values.

22 commercial models, 23.3–71.9%

0255075100
  1. Orpheus 3B32.0 → 39.3
  2. Audex 2B23.6 → 37.2
  3. Spark-TTS 0.5B19.6 → 31.7
  4. Qwen3-TTS 1.7B23.6 → 30.5
  5. Llasa 1B14.5 → 28.1
  6. CSM 1B, attempt 116.6 → 20.8
  7. Oute 1B4.5 → 5.4
  8. Magpie 357M0.0 → 0.0
  • Base model
  • Fine-tuned, gain held
  • Fine-tuned, gain did not hold
Shaded band: the 22 commercial models, 23.3% to 71.9%. CSM is attempt 1. Open circles are base weights, filled circles the fine-tune.

The same comparison as a table. Delta is the number of values, out of 331, that the fine-tune reads by the rule and the base does not, net of the values it lost. The two right-hand columns split that net into values gained and values lost.

Paired comparison

Values that changed status, base against fine-tune.

ModelBaseFine-tunedDelta95% intervalWrong to rightRight to wrongp
Spark-TTS 0.5B19.6%31.7%+40+20 to +6168280.0001
Audex 2B23.6%37.2%+45+27 to +636520<0.001
Llasa 1B14.5%28.1%+45+31 to +60538<0.001
Orpheus 3B32.0%39.3%+24+6 to +4252280.010
Qwen3-TTS 1.7B23.6%30.5%+23+10 to +3735120.001
CSM 1B, attempt 116.6%20.8%+14+3 to +252390.020
OuteTTS 1B4.5%5.4%+3−6 to +131180.65
Magpie 357M0%0%00 to 0001

Delta is the change in values read by the rule. 95% bootstrap interval over scripts. p is an exact McNemar test. CSM is attempt 1.

By value type

Each held-out type is 40 values, with 41 screen sizes and 50 dates. The table gives the share read by the rule before and after fine-tuning, for the five models whose paired interval excludes zero.

Five models that improved

Percent read by the rule, base then fine-tune, by value type.

ModelOrderCodeMoneyVersionPhoneScreenIP:portDate
Spark-TTS 0.5B0 → 5538 → 7050 → 7510 → 255 → 1259 → 240 → 00 → 0
Audex 2B0 → 5070 → 5760 → 7820 → 5015 → 4029 → 320 → 00 → 0
Orpheus 3B0 → 3028 → 4880 → 7550 → 8012 → 2893 → 610 → 20 → 0
Llasa 1B0 → 822 → 5055 → 8510 → 5012 → 2020 → 170 → 00 → 2
Qwen3-TTS 1.7B0 → 062 → 8090 → 9820 → 2522 → 200 → 290 → 00 → 0

Codes, versions, and amounts move on every improved model. Dates stay at zero except one date from Llasa.

Order numbers

Two of 62 training scripts contain an order number. After fine-tuning: Spark-TTS 55%, Audex 50%, Orpheus 30%, each from 0%. Gemini 3.8 Flash TTS, the strongest commercial model on this rule, reads 52%. Polly reads 0%.

  • Base
  • Gain from fine-tuning
  • Commercial reference
  1. Spark-TTS 0.5B (SparkAudio)

    0% → 55%+55 pts

  2. Gemini 3.8 Flash TTS (Google)commercial, no fine-tune

    52%

  3. Audex 2B (NVIDIA)

    0% → 50%+50 pts

  4. Orpheus 3B (Canopy Labs)

    0% → 30%+30 pts

  5. Llasa 1B (HKUST Audio)

    0% → 8%+8 pts

Percent of 40 held-out order numbers read by the rule, base weights against the fine-tune. Gemini 3.8 Flash TTS is the strongest commercial model on this rule and was not fine-tuned on this data.

Base Audex reads #29-262-753 as a run of cardinals. The fine-tune says "number" and "dash".

Dates and IP addresses

Four date scripts and five IP:port scripts. Neither moved. Llasa reads one held-out date, "June twelfth, twenty twenty-five". Eleven v4, Inworld TTS-1.5 Max, and the normalizers in front of Polly and Magpie read all fifty dates without this data.

More of the dataset, same recipe

Spark-TTS, same LoRA recipe, two batches. 19.6% base → 26.6% on Batch 2 (56 min) → 31.7% on Batch 3 (1 hr 22 min). Batch 3 beats Batch 2 by 17 values, 95% interval +2 to +32, p = 0.03.

Spark-TTS 0.5B

202530041.282.4MINUTES OF READINGSREAD BY RULE (%)Spark-TTS 0.5B
  • LoRA r=128
  • Batch 2 full fine-tune
Spark-TTS 0.5B, the same LoRA recipe with more of Ocular AI's Hi-Fi TTS Alphanumeric Dataset. Read-by-rule on 331 held-out values. The single marker is a full fine-tune on Batch 2 only, three epochs at 2e-4, which reached 33.5%.

Regressions

Orpheus fell on screen sizes, 93% → 61%, and Spark-TTS 59% → 24%. The base says "times" for ×, which the metric accepts. The training readings say "by". The fine-tune dropped "times" without reliably picking up "by". Audex's codes fell 70% → 57% while its order numbers rose 0% → 50%.

What the data changed

Just 1 hr 22 min of Ocular AI's Hi-Fi TTS Alphanumeric Dataset moved five open models by 6.9 to 13.6 points, with paired intervals that exclude zero. The clearest transfer, order numbers, came from two scripts and put three open models next to the best commercial model on that rule. These models were pretrained on hundreds of thousands of hours of speech; a dataset five orders of magnitude smaller changed how they read, because every clip carried exactly the convention they were missing. The lever is not volume. It is readings that are correct, consistent, and recorded under a policy.

The three that did not move failed for reasons outside the audio. Magpie's tokenizer deletes the symbols. CSM learns the reading and loses the stop frame. Oute moved three values, inside judge noise. Llasa and Qwen needed a second recipe; once they had one, the same recordings produced +45 and +23 values.

Given the spoken form instead of the written form, the models we tested read 92% to 99%. Kokoro 82M goes from 12% to 99%. The voices can say the reading. The recordings teach them which reading the written value calls for.

Dates had four scripts and stayed at zero. IP:port had five and stayed at zero. Order numbers had two and three models learned them. The next collection targets 20 to 30 scripts per convention still at zero.

What the runs show

  • 01

    Five of eight open models improved on 331 held-out values after just 1 hr 22 min of Ocular AI's Hi-Fi TTS Alphanumeric Dataset. Gains of 6.9 to 13.6 points, each with a paired interval that excludes zero.

  • 02

    Order numbers transferred from two scripts. Spark-TTS 0% → 55%, Audex 0% → 50%, Orpheus 0% → 30%. Gemini 3.8 Flash TTS reads 52%.

  • 03

    Two notebook recipes failed until the configuration changed. Llasa's fp16 run broke end-of-speech. Qwen's 0.6B full fine-tune ran to the length cap.

  • 04

    Falling loss does not predict the score. Magpie's loss fell 10.7 → 8.4 and the score stayed at 0%.

  • 05

    More of the same dataset still helps. Batch 3 beat Batch 2 by 17 values under a fixed recipe.

Limitations

One training seed per published number, except Audex, run twice: 31.1% and 37.2%. The judge moves about two values in 331 on a re-transcription. Screen-size regressions are partly the metric, since "times" and "by" are an allowed swap. The held-out scripts are templated sentences; they measure the reading rule and nothing about prosody or a second speaker.

Get the data

If you are post-training a TTS model on alphanumerics, this is the dataset to start from: studio recordings of expert readers, each value spoken under a stated policy, which is the convention the models above were missing. Ocular AI's Hi-Fi TTS Alphanumeric Dataset is proprietary. To license it, or to commission recordings for your own value formats, get in touch or write to research@useocular.com.

Evaluate your model

If you want to know how your TTS model reads alphanumerics, we can score it on the same held-out set used here: 240 scripts, 331 values across the eight conventions, paired against any base or prior version you name, with the same judge, bootstrap interval, and McNemar test as every number in this post. The set is private, so a score is not something a model could have trained toward. The 22 commercial systems and the eight open models above are already on it, so a new result lands on a board that places it. Write to research@useocular.com with the model and the voice you want scored, or get in touch.

Authors

Louis Murerwa

Louis Murerwa

Co-founder & CTO

Michael Moyo

Michael Moyo

Co-founder & CEO

Ready to bring AI into the real world?