Most “tiny TTS” releases still ship a decoder the size of a real app, or they outsource waveform generation to a cloud API. Inflect-Micro-v2 takes the other bet: complete local text-to-waveform speech under 10 million parameters — 9,356,513 deployable weights, ~37.53 MB FP32, 24 kHz mono — with a public Python API, deterministic seeds, and an official ONNX path.
Owen Song funded and shipped it independently on Hugging Face as owensong/Inflect-Micro-v2 under Apache-2.0. The Hacker News thread (Inflect-Micro-v2: complete voice in 9.36M parameters) immediately asked the right clarifying question: complete means TTS end-to-end, not STT+TTS. This explainx.ai guide is the builder decode — install, Micro vs Nano, benchmarks vs Piper/Kitten/Supertonic, and the limitations you should read before shipping it into a product.
TL;DR — What People Are Asking
| Question | Answer |
|---|---|
| What is it? | Local English text → waveform TTS |
| Params / size? | 9.36M · ~37.53 MB FP32 |
| License? | Apache-2.0 |
| Voice? | One fixed male · no cloning |
| STT included? | No |
| CPU speed (ref)? | ~6.28× real-time (Micro) |
| Sibling? | Nano ~3.97M / ~16 MB |
| Where? | Hugging Face owensong/Inflect-Micro-v2 |
| Good for? | Edge, offline demos, privacy-sensitive UX |
| Not for? | Multilingual, cloning, medical/legal critical audio |
Why “Complete” Under 10M Matters
Edge speech usually fails one of three ways:
- Cloud dependency — latency, cost, and data leaving the device
- Incomplete packages — phoneme frontend in, but waveform elsewhere
- Footprint lies — “small” model plus a giant vocoder nobody counted
Inflect’s claim is package-level honesty: the integrated waveform decoder is in the weight total. That puts it in the same product conversation as other edge-sized open models and browser-tiny embeddings — not as a frontier LLM, but as a deployable artifact you can reason about on disk.
If your stack already values local inference for coding agents (llama.cpp, OpenCode local runs), Inflect is the speech sibling: small enough for CPU laptops and hobby boards, licensed for redistribution, boring enough to actually ship.
Micro vs Nano — Pick by Footprint
| Inflect-Nano-v2 | Inflect-Micro-v2 | |
|---|---|---|
| Parameters | ~3,966,721 | ~9,356,513 |
| FP32 weights | ~15.97 MB | ~37.53 MB |
| Positioning | Smallest practical | Strongest Inflect v2 quality |
| 24 kHz decoder | Included | Included |
| API / frontend | Same | Same |
Rule of thumb: Nano when flash storage or RAM is the constraint; Micro when preference/UTMOS margins matter more than a few megabytes. Both use the same long-text segmentation and seed controls.
Install and Run (PyTorch Path)
python -m pip install --upgrade huggingface_hub
hf download owensong/Inflect-Micro-v2 --local-dir Inflect-Micro-v2
cd Inflect-Micro-v2
python -m pip install -r requirements.txt
from inference import InflectTTS
tts = InflectTTS(".", device="cpu")
tts.save(
"A small voice can still have something meaningful to say.",
"sample.wav",
speed=1.0,
variation=0.667,
seed=7,
)
Snapshot download variant:
import sys
from huggingface_hub import snapshot_download
model_dir = snapshot_download("owensong/Inflect-Micro-v2")
sys.path.insert(0, model_dir)
from inference import InflectTTS
tts = InflectTTS(model_dir, device="cpu")
sample_rate, waveform = tts.synthesize("The complete model runs locally.")
Long input is split at punctuation-aware boundaries, synthesized chunk by chunk, and joined with controlled pauses. Fix seed when you need bit-stable comparisons across runs on the same runtime stack.
ONNX without PyTorch
Official FP32 graphs live in a sibling package (Inflect-Micro-v2-ONNX): duration.onnx + decode.onnx, CPU/CUDA/DirectML providers, same long-text wrapper, eSpeak-ng frontend remains CPU-side. Use ONNX when you want torch-free deployment or browser-adjacent runtimes — parity reports and checksums ship with that repo.
Benchmarks — Read Them Like an Engineer
Inflect refuses a single “quality score.” The model card reports preference, predicted naturalness, intelligibility, footprint, and runtime separately.
Headline Micro row (as published)
| Metric | Micro result | Notes |
|---|---|---|
| Community preference | 66.2% (21W · 10L · 3T) | Blind, order randomized; ties half-win |
| UTMOS22 | 4.395 (CI ~4.381–4.408) | Learned predictor, not human MOS |
| Two-ASR semantic WER | ~3.99% | Mean of Qwen3-ASR + Nemotron 3.5 |
| FP32 footprint | 37.53 MB | Complete deployable package |
| CPU throughput | ~6.28× RT | 4 threads, steady-state |
Comparison set includes KittenTTS Nano, Piper Low, and Supertonic 3 — established compact/local baselines with larger deployable footprints than both Inflect releases. Weight sizes are package-level; no single metric is treated as proof of overall superiority.
Whisper was excluded from the headline two-ASR mean because it hallucinated insertions on some otherwise intelligible Supertonic clips; the full three-ASR audit remains on the card. That kind of protocol footnote is why this release feels more serious than a vibes demo.
What HN Got Right
- “Complete” ≠ STT — text-to-waveform only.
- Voice clone wishlist — fair ask; out of scope for v2.
- Quality for size — under 10M, spotty phrasing is expected; seed + speed knobs help.
- Independent funding — Song asks for Hub likes to justify a broader v3 (languages, voices, stability). Treat that as roadmap aspiration, not a commitment.
For privacy-first product context, pair this with local meeting transcription stacks like Meetily — TTS and STT are different layers, but the keep audio on-device product story is the same.
Architecture Notes Builders Care About
- Frontend: English normalization + phonemization (eSpeak-ng) before the neural path
- Runtime: Shared Python API / CLI; CUDA optional
- Determinism: Fixed seeds reproduce the same latent sample on the same stack
- Eval artifacts: Frozen prompts, ASR hypotheses, hashes, and reports under
evaluation/final/ - Integrity:
release_manifest.jsonSHA-256 hashes
Training corpus pipeline and full optimization recipe are not public — classic open-weight (not full open science) posture. That still beats closed SaaS TTS for air-gapped and redistribute-friendly apps; see the broader closed vs local open trade-offs.
Honest Limitations
- English only, one fixed male voice — no multilingual, no cloning
- Unfamiliar phrasing can flatten or destabilize
- Numbers, abbreviations, homographs, uncommon names are frontend/context sensitive
- Long passages use chunking; transitions differ from a native long-form pass
- Stochastic variation changes timing/pronunciation — fix seed for A/B
- UTMOS22 / ASR ≠ controlled human MOS or MUSHRA
- Not validated for medical, legal, emergency, or accessibility-critical communication
- Responsible use: do not impersonate real people; disclose synthetic speech where it could mislead
Builder Checklist
- Download Micro (quality) or Nano (footprint) via
hf download - Smoke-test held-out transcripts from the model card samples
- Lock
seedfor CI regression audio hashes - Decide PyTorch vs ONNX before packaging for mobile/edge
- Gate product copy: “local English TTS,” not “voice AI platform”
- Budget a human listen pass — preference studies are not your user’s ears
Package Map (What You Actually Download)
| Path | Purpose |
|---|---|
model.pth | Inference-only generator checkpoint |
config.json | Architecture + audio config |
inference.py | Public Python API and CLI |
inflect_vits_frontend.py | English normalization / phonemization |
runtime/ | Self-contained model implementation |
samples/ | Held-out example generations |
evaluation/final/ | Frozen prompts, reports, protocol |
release_manifest.json | File sizes + SHA-256 hashes |
That layout is what “complete” means operationally: you are not hunting a separate vocoder repo at 2 a.m. ONNX users clone the sibling graphs and keep eSpeak on the CPU side.
When to Reach for Something Else
- Need voice cloning / multi-speaker — look elsewhere; Inflect is fixed-voice by design.
- Need streaming ultra-low latency telephony — measure RTF on your target SoC; Micro’s reference 6.28× is a laptop-class CPU story, not a guarantee on microcontrollers.
- Need multilingual IVR — wait for a promised v3 or use a larger multilingual stack.
- Need cloud SLA / SSML enterprise features — commercial TTS APIs still win on ops, not on offline privacy.
The local vs closed frame applies: Inflect is a sovereignty and footprint win, not a feature-parity win against SaaS TTS.
Copy-Paste Eval Habit
Before you ship Inflect into a product voice:
- Generate the five held-out transcripts from the model card (conversational, punctuation, numbers, names/places, technical).
- Listen on phone speakers and laptop speakers — tiny models fail differently on each.
- Re-run with the same seed; confirm waveform hashes or spectrogram similarity for CI.
- Stress uncommon proper nouns from your domain (drug names, street names, brand names).
- Only then wire it into an agent loop that speaks status updates.
That five-step habit is more valuable than chasing a 0.05 UTMOS bump.
Related on explainx.ai
- 28.9M LLM on $8 ESP32 — Per-Layer Embeddings
- Meetily — privacy-first local meeting transcription
- Ternlight — 7 MB browser embedding model
- Liquid AI LFM2.5 — edge agent model
- What is llama.cpp?
- Run open-source models locally with OpenCode
- Closed-source AI vs local open-source alternatives
- Open weights American AI leadership letter
Primary sources: Hugging Face — owensong/Inflect-Micro-v2 · Inflect-Micro-v2-ONNX sibling · Hacker News discussion of the release · Owen Song model card limitations and evaluation protocol.
Specs, benchmarks, and Hub paths are accurate as of July 26, 2026. Recheck the model card before production pins — small TTS releases iterate fast.
