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.


- Base
- Gain from fine-tuning
Audex 2B (NVIDIA)
23.6% → 37.2%+13.6 pts
Llasa 1B (HKUST Audio)
14.5% → 28.1%+13.6 pts
Spark-TTS 0.5B (SparkAudio)19.6% → 31.7%+12.1 pts
Orpheus 3B (Canopy Labs)32.0% → 39.3%+7.3 pts
Qwen3-TTS 1.7B (Alibaba Qwen)
23.6% → 30.5%+6.9 pts
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 type | Written | Human reading |
|---|---|---|
| Order number | #29-262-753 | number two nine dash two six two dash seven five three |
| Code | LHS402702K | L H S four zero two seven zero two K |
| Money | $13,569.00 | thirteen thousand five hundred sixty-nine dollars |
| Version | v15.12.17 | V fifteen point twelve point seventeen |
| Phone | (212) 195-1072 | two one two, one nine five, one zero seven two |
| Screen size | 1366×768 | thirteen sixty-six by seven sixty-eight |
| IP:port | 10.49.253.70:22 | ten dot forty-nine dot two hundred fifty-three dot seventy colon twenty-two |
| Date | 06/09/2025 | June 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
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.
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.
| Model | Method | Trained weights | Rank | Recipe |
|---|---|---|---|---|
| LoRA | q, k, v, o, gate, up, down | 128 | Unsloth notebook | |
| LoRA | q, k, v, o, gate, up, down | 64 | Unsloth notebook | |
| LoRA | q, k, v, o, up, down | 64 | Unsloth notebook | |
| Llasa 1B | LoRA | q, k, v, o, gate, up, down | 64 | Unsloth notebook |
| LoRA | Talker projections | 128 | Official code | |
| LoRA | Notebook targets | 32 | Unsloth notebook | |
| LoRA | q, v | 128 | Unsloth notebook | |
| Full fine-tune | All 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.
| Model | Recipe | Epochs | Learning rate | Steps | Loss | GPU | Time |
|---|---|---|---|---|---|---|---|
| LoRA r=128 | 5 | 1e-4 | 190 | 6.76 → 5.31 | T4 | 31 min | |
| LoRA r=64 | 3 | 2e-4 | 225 | 4.71 → 3.71 | A10G | 9 min | |
| LoRA r=64, attempt 2 | 3 | 2e-4 | 225 | 9.00 → 6.54 | A10G | 7 min | |
| Llasa 1B | LoRA r=64, all projections, bf16 | 3 | 1e-4 | 111 | 6.99 → 5.71 | A10G | 4 min |
| LoRA r=128 on the talker | 6 | 3e-5 | 900 | 14.11 → 4.59 | A10G | 15 min | |
| LoRA r=32, attempt 1 | 3 | 1e-4 | 114 | 5.01 → 4.18 | A10G | 27 min | |
| LoRA r=128 | 3 | 2e-4 | 114 | 3.81 → 3.07 | T4 | 82 min | |
| Full fine-tune, NeMo | 3 | 5e-6 | 112 | 10.67 → 8.38 | T4 | — |
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.
| Model | Attempt | Configuration | Loss | By rule |
|---|---|---|---|---|
| Llasa 1B | 1 | fp16, LoRA r=128 on q and v, 3 epochs, 2e-4 | 6.99 → 6.05 | 5.1% |
| Llasa 1B | 2 | bf16, LoRA r=64 on all projections, 3 epochs, 1e-4 | 6.99 → 5.71 | 28.1% |
| 1 | 0.6B full fine-tune, 3 epochs, 2e-5, 450 steps | 12.52 → 3.31 | 0.0% | |
| 2 | Adapters on the code predictor as well | — | unscored | |
| 3 | 1.7B talker LoRA r=128, 3 epochs, 1e-4, 450 steps | 13.40 → 5.12 | 6.3% | |
| 4 | Talker LoRA r=128, 6 epochs, 3e-5, 900 steps | 14.11 → 4.59 | 30.5% | |
| 1 | LoRA r=64, 3 epochs, 2e-4, 225 steps | 9.00 → 6.54 | 31.1% | |
| 2 | Same recipe, second seed | 9.00 → 6.54 | 37.2% | |
| 1 | LoRA r=32, 3 epochs, 1e-4, 114 steps | 5.01 → 4.18 | 20.8% | |
| 4 | Backbone only, 1 epoch, 5e-5, no padding | 5.01 → 4.97 | 16.0% | |
| 5 | Backbone only, stop frame weighted ×20 | 108.6 → 2.24 | 16.9% | |
| 1 | LoRA r=128 on q and v, 3 epochs, 2e-4 | 3.81 → 3.07 | 5.4% | |
| 1 | Full fine-tune, 3 epochs, 5e-6, 112 steps | 10.67 → 8.38 | 0.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
- attempt 1 · LoRA r=64
ocular-spark-tts-0.5b
- run 1 · Batch 2 full FT
- run 2 · Batch 2 LoRA
- run 3 · Batch 3 LoRA (published)
ocular-audex-2b
- attempt 1 · LoRA r=64
- attempt 2 · same recipe (published)
ocular-llasa-1b
- attempt 1 · fp16, 2 projections
- attempt 2 · bf16, all projections (published)
ocular-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
- 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
- attempt 1 · LoRA r=128
ocular-magpie-357m
- attempt 1 · full FT (NeMo)
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
- attempt 1 · 0.6B full FT
- attempt 3 · 1.7B talker LoRA
- attempt 4 · 1.7B talker LoRA, 6 ep (published)
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
- attempt 1 · fp16, 2 projections
- attempt 2 · bf16, all projections (published)
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
- 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)
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
- attempt 1 · full FT (NeMo)
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.
- 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
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%
Orpheus 3B32.0 → 39.3Audex 2B23.6 → 37.2
Spark-TTS 0.5B19.6 → 31.7Qwen3-TTS 1.7B23.6 → 30.5
- Llasa 1B14.5 → 28.1
CSM 1B, attempt 116.6 → 20.8
Oute 1B4.5 → 5.4Magpie 357M0.0 → 0.0
- Base model
- Fine-tuned, gain held
- Fine-tuned, gain did not hold
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.
| Model | Base | Fine-tuned | Delta | 95% interval | Wrong to right | Right to wrong | p |
|---|---|---|---|---|---|---|---|
| 19.6% | 31.7% | +40 | +20 to +61 | 68 | 28 | 0.0001 | |
| 23.6% | 37.2% | +45 | +27 to +63 | 65 | 20 | <0.001 | |
| Llasa 1B | 14.5% | 28.1% | +45 | +31 to +60 | 53 | 8 | <0.001 |
| 32.0% | 39.3% | +24 | +6 to +42 | 52 | 28 | 0.010 | |
| 23.6% | 30.5% | +23 | +10 to +37 | 35 | 12 | 0.001 | |
| 16.6% | 20.8% | +14 | +3 to +25 | 23 | 9 | 0.020 | |
| 4.5% | 5.4% | +3 | −6 to +13 | 11 | 8 | 0.65 | |
| 0% | 0% | 0 | 0 to 0 | 0 | 0 | 1 |
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.
| Model | Order | Code | Money | Version | Phone | Screen | IP:port | Date |
|---|---|---|---|---|---|---|---|---|
| 0 → 55 | 38 → 70 | 50 → 75 | 10 → 25 | 5 → 12 | 59 → 24 | 0 → 0 | 0 → 0 | |
| 0 → 50 | 70 → 57 | 60 → 78 | 20 → 50 | 15 → 40 | 29 → 32 | 0 → 0 | 0 → 0 | |
| 0 → 30 | 28 → 48 | 80 → 75 | 50 → 80 | 12 → 28 | 93 → 61 | 0 → 2 | 0 → 0 | |
| Llasa 1B | 0 → 8 | 22 → 50 | 55 → 85 | 10 → 50 | 12 → 20 | 20 → 17 | 0 → 0 | 0 → 2 |
| 0 → 0 | 62 → 80 | 90 → 98 | 20 → 25 | 22 → 20 | 0 → 29 | 0 → 0 | 0 → 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
Spark-TTS 0.5B (SparkAudio)0% → 55%+55 pts
Gemini 3.8 Flash TTS (Google)commercial, no fine-tune52%
Audex 2B (NVIDIA)
0% → 50%+50 pts
Orpheus 3B (Canopy Labs)0% → 30%+30 pts
Llasa 1B (HKUST Audio)
0% → 8%+8 pts
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
- LoRA r=128
- Batch 2 full fine-tune
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
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
Co-founder & CTO

Michael Moyo
Co-founder & CEO


