1010Open-source, context-aware inverse text normalization for conversational
1111voice-agent transcripts, with open weights.
1212
13+ Premove ITN converts spoken ASR output into canonical written forms for phone
14+ numbers, email addresses, identifiers, dates, times, money, measurements, and
15+ alphanumeric codes.
16+
1317## The ambiguity
1418
1519| System | Output |
@@ -28,7 +32,7 @@ These are the retained outputs for row `va6_collision_0013` in the
2832
2933## Results
3034
31- On our frozen benchmark, Premove reaches ** 99.50% semantic accuracy on the
35+ On our frozen benchmark, Premove ITN reaches ** 99.50% semantic accuracy on the
3236voice-agent subset** , compared with 68.25% for ` text-processing-rs ` and 67.00%
3337for NVIDIA Thutmose.
3438
@@ -99,13 +103,14 @@ That sent me looking for context-aware ITN. I tried [NVIDIA Thutmose](https://ca
99103but on the structured values I cared about for tool calls, I still found
100104surprisingly simple failures.
101105
102- Premove came from a different idea: do not ask the model to perform the entire
103- normalization. Generate the valid written forms first, then train the model
104- only to decide which one fits the context. An exact decoder handles the rest.
106+ Premove ITN came from a different idea: do not ask the model to perform the
107+ entire normalization. Generate the valid written forms first, then train the
108+ model only to decide which one fits the context. An exact decoder handles the
109+ rest.
105110
106111## How Premove ITN works
107112
108- Premove splits normalization into three steps: ** generate, score, decode** .
113+ Premove ITN splits normalization into three steps: ** generate, score, decode** .
109114
110115Simplified example:
111116
@@ -135,7 +140,7 @@ contextual source span + candidate kind labels + proposed replacement
135140 ▼
1361413. DECODE
137142
138- Candidates can overlap, so Premove uses exact dynamic programming
143+ Candidates can overlap, so Premove ITN uses exact dynamic programming
139144to find the highest-scoring compatible path through the transcript.
140145 │
141146 ▼
@@ -148,7 +153,7 @@ context**. The decoder decides **which edits can coexist**.
148153
149154## Supported forms
150155
151- Premove covers English structured values commonly needed by voice agents:
156+ Premove ITN covers English structured values commonly needed by voice agents:
152157
153158| Form | Example |
154159| --- | --- |
@@ -168,7 +173,7 @@ Premove covers English structured values commonly needed by voice agents:
168173
169174### Not supported
170175
171- Premove currently targets English structured text. It does not provide
176+ Premove ITN currently targets English structured text. It does not provide
172177first-class normalization for non-English speech, street addresses, free-form
173178rewriting, or arbitrary application-specific formats.
174179
@@ -236,7 +241,7 @@ frozen evaluation was excluded from training and checkpoint selection; see the
236241
237242The contextual scorer uses
238243[ ` microsoft/deberta-v3-large ` ] ( https://huggingface.co/microsoft/deberta-v3-large )
239- at a pinned revision as its encoder backbone. Premove adds a custom candidate
244+ at a pinned revision as its encoder backbone. Premove ITN adds a custom candidate
240245scorer and exact decoder around the
241246[ DeBERTaV3 architecture] ( https://arxiv.org/abs/2111.09543 ) .
242247
@@ -245,7 +250,7 @@ scorer and exact decoder around the
245250Premove ITN source code and model weights are MIT licensed. The contextual
246251scorer uses [ ` microsoft/deberta-v3-large ` ] ( https://huggingface.co/microsoft/deberta-v3-large )
247252at a pinned revision as its encoder backbone. Candidate scoring and exact
248- decoding are Premove-specific.
253+ decoding are Premove ITN -specific.
249254
250255The Rust realization layer uses
251256[ ` text-processing-rs ` ] ( https://github.com/FluidInference/text-processing-rs ) ,
0 commit comments