Premove ITN is an open-source, context-aware inverse text normalizer built for voice agents. It turns messy ASR transcripts into structured values APIs can actually use: phone numbers, dates, times, amounts, IDs, emails, URLs, and more. Instead of generating normalized text directly, it deterministically produces valid candidates, uses a neural model to score them in sentence context, and applies exact decoding to choose compatible outputs. Open weights, Python package, real-time inference.
Hey everyone 👋
I started building Premove ITN while working on a voice agent.
The problem looked simple at first: turn spoken forms like “one hundred twenty three” into 123.
But the harder cases were contextual:
meet me at two thirty → 2:30
room number two thirty → 230
I first tried deterministic rules, then NVIDIA Thutmose, then a BIO-tagging approach. What finally worked was separating the problem into three parts:
1. Deterministic code generates structurally valid candidates
2. A contextual neural model scores them
3. Exact decoding chooses a compatible final path
That became Premove ITN.
On a frozen 1,500-row synthetic benchmark, Premove reached 89.7% overall semantic accuracy, compared with 59.4% for NVIDIA Thutmose and 55.8% for text-processing-rs. On the dedicated voice-agent subset, Premove reached 99.5%.
The code and model weights are open source.
I’d especially love feedback from people building voice agents: what normalization failures are you still seeing in production?