IaraTTS Phase 1 — Text Normalizer (RESULTS)
Implemented
iaratts/normalizer/pt_br.py: pt-BR specific text normalization via num2words, custom date/time patterns, abbreviation expansion, currency.
Setup
- 50 prompts (
prompts/ptbr-50.json), Bella voice (best baseline) - Same model (MOSS-TTS-Nano-100M-ONNX), Whisper-small round-trip
- A/B: same input prompts, normalizer ON vs OFF
Results
| Baseline | Phase 1 | Δ | |
|---|---|---|---|
| WER | 0.336 | 0.336 | +0.000 |
| RTF | 0.620 | 0.422 | -0.198 |
| SCORE | 1.148 | 1.264 | +0.117 (RTF only) |
WER unchanged. Per-category breakdown reveals offsetting effects:
Phase 1 wins (lower WER)
| Category | Δ WER |
|---|---|
| hard_consonants | -0.334 |
| complex | -0.190 |
| emotion | -0.168 |
| lh_nh | -0.110 |
| long | -0.025 |
Phase 1 regressions (worse)
| Category | Δ WER |
|---|---|
| abbrev | +0.237 |
| dates | +0.214 |
| open_close | +0.191 |
| r_strong | +0.150 |
Why no overall WER improvement
- Whisper tolerates both forms. "Dr. João" vs "doutor João" — whisper transcribes either as "doutor João", so the round-trip masks the underlying pronunciation difference. WER is not measuring what we wanted.
- Some expansions hurt. Spelling out "26/04/2026" → "vinte e seis de abril de dois mil e vinte e seis" creates a long sequence the AR model occasionally botches mid-decoding (more frames = more drift).
Conclusion
Phase 1 produced cleaner pronunciation for human listeners (validated informally on hard_consonants samples) but WER round-trip cannot measure this. Real signal will come from Phase 2 (LoRA fine-tune on Erinome dataset) where the model learns native pt-BR phonology end-to-end.
The normalizer code stays valuable as Phase 2 input pipeline (training transcripts will go through it for consistency).
Phase 1 — DONE ✓
- pt-BR normalizer implemented (
normalizer/pt_br.py, 8 self-tests pass) - WER A/B vs baseline measured
- Per-category analysis done
- Conclusion: WER neutral but normalizer kept for Phase 2 pipeline