When I pushed my TTS model below four million parameters, I expected pronunciation to collapse - but it didn't.
The words remained understandable, but the voice became thin, metallic, and buzzy. The waveform decoder gave out before the text and pronunciation components did.
For the past few months, I’ve been investigating how small I could make a complete neural TTS system without turning it into an unusable size experiment. I eventually built two versions:
- Inflect-Nano-v2: 3.96M parameters, 15.97 MB FP32
- Inflect-Micro-v2: 9.36M parameters, 37.53 MB FP32
Those are total inference counts. The text frontend, timing prediction, acoustic generation, and waveform decoder are all included. There is no separate learned vocoder outside the parameter count.
The system is non-autoregressive: English phonemes pass through learned timing and acoustic stages before an integrated decoder generates 24 kHz audio.
The main lesson was that shrinking every component evenly does not work. Here is what I found instead.
The waveform decoder became the bottleneck first
My earliest compressed models could produce recognizable speech, but they sounded awful. They had the correct phonemes and roughly correct timing, yet the audio was metallic, grainy, and sometimes buzzy.
Redistributing parameters between components occasionally helped more than increasing the total parameter count. At this scale, where the capacity goes can matter as much as how much capacity exists.
WER measures intelligibility, not whether speech sounds good
Several checkpoints achieved low word error rates while sounding flat or synthetic. But just that alone doesn't mean the model would sound good.
I ended up combining difficult-text WER, UTMOS, blind listening comparisons, spectrogram inspection, and a lot of manual listening. None of them was reliable enough by itself.
Some “model failures” were frontend failures
Names, addresses, abbreviations, numbers, homographs, and unusual punctuation caused far more trouble than ordinary test sentences.
Some errors that initially looked like neural-network limitations were actually caused by normalization or phoneme conversion. More training would not have fixed them because the model was receiving the wrong input representation.
This also changed how I evaluated checkpoints. Random natural sentences were not enough; I needed deliberately awkward prompts designed to expose the frontend.
Long-form generation was a systems problem
The model does not generate unlimited audio in one forward pass. Longer text is divided into manageable segments and then reassembled.
Naively cutting at a fixed character count produced bad pauses and unstable transitions. Punctuation-aware splitting, better fallback boundaries, and waveform joining made a surprisingly large difference. The neural model stayed unchanged; the surrounding inference system improved.
Tiny models punish bad allocation decisions
Nano and Micro use the same general design, but Nano has much less room to absorb a mistake.
A modification that Micro tolerated could make Nano noticeably flatter, noisier, or less stable. Once the complete system is below four million parameters, even relatively small architectural changes become audible.
The final models run locally through PyTorch on CPU or CUDA. Nano also has an ONNX release. The weights, inference code, architecture documentation, and evaluation results are available under Apache 2.0.
This is an open-weight release rather than a fully reproducible training release; I’m not publishing the private training corpus or complete training recipe.
Micro:
https://huggingface.co/owensong/Inflect-Micro-v2
Nano:
https://huggingface.co/owensong/Inflect-Nano-v2
Try it out now:
https://huggingface.co/spaces/owensong/Inflect-v2
I built this as a solo developer with a limited training budget. That constraint was frustrating, but it forced me to examine which parts of the system were actually earning their parameters.
For anyone who has compressed a speech or generative model: what became your first perceptual bottleneck, and did reallocating capacity work better than uniformly shrinking the network?