THA: Khmer语言的加权有限状态文本规范化与逆文本规范化
摘要
Tha 是一个开源工具包,专门针对Khmer语言进行文本规范化和逆文本规范化。它使用加权有限状态转换器处理脚本特定的挑战,无需预分割。
arXiv:2609.30984v1 Announce Type: new
Abstract: Text-to-speech needs written text in spoken form, and speech recognition output needs the reverse. For Khmer, neither direction has a maintained open-source tool, and the script makes both harder: words are not separated by spaces, and number words occur inside ordinary words. We present Tha, a Khmer text normalization and inverse text normalization toolkit built from weighted finite-state transducers. It segments and classifies a whole line in one shortest-path search, and a second transducer rejects token boundaries inside a Khmer syllable. On Google's Khmer test suite, Tha agrees with the reference on all 274 cardinals up to one spelling variant, and on 2,906 real TTS prompts, 153 of the 158 sentences it rewrites are correct. Tha is open source under the Apache 2.0 license.
查看缓存全文
缓存时间: 2026/09/28 09:47
# Weighted Finite-State Text Normalization andInverse Text Normalization for Khmer
Source: [https://arxiv.org/html/2609.30984](https://arxiv.org/html/2609.30984)
\[ Path=fonts/, Extension=\.ttf, UprightFont=\*\-Regular, BoldFont=\*\-Bold, Script=Khmer, Scale=0\.80\]
###### Abstract
Text\-to\-speech needs written text in spoken form, and speech recognition output needs the reverse\. For Khmer, neither direction has a maintained open\-source tool, and the script makes both harder: words are not separated by spaces, and number words occur inside ordinary words\. We presentTha, a Khmer text normalization and inverse text normalization toolkit built from weighted finite\-state transducers\. It segments and classifies a whole line in one shortest\-path search, and a second transducer rejects token boundaries inside a Khmer syllable\. On Google’s Khmer test suite,Thaagrees with the reference on all 274 cardinals up to one spelling variant, and on 2,906 real TTS prompts, 153 of the 158 sentences it rewrites are correct\.Thais open source under the Apache 2\.0 license\.
## 1Introduction
A TTS front end has to turn “\\khmerfontតម្លៃ $1\.05” into the words a speaker would say, “\\khmerfontតម្លៃ មួយដុល្លារប្រាំសេន”, and an ASR system has to turn “\\khmerfontពីររយហាសិបដុល្លារ” back into “$250”\. These two tasks, text normalization \(TN\) and inverse text normalization \(ITN\), are usually done with hand\-written grammars compiled into weighted finite\-state transducers \(WFSTs\)\[[25](https://arxiv.org/html/2609.30984#bib.bib1),[6](https://arxiv.org/html/2609.30984#bib.bib2),[12](https://arxiv.org/html/2609.30984#bib.bib18)\], since neural models still make the occasional unrecoverable error, such as reading the wrong number\[[26](https://arxiv.org/html/2609.30984#bib.bib6),[36](https://arxiv.org/html/2609.30984#bib.bib8)\]\.
For Khmer, the only released grammars are Google’s Thrax grammars for TTS\[[24](https://arxiv.org/html/2609.30984#bib.bib23)\]\. They do TN only, expect input that is already segmented into words, and have been archived since 2021\. NeMo\[[37](https://arxiv.org/html/2609.30984#bib.bib11)\]and WeTextProcessing\[[32](https://arxiv.org/html/2609.30984#bib.bib13)\]do not support Khmer\. The language also breaks some of their assumptions: Khmer is written without spaces between words, so there are no tokens to classify one at a time, and short number words occur inside ordinary words \(\\khmerfontពីរ, “two”, begins\\khmerfontពីរោះ, “melodious”\)\.
Thais an open\-source toolkit for both directions\. It tags a whole line in one shortest\-path search, so it needs no word segmenter \(§[4\.1](https://arxiv.org/html/2609.30984#S4.SS1)\), and a filter transducer rejects tokens that start or end inside a Khmer syllable \(§[4\.2](https://arxiv.org/html/2609.30984#S4.SS2)\)\. We describe the grammars for 17 TN and 13 ITN classes \(§[4\.3](https://arxiv.org/html/2609.30984#S4.SS3), §[4\.5](https://arxiv.org/html/2609.30984#S4.SS5)\) and evaluate them against Google’s test suite, on spoken\-form TTS prompts, by round trip and with an ablation \(§[5](https://arxiv.org/html/2609.30984#S5)\)\.
## 2Khmer numbers and script
#### Script\.
Khmer is an abugida of the Brahmic family\. A syllable is a base consonant, optionally stacked with subscript consonants written with the invisible*coeng*sign \(U\+17D2\), followed by dependent vowel signs and diacritics\[[13](https://arxiv.org/html/2609.30984#bib.bib33),[30](https://arxiv.org/html/2609.30984#bib.bib34)\]\. Unicode allows several character orders for the same visible syllable, for instance a vowel typed before a subscript instead of after it, and fonts render them alike; SIL’s Khmer character specification defines a canonical order\[[22](https://arxiv.org/html/2609.30984#bib.bib37)\]\. Spaces mark phrase boundaries rather than words, and the zero\-width space \(U\+200B\) is used inconsistently to mark word boundaries\[[24](https://arxiv.org/html/2609.30984#bib.bib23)\]\. The repetition mark\\khmerfontៗ repeats the preceding word \(\\khmerfontក្មេងៗ, “children”, is read\\khmerfontក្មេងក្មេង\), which requires knowing where that word begins\.
#### Number names\.
Table[1](https://arxiv.org/html/2609.30984#S2.T1)lists the Khmer number words\. Six to nine are compounds of five \(\\khmerfontប្រាំមួយ, “five\-one”, is six\), so\\khmerfontប្រាំបួន can be read as nine or as “five, four”\. The tens have a spoken short form without\\khmerfontសិប \(\\khmerfontសាមប្រាំ for\\khmerfontសាមសិបប្រាំ, 35\)\. The scale words are\\khmerfontរយ \(102\),\\khmerfontពាន់ \(103\),\\khmerfontម៉ឺន \(104\),\\khmerfontសែន \(105\) and\\khmerfontលាន \(106\); above a million,\\khmerfontប៊ីលាន and\\khmerfontទ្រីលាន are borrowed, and\\khmerfontពាន់លាន \(“thousand million”\) is common for 109\. Speakers often count thousands past ten \(\\khmerfontដប់ពាន់,\\khmerfontមួយរយពាន់\) instead of using\\khmerfontម៉ឺន and\\khmerfontសែន\. Several number words are also ordinary words or names:\\khmerfontសែន means “very” and is part of the place name\\khmerfontស្ទឹងសែន,\\khmerfontលាន is a yard,\\khmerfontមួយ is an indefinite article\.
1\\khmerfontមួយ10\\khmerfontដប់102\\khmerfontរយ2\\khmerfontពីរ20\\khmerfontម្ភៃ103\\khmerfontពាន់3\\khmerfontបី30\\khmerfontសាមសិប \(\\khmerfontសាម\)104\\khmerfontម៉ឺន4\\khmerfontបួន40\\khmerfontសែសិប \(\\khmerfontសែ\)105\\khmerfontសែន5\\khmerfontប្រាំ50\\khmerfontហាសិប \(\\khmerfontហា\)106\\khmerfontលាន6\\khmerfontប្រាំមួយ60\\khmerfontហុកសិប \(\\khmerfontហុក\)109\\khmerfontប៊ីលាន7\\khmerfontប្រាំពីរ70\\khmerfontចិតសិប \(\\khmerfontចិត\)\\khmerfontពាន់លាន8\\khmerfontប្រាំបី80\\khmerfontប៉ែតសិប \(\\khmerfontប៉ែត\)1012\\khmerfontទ្រីលាន9\\khmerfontប្រាំបួន90\\khmerfontកៅសិប \(\\khmerfontកៅ\)0\\khmerfontសូន្យTable 1:Khmer number words\. Short spoken forms of the tens are in parentheses; they are only used before a digit \(\\khmerfontហុកពីរ, 62\)\.
#### Written conventions\.
Khmer text uses Khmer and Latin digits interchangeably, often in the same document\. Thousands are separated by spaces, commas or dots \(\\khmerfont១\.០០០ is usually one thousand, not one\), decimals by dots or commas\. Dates are written day first\. A hyphen between two numbers is read\\khmerfontដល់ \(“to”\) in a range, but\\khmerfontទល់ \(“against”\) in a sports score\. These ambiguities cannot be resolved by a grammar of the token alone, and §[4\.3](https://arxiv.org/html/2609.30984#S4.SS3)describes the context rulesThaapplies\.
## 3Related work
#### Grammar\-based normalization\.
Text normalization as a task was laid out by[Sproat et al\. \[25\]](https://arxiv.org/html/2609.30984#bib.bib1), with a taxonomy of semiotic classes later extended by[van Esch and Sproat \[31\]](https://arxiv.org/html/2609.30984#bib.bib3)\. Production systems such as Kestrel\[[6](https://arxiv.org/html/2609.30984#bib.bib2)\]and its open\-source counterpart Sparrowhawk\[[8](https://arxiv.org/html/2609.30984#bib.bib14)\]split normalization into a tokenizer and classifier, which tags spans with a semiotic class and fields, and a verbalizer, which turns each tagged token into words\. The grammars are written in Thrax\[[29](https://arxiv.org/html/2609.30984#bib.bib17)\]or Pynini\[[12](https://arxiv.org/html/2609.30984#bib.bib18)\]and compiled into WFSTs with OpenFst\[[1](https://arxiv.org/html/2609.30984#bib.bib16)\], using weighted rewrite rules\[[16](https://arxiv.org/html/2609.30984#bib.bib21)\]and shortest\-path search\[[17](https://arxiv.org/html/2609.30984#bib.bib20),[11](https://arxiv.org/html/2609.30984#bib.bib19)\]\. The same grammars can serve ASR and TTS\[[21](https://arxiv.org/html/2609.30984#bib.bib4)\]\. NeMo\[[37](https://arxiv.org/html/2609.30984#bib.bib11)\]and WeTextProcessing\[[32](https://arxiv.org/html/2609.30984#bib.bib13)\]bring this design to Pynini with TN and ITN for many languages;Thafollows NeMo’s tagger and verbalizer interfaces\.
#### Neural and hybrid approaches\.
Sequence\-to\-sequence models normalize most tokens correctly but make a small number of unacceptable errors, such as reading the wrong number\[[26](https://arxiv.org/html/2609.30984#bib.bib6),[27](https://arxiv.org/html/2609.30984#bib.bib7)\]; covering grammars\[[36](https://arxiv.org/html/2609.30984#bib.bib8)\]and shallow fusion with a WFST\[[2](https://arxiv.org/html/2609.30984#bib.bib12)\]constrain them\. Neural ITN has followed the same path\[[19](https://arxiv.org/html/2609.30984#bib.bib9),[28](https://arxiv.org/html/2609.30984#bib.bib10)\]\. Large language models have recently been prompted for both TN\[[33](https://arxiv.org/html/2609.30984#bib.bib28),[15](https://arxiv.org/html/2609.30984#bib.bib30)\]and spoken\-to\-written conversion\[[4](https://arxiv.org/html/2609.30984#bib.bib29)\]\.
#### Southeast Asian languages\.
[Sodimana et al\. \[24\]](https://arxiv.org/html/2609.30984#bib.bib23)wrote Thrax normalization grammars for Bangla, Khmer, Nepali, Javanese, Sinhala and Sundanese to build TTS voices\[[23](https://arxiv.org/html/2609.30984#bib.bib24),[9](https://arxiv.org/html/2609.30984#bib.bib25)\]\. Their Khmer grammars expect input segmented with a CRF word segmenter\[[3](https://arxiv.org/html/2609.30984#bib.bib31)\]and leave segmentation errors to the grammars\. Burmese, also written without spaces, has FST normalization grammars\[[18](https://arxiv.org/html/2609.30984#bib.bib26)\], and Nisaba provides finite\-state script normalization for Brahmic scripts\[[14](https://arxiv.org/html/2609.30984#bib.bib22)\]\.
#### Khmer\.
Khmer is one of the evaluation languages of[Gorman and Sproat \[10\]](https://arxiv.org/html/2609.30984#bib.bib5), whose number grammars are induced from a few examples but cover cardinals only and were not released\.Thauses the khmercut word segmenter\[[34](https://arxiv.org/html/2609.30984#bib.bib32)\]only to expand the repetition mark \(§[4\.4](https://arxiv.org/html/2609.30984#S4.SS4)\)\. Multilingual speech corpora and models such as FLEURS and Whisper now cover Khmer\[[5](https://arxiv.org/html/2609.30984#bib.bib35),[20](https://arxiv.org/html/2609.30984#bib.bib36)\]\. KhmerTagger\[[35](https://arxiv.org/html/2609.30984#bib.bib27)\]tags number spans and punctuation in ASR output with XLM\-RoBERTa;Tha’s ITN grammars could replace its rule\-based converter for the tagged spans \(§[6](https://arxiv.org/html/2609.30984#S6)\)\.
## 4Design
Figure[1](https://arxiv.org/html/2609.30984#S4.F1)shows both pipelines\. Each has a classifier WFSTCCthat maps a line of text to a tagged token sequence, a filterFFthat constrains the tokens, and a verbalizerVVthat writes each tagged token in the target form\. For inputxxthe tagged form is
t∗=ShortestPath\(πout\(x∘C\)∘F\),t^\{\*\}=\\mathrm\{ShortestPath\}\\big\(\\pi\_\{\\text\{out\}\}\(x\\circ C\)\\circ F\\big\),\(1\)where∘\\circis composition,πout\\pi\_\{\\text\{out\}\}projects onto the output tape and the shortest path is taken in the tropical semiring\. The tagged string uses NeMo’s format,
tokens \{ name: "\\khmerfontតម្លៃ " \} tokens \{ money \{ integer\_part: "\\khmerfontប្រាំ" currency\_maj: "\\khmerfontដុល្លារ" \} \}
for “\\khmerfontតម្លៃ $5” \(“price $5”\), and is parsed in Python; each semiotic token is then rewritten byVVon its own\. Parts of a spoken token are joined with a separator,by default, so that a consumer can tell a five\-word number from five words\. The separator can be set to a space or removed\.
TNwritten\\khmerfontតម្លៃ $5pre\-processingdigits, minus,\\khmerfontៗclassifierC∘FC\\circ Fwhole lineverbalizerVVper tokencontext rulesrange, scorespoken\\khmerfontតម្លៃ ប្រាំដុល្លារtokens \{ name: "\\khmerfontតម្លៃ " \} tokens \{ money \{ integer\_part: "\\khmerfontប្រាំ" currency\_maj: "\\khmerfontដុល្លារ" \} \}ITNspoken\\khmerfontចំណាយពីររយដុល្លារflexible joinsJJ, U\+200BclassifierC′∘F′C^\{\\prime\}\\circ F^\{\\prime\}whole lineverbalizerV′V^\{\\prime\}per tokenpost\-processing\\khmerfontៗ, Khmer digitswritten\\khmerfontចំណាយ$200Figure 1:The two pipelines\. The classifier tags a whole line in one shortest\-path search \(Eq\.[1](https://arxiv.org/html/2609.30984#S4.E1)\); the tagged form of the TN example is shown between the rows\. In the ITN direction, each class grammar is composed with the flexible\-join transducerJJbefore it enters the classifier\.### 4\.1Segmenting while classifying
NeMo’s classifier consumes one whitespace\-separated token at a time\. Khmer has no such tokens, soTha’s classifier covers the whole line\. A line is a sequence of alternating*name*tokens \(plain text, passed through\) and semiotic tokens:
C=N?\(SN\)∗S?,S=⋃c\(Gc⊗wc\),C=N^\{?\}\\,\(S\\,N\)^\{\*\}\\,S^\{?\},\\qquad S=\\textstyle\\bigcup\_\{c\}\\big\(G\_\{c\}\\otimes w\_\{c\}\\big\),\(2\)whereGcG\_\{c\}is the grammar of classccandwcw\_\{c\}its weight\. A name tokenNNis any non\-empty string, and each of its characters costs 1\. A semiotic token costs a flatwc<1w\_\{c\}<1however long it is \(Table[2](https://arxiv.org/html/2609.30984#S4.T2)\)\. The cheapest path therefore covers as many characters as possible with as few semiotic tokens as possible: covering five characters with one semiotic token costs less than one, leaving them as text costs five\. Among classes that match the same span, the smallerwcw\_\{c\}wins, which encodes preferences such asdateovercardinal\. Because tokens alternate, two semiotic tokens are never adjacent, so “10:234” cannot be split into a time and a number\.
Figure[2](https://arxiv.org/html/2609.30984#S4.F2)shows the competing paths for “\\khmerfontតម្លៃ $5”\. In the TN direction, digits are excluded from name tokens, which guarantees that every digit is verbalized\. Pronounceable symbols \(%, &, \+, $, °, …\) may appear in name tokens but are replaced by their Khmer names there, so that nothing unpronounceable reaches a TTS transcript\.
068name\\khmerfontតម្លៃ␣6×16\\times 1name “$”11cardinal “5”0\.50\.5money “$5”0\.450\.45Figure 2:Two paths through the TN classifier lattice for “\\khmerfontតម្លៃ $5”\. Numbers under the states are character offsets\. Plain text costs 1 per character and a semiotic token a flat weight, so the path that covers more text with one token wins\. No path can leave the digit 5 as plain text: digits are not allowed in name tokens\.Table 2:Class weightswcw\_\{c\}\. A semiotic token costswcw\_\{c\}regardless of its length; plain text costs 1 per character\.
### 4\.2Boundary filter
The cheapest path may still start or end a semiotic token in the middle of a syllable, for instance by reading the\\khmerfontពីរ of\\khmerfontពីរោះ as a number\. The filterFFin Eq\.[1](https://arxiv.org/html/2609.30984#S4.E1)is an acceptor over tagged strings,
F=Σ∗∖Σ∗BΣ∗,F=\\Sigma^\{\*\}\\setminus\\Sigma^\{\*\}\\,B\\,\\Sigma^\{\*\},\(3\)whereBBis a union of forbidden patterns at the junction of a name token and a semiotic token\. In the ITN direction these are: a semiotic token followed by a Khmer dependent vowel, diacritic or\\khmerfontៗ \(which cannot begin a syllable\), a semiotic token preceded by a coeng \(a subscript consonant belongs to the previous one\), and a semiotic token whose written form would be glued to a digit or Latin letter of the neighbouring text \(“12\\khmerfontប្រាំ” would otherwise become 125\)\. In the TN direction the filter keeps ordinals, times, dates and similar classes away from Latin letters \(“1stly”, “5 mango” is not 5 m \+ “ango”\), and rejects the dot thousands reading of a number followed by a scale word \(\\khmerfont២\.១៦៦លាន is 2\.166 million, not 2,166 million\)\. Applying the constraints to the tagged lattice, rather than inside each grammar, keeps the class grammars independent of their context\.
### 4\.3Normalization grammars
#### Cardinals\.
Let𝑛𝑧k\\mathit\{nz\}\_\{k\}readkk\-digit strings without a leading zero\. Fork≥3k\\geq 3, witheethe largest magnitude in\{2,3,4,5,6,9,12\}\\\{2,3,4,5,6,9,12\\\}belowkkandmem\_\{e\}its scale word,
𝑛𝑧k=𝑛𝑧k−eme\(del\(0e\)∪𝑓𝑢𝑙𝑙e\),\\mathit\{nz\}\_\{k\}=\\mathit\{nz\}\_\{k\-e\}\\;m\_\{e\}\\;\\big\(\\mathrm\{del\}\(0^\{e\}\)\\;\\cup\\;\\texttt\{\\kern 0\.41992pt\\rule\[\-0\.60277pt\]\{5\.0399pt\}\{0\.43057pt\}\\kern 0\.41992pt\}\\,\\mathit\{full\}\_\{e\}\\big\),\(4\)where𝑓𝑢𝑙𝑙e\\mathit\{full\}\_\{e\}reads any non\-zeroee\-digit string\. This yields\\khmerfontមួយពាន់ពីររយសាមសិបបួន for 1234 and\\khmerfontដប់លាន for 107\. Numbers of more than 15 digits and numbers with leading zeros are read digit by digit\. Grouped numbers \(1,000,000, 1 000 000, 1\.000\.000\) are accepted, as are number signs \(\#5, №5, No\. 5 →\\khmerfontលេខប្រាំ\)\.
#### Other classes\.
Thacovers 17 classes: cardinal, decimal \(dot or comma, read\\khmerfontចុច or\\khmerfontក្បៀស\), ordinal, fraction \(including vulgar fractions such as ½\), money \(symbol or ISO code before or after the amount, with minor units and scale words\), measure \(units and percentages\), time \(24\-hour, 12\-hour and the French\-style 8h30\), date \(day first, month first only when unambiguous\), Cambodian telephone numbers, e\-mail addresses and URLs, Cambodian license plates, codes of Latin letters and digits \(U19, MH370\), Roman numerals after words that take them \(\\khmerfontជំពូក II\), serials \(versions, IP addresses\), year ranges and seasons \(2022/23\), football formations \(4\-4\-2\) and a whitelist \(\\khmerfontព\.ស\., COVID\-19\)\. The word lists \(units, currencies, months, letter names, …\) are TSV files that native speakers can edit without touching the grammars\.
#### Character order\.
The grammars match exact character sequences, so a number word typed in a non\-canonical order would not be recognized\.Thatherefore ships a text cleanup step adapted from SIL’skhnormal\[[22](https://arxiv.org/html/2609.30984#bib.bib37)\], meant to run before either direction: it sorts the characters of each syllable into canonical order, merges confusable vowel sequences and removes repeated invisible characters\. Unlike the current upstream version, it keeps coeng\\khmerfontដ and coeng\\khmerfontត apart, since they are pronounced differently\. Google’s TTS prompts are already in canonical order \(the cleanup changes none of them\), so the evaluation in §[5](https://arxiv.org/html/2609.30984#S5)does not depend on it\.
#### Context rules\.
Some readings depend on more than the token\. A pre\-processing rewrite rule turns a hyphen into a minus sign only when it is not attached to a word or number on its left \(“−5\-5” but not “2\-3” or “COVID\-19”\)\. A dash between two quantities is read as a range \(\\khmerfontដល់\), or as a score \(\\khmerfontទល់\) when the line contains a sports keyword or team names on both sides, and not after words such as\\khmerfontថ្ងៃទី \(“the day”\)\.\\khmerfontម៉ោង \(“hour”\) and\\khmerfontថ្ងៃទី before a time or date are absorbed into the token so that they are not spoken twice\. Dot thousands \(\\khmerfont១\.០០០ = 1000\) and score readings can be switched off\.
### 4\.4The repetition mark
The mark\\khmerfontៗ tells the reader to say the preceding word again:\\khmerfontក្មេងៗ \(“children”\) is read\\khmerfontក្មេងក្មេង\. It does not say how much text the preceding word is\. With no spaces between words, the scope has to be recovered, and it is not always one word:\\khmerfontបន្តិចម្ដងៗ \(“little by little”\) repeats the two words\\khmerfontបន្តិចម្ដង, and\\khmerfontពីរថ្ងៃម្ដងៗ \(“every two days”\) repeats three\.
Thasegments up to 120 characters before the mark with khmercut\[[34](https://arxiv.org/html/2609.30984#bib.bib32)\], on the same line and after the last space, because a space ends the phrase: in\\khmerfontរៀងរាល់ថ្ងៃ ម្ដងៗ only\\khmerfontម្ដង is repeated\. Of the last three wordsw1w2w3w\_\{1\}w\_\{2\}w\_\{3\}, the rules in Table[3](https://arxiv.org/html/2609.30984#S4.T3)choose how many to repeat; by default it is the last one\. The rules accept both spellings of\\khmerfontម្ដង, with coeng\\khmerfontដ or coeng\\khmerfontត\. A space before the mark is ignored \(\\khmerfontក្មេង ៗ\), and a mark with no word before it is dropped\. The ITN post\-processing reverses the expansion: a word or phrase repeated withgets its mark back\.
Table 3:How much text\\khmerfontៗ repeats, decided on the last three wordsw1w2w3w\_\{1\}w\_\{2\}w\_\{3\}before it as segmented by khmercut\. Units of time are\\khmerfontម៉ោង,\\khmerfontថ្ងៃ,\\khmerfontយប់,\\khmerfontសប្ដាហ៍,\\khmerfontអាទិត្យ,\\khmerfontខែ and\\khmerfontឆ្នាំ\.
### 4\.5Inverse normalization grammars
#### Cardinals\.
The ITN cardinal grammar is written directly on the spoken side rather than by inverting the TN grammar, so that it accepts forms the TN grammar never produces\. Following the approach of NeMo’s ITN grammars, it builds a zero\-padded 15\-digit string, one block per scale word \(Figure[3](https://arxiv.org/html/2609.30984#S4.F3)\), and then deletes the leading zeros\. Each block admits several spoken structures: the six digits below a million can be\\khmerfont\[X សែន\]\[X ម៉ឺន\]\[X ពាន់\] hundreds,\\khmerfonthundreds ពាន់ hundreds \(the colloquial\\khmerfontដប់ពាន់,\\khmerfontមួយរយពាន់\) or\\khmerfonttens ម៉ឺន … \(\\khmerfontដប់ម៉ឺន\)\. Millions are counted up to 999,999, so\\khmerfontមួយពាន់លាន is 109without a rule of its own\. Short tens \(\\khmerfontសាមប្រាំ\), the pronunciation spelling\\khmerfontប្រាំពិល \(7\) and zero\-padded numbers \(\\khmerfontសូន្យសូន្យប្រាំពីរ → 007\) are accepted\.
\\khmerfontទ្រីលាន\\khmerfontប៊ីលាន\\khmerfontលាន\\khmerfontពាន់\\khmerfontរយ1413121110987654321010kBelow a million\(blue\), any of:\\khmerfont\[X សែន\]\[X ម៉ឺន\]\[X ពាន់\]*hundreds*\\khmerfontមួយម៉ឺនប្រាំពាន់*hundreds*\\khmerfontពាន់*hundreds*\\khmerfontដប់ពាន់,\\khmerfontមួយរយពាន់*tens*\\khmerfontម៉ឺន \[X ពាន់\]*hundreds*\\khmerfontដប់ម៉ឺនMillions: up to six digits before\\khmerfontលានwhen there is no\\khmerfontប៊ីលាន, so\\khmerfontមួយពាន់លាន=109=10^\{9\}Above:*hundreds*before\\khmerfontប៊ីលាន and\\khmerfontទ្រីលានFigure 3:The ITN cardinal grammar writes every number as 15 zero\-padded digits, one block per scale word, then removes the leading zeros\. Each block accepts the standard and the colloquial spoken structures\.
#### Flexible joins\.
Khmer spoken\-form text, like any Khmer text, writes number words together \(\\khmerfontពីររយហាសិប\), but the TN output joins them withand text from the web often has zero\-width spaces between words\. Rather than enumerating joiners in every grammar, each class grammarGcG\_\{c\}is written without them and composed with a transducerJJthat optionally deletes aor U\+200B between two characters:J∘GcJ\\circ G\_\{c\}\.JJis an optional context\-dependent rewrite rule\[[16](https://arxiv.org/html/2609.30984#bib.bib21)\]\. A space is not a joiner\. It marks a phrase boundary in Khmer, so\\khmerfontពីររយ ហាសិប is read as two numbers, 200 and 50; only the date grammar accepts spaces between its parts, as in\\khmerfontថ្ងៃទីពីរ ខែមករា\.
#### Single digits\.
A single number word on its own is usually part of the phrasing \(\\khmerfontមួយចំនួន, “some”;\\khmerfontប្រាំនាក់, “five people”\) and is left as a word\. It is written as a digit only inside a larger token \(a time, an amount, a measure, a range\) or after\\khmerfontទី and\\khmerfontលេខ \(“\\khmerfontទីបី” → “\\khmerfontទី3”\)\.
#### Negative numbers\.
\\khmerfont
ដក before a number is read as a minus sign in cardinals, decimals, measures and amounts of money:\\khmerfontដកដប់ →−10\-10,\\khmerfontដកដប់អង្សាសេ →−10\-10°C,\\khmerfontដកប្រាំដុល្លារ →−$5\-\\$5\. A single digit counts here, since the sign makes it a number\. Between two numbers\\khmerfontដក is subtraction, read by the arithmetic class below\.\\khmerfontដក is also a common verb \(“to take out”, “to withdraw”\), but only a following number turns it into a sign, so words such as\\khmerfontដកហូត \(“to revoke”\) are left alone\.
#### Arithmetic\.
The operator words the normalizer produces for\+\+,−\-,×\\times,÷\\divand==\(\\khmerfontបូក,\\khmerfontដក,\\khmerfontគុណ,\\khmerfontចែក,\\khmerfontស្មើ\) are written back as symbols when they stand between two numbers:\\khmerfontម្ភៃដកដប់ → 20 \- 10,\\khmerfontពីរបូកបីស្មើប្រាំ → 2 \+ 3 = 5\. Outside that position they stay words, so\\khmerfontចែករំលែក \(“to share”\) and\\khmerfontគុណភាព \(“quality”\) are left alone\. A single expression token is cheaper than two numbers around a word, so\\khmerfontម្ភៃដកដប់ is never read as 20 followed by−10\-10\.
#### Classes and output\.
The ITN grammars cover 13 classes: cardinal, decimal, money, measure, time \(including\\khmerfontកន្លះ, “half past”\), full dates, telephone numbers, e\-mail addresses and URLs spoken with “dot”/\\khmerfontចុច and “at”/\\khmerfontអ៊ែត, license plates, fractions, ranges and scores, arithmetic, and serials\. The written conventions are options: Latin or Khmer digits, and a thousands separator for numbers of five digits or more\. A word repeated withgets its repetition mark back \(\\khmerfontក្មេងក្មេង →\\khmerfontក្មេងៗ, §[4\.4](https://arxiv.org/html/2609.30984#S4.SS4)\)\.
### 4\.6Implementation
Thais a Python package built on Pynini 2\.1\.7\[[12](https://arxiv.org/html/2609.30984#bib.bib18)\]\. The grammars compile when first used, in 4\.7 s for TN and 1\.5 s for ITN on a laptop, and are cached for the process\. The compiled TN classifier has 425,482 states and 487,894 arcs, the ITN classifier 246,685 states and 352,104 arcs \(Figure[4](https://arxiv.org/html/2609.30984#S4.F4)\)\. The API mirrors NeMo’s:
import thatha\.normalize\_text\("\\khmerfontតម្លៃ $1\.05"\)\#\\khmerfontតម្លៃ មួយដុល្លារប្រាំសេនtha\.inverse\_normalize\_text\("\\khmerfontចំណាយពីររយហាសិបដុល្លារ"\)\#\\khmerfontចំណាយ$250
Figure 4:Size of each class grammar before it is combined into the classifier\. Money and measure are the largest because every currency and unit is its own path\. Classes without a bar in one direction exist only in the other\.
## 5Evaluation
There is no public gold standard for Khmer text normalization, so we use four smaller evaluations that can all be rerun from public data: agreement with an independent grammar, ITN on real spoken\-form text, round trips, and an ablation\.
#### Data\.
\(1\) The verbalizer test files of Google’s Khmer grammars\[[24](https://arxiv.org/html/2609.30984#bib.bib23),[7](https://arxiv.org/html/2609.30984#bib.bib15)\]: 274 cardinals, and decimals and times, each with a structured value and the words the reference grammar produces\. \(2\) 2,906 prompts of Google’s Khmer TTS corpus\[[23](https://arxiv.org/html/2609.30984#bib.bib24),[9](https://arxiv.org/html/2609.30984#bib.bib25)\], real sentences already written in spoken form, with numbers as words\. Both sources separate every word with a space, which Khmer text does not do, so we remove the spaces between Khmer characters before running ITN: the prompts then read like ordinary Khmer text, and every number has to be found without word boundaries\. \(3\) The 62,175 Khmer entries of the accompanying pronunciation lexicon, as a list of ordinary words that ITN should leave alone\. \(4\) Randomly generated written tokens of ten classes, 300 per class\.
### 5\.1Agreement with Google’s grammar
Table[4](https://arxiv.org/html/2609.30984#S5.T4)comparesThawith the reference verbalizations\. In the TN direction,Tha’s cardinal words equal the reference, spaces removed, in 236 of 274 cases\. All other cases differ only in the spelling of seven: the reference writes\\khmerfontប្រាំពិល, following the pronunciation, whereThawrites the standard\\khmerfontប្រាំពីរ\. With that spelling mapped, all 274 agree\.
In the ITN direction we read the reference’s spoken forms back withTha; single digits without a sign, whichThadeliberately leaves as words, are excluded\. Before we added\\khmerfontប្រាំពិល to the ITN grammar, every cardinal error came from this spelling\.\\khmerfontដប់ប្រាំពិល \(17\), for example, was read as “15\\khmerfontពិល”, because the number grammar matched\\khmerfontប្រាំ \(“five”\) and the boundary filter cannot tell that\\khmerfontពិល continues the word\. With the spelling added,Thareads all cardinals and times correctly\. The four remaining decimal errors are numbers in scientific notation \(\\khmerfontគុណនឹងដប់ស្វ័យគុណ…, “times ten to the power of”\), whichThadoes not support\. We would not have found the\\khmerfontប្រាំពិល problem with our own test cases, which all use the standard spelling\.
nnbeforeafterTNcardinal \(exact\)274236cardinal \(\\khmerfontពិល≡\\equiv\\khmerfontពីរ\)274274ITNcardinal265228265decimal271923time13713Table 4:Agreement with the test suite of Google’s Khmer grammars\[[24](https://arxiv.org/html/2609.30984#bib.bib23)\]\. ITN columns: correct before and after adding the spelling\\khmerfontប្រាំពិល \(7\) to the ITN grammar\.
### 5\.2Inverse normalization of spoken text
We ran ITN over all 2,906 TTS prompts\. It rewrote 158 sentences, writing 172 tokens \(Figure[5](https://arxiv.org/html/2609.30984#S5.F5)\); the others contain no number or only single\-digit words\. We checked every rewritten sentence by hand\. 153 \(96\.8%\) are correct, for example\\khmerfontតែចិតសិបម៉ែត្រសោះ →\\khmerfontតែ70 m\\khmerfontសោះ,\\khmerfontទៅម្ភៃមួយម៉ឺនប្រាំបីពាន់តោន →\\khmerfontទៅ218000 t, the colloquial\\khmerfontផ្លូវបីរយចិតមួយ →\\khmerfontផ្លូវ371 and the full date\\khmerfontថ្ងៃទីពីរខែមករាឆ្នាំពីរពាន់ដប់បួន → 02/01/2014\. Table[5](https://arxiv.org/html/2609.30984#S5.T5)lists the 5 errors\. Three come from misspelled units in the source text, one from a unit that is also the beginning of a brand name, and one from\\khmerfontផោន, which is both the pound sterling and the pound weight\. We also searched the unchanged sentences for scale and tens words: the only missed number is the typo\\khmerfontសាបសិប \(for\\khmerfontសាមសិប\), while\\khmerfontស្ទឹងសែន \(a river and town\),\\khmerfontរាប់លាន \(“millions of”\) and\\khmerfontសែន as a ritual offering were correctly left alone\. All judgements are the author’s\.
Figure 5:Semiotic tokens written by ITN in the 2,906 TTS prompts\.Table 5:All ITN errors in the TTS prompts\.
### 5\.3Round trips
A written tokenxxthat TN verbalizes asssshould be written back asxxby ITN\. We generated 300 written tokens for each of ten classes inTha’s own written conventions, verbalized them, joined the words of each token in three ways \(glued,, zero\-width spaces\) and read them back \(Figure[6](https://arxiv.org/html/2609.30984#S5.F6)\)\. 8 of the 10 classes round trip exactly in every style\. Cardinals of every length from 2 to 15 digits round trip at 100\.0% in every style \(200 per length\)\.
Decimals round trip in 91\.0% of cases: the failures are numbers such as 503\.811, which TN, following Khmer usage, reads as 503811 because a dot is followed by exactly three digits\. The error is in the forward direction and is the documented cost of the dot\-thousands option\. Telephone numbers round trip in 98\.7% of cases because the spoken form itself is ambiguous: the subscriber number 1030675 is read in chunks as\\khmerfontដប់សាមសិបប្រាំមួយរយចិតសិបប្រាំ \(10, 30, 675\), which can equally be split as 10, 35, 175\. The words alone do not say which one was meant\.
Figure 6:Round trip accuracy \(%\) by class and by how the spoken words are joined: glued, with\(U\+2581\), or with zero\-width spaces \(U\+200B\)\. 300 tokens per class\.
### 5\.4Ablation
We removed one design choice at a time and ran ITN over the lexicon entries and the prompts \(Figure[7](https://arxiv.org/html/2609.30984#S5.F7)\)\. Most lexicon entries are single words and should come back unchanged\. We classify every change automatically by aligning the number’s span with khmercut’s word boundaries: the whole entry is a number \(\\khmerfontដប់\); a number sits at a word boundary of a compound entry, such as a place name \(\\khmerfontភ្នំមួយរយ →\\khmerfontភ្នំ100\) or an ordinal \(\\khmerfontទីបី →\\khmerfontទី3\), which is a legitimate reading; or a number starts or ends*inside*a word, which is an error\.
With every rule on,Thachanges 36 of the 62,175 entries, and the proxy flags 4 as inside a word\. On inspection, three of these are compounds that khmercut does not split \(\\khmerfontវិនាទីមួយ, “one second”\), and one is a real error:\\khmerfontក្របី \(“buffalo”\) ends in\\khmerfontបី \(“three”\), a whole syllable that the boundary filter cannot distinguish from a number, so\\khmerfontក្របីរៀល becomes\\khmerfontក្រ3\\khmerfont៛\. Without the boundary filter, 9 entries are split inside a syllable, for example\\khmerfontដណ្ដប់ \(“to cover”\) →\\khmerfontដណ្10, where\\khmerfontដប់ \(“ten”\) is a subscript cluster, and\\khmerfontមួយរយៈ → 100\\khmerfontៈ\. Allowing single digits has by far the largest effect: 186 entries change, 61 of them inside a word \(\\khmerfontក្របី →\\khmerfontក្រ3,\\khmerfontកំពង់ប្រាំង →\\khmerfontកំពង់5\\khmerfontង\), and 438 prompt sentences change instead of 158\. Some of these extra sentence changes are correct readings of small numbers \(\\khmerfontបីខ្នង, “three buildings”\), so the rule costs some recall on small numbers\. We keep it on by default, since a missed\\khmerfontបី is harmless and a broken word is not\.
Figure 7:Ablation of the ITN design choices\. Left: lexicon entries that ITN changes, by where the number’s span falls relative to khmercut’s word boundaries; “inside a word” is an error\. Right: TTS prompt sentences changed\.
### 5\.5Speed
Figure[8](https://arxiv.org/html/2609.30984#S5.F8)shows the time per sentence over the prompts, on one core of a laptop \(Apple silicon\)\. The median prompt takes 8\.6 ms to inverse normalize and its written form 3\.4 ms to normalize \(95th percentiles 17\.8 and 6\.8 ms\), about 4\.4 and 10\.9 thousand characters per second\. Time grows linearly with length, as expected of composition with a fixed transducer\.
Figure 8:Time per sentence against sentence length\. Lines are medians over 20\-character bins\.
## 6Discussion and limitations
#### Ambiguity\.
A better grammar will not fix every error\. A telephone number read in chunks,\\khmerfontផោន as currency or weight, a dash as range or score, and\\khmerfontដក before a count \(\\khmerfontដកដប់នាក់ចេញ, “take ten people out”, is written−10\-10\\khmerfontនាក់ចេញ\) all need information that is not in the token\.Tharesolves the last with sentence\-level cues and leaves the first two to its weights; a language model rescoring the lattice, as in shallow fusion\[[2](https://arxiv.org/html/2609.30984#bib.bib12)\], or a neural span tagger such as KhmerTagger\[[35](https://arxiv.org/html/2609.30984#bib.bib27)\]could supply the missing context whileTha’s grammars keep the conversion itself exact\.
#### Orthographic variation\.
The Google evaluation and the TTS prompts both show that the errors that remain come from spellings the grammar does not know: pronunciation spellings \(\\khmerfontប្រាំពិល\), misspelled units and typos\. Because the word lists are data files, these can be added without changing the grammars, but they must first be found; a list of attested variants from a large corpus would help most\. A related limit of the boundary filter is a number word that is a whole syllable at the end of another word:\\khmerfontបី \(“three”\) ends\\khmerfontក្របី \(“buffalo”\), and only a lexicon, not the script, can tell them apart\.
#### Style choices\.
Several outputs are conventions rather than facts: Latin or Khmer digits, symbols \(\\khmerfont៛, %\) or unit words, numeric or spelled dates, and whether single digits become digits\.Thaexposes the most important as options, but a downstream user may prefer others\.
#### Coverage\.
ITN does not read back Roman numerals, letter codes \(\\khmerfontជី is both the letter G and “fertilizer”\) or whitelist abbreviations\. TN has no abbreviation expansion beyond a short whitelist\.
#### Evaluation\.
Our evaluation uses an independent grammar’s test suite, one corpus of spoken\-form text, round trips and an ablation; it does not include a large, independently annotated gold standard of written Khmer text, nor a measurement of the repetition rules of §[4\.4](https://arxiv.org/html/2609.30984#S4.SS4), or a comparison with neural or LLM\-based normalizers\[[36](https://arxiv.org/html/2609.30984#bib.bib8),[33](https://arxiv.org/html/2609.30984#bib.bib28)\]\. Building such a test set is the most useful next step\.
## 7Conclusion
Thabrings the tagger and verbalizer design of Sparrowhawk and NeMo to Khmer\. Tagging the whole line at once removes the need for a word segmenter, and the boundary filter is what allows ITN to run over raw text without breaking ordinary words\. The main open problems are spelling variation and a proper annotated test set\. The code, grammars, experiment scripts and results are available at[https://github\.com/seanghay/tha](https://github.com/seanghay/tha)\.
## Acknowledgements
We thank the authors of Google’s Khmer language resources, whose test suite, TTS prompts and lexicon made the evaluation possible\.
## References
- \[1\]C\. Allauzen, M\. Riley, J\. Schalkwyk, W\. Skut, and M\. Mohri\(2007\)OpenFst: a general and efficient weighted finite\-state transducer library\.InImplementation and Application of Automata \(CIAA 2007\),Lecture Notes in Computer Science, Vol\.4783,pp\. 11–23\.External Links:[Document](https://dx.doi.org/10.1007/978-3-540-76336-9%5F3)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.
- \[2\]E\. Bakhturina, Y\. Zhang, and B\. Ginsburg\(2022\)Shallow fusion of weighted finite\-state transducer and language model for text normalization\.InProc\. Interspeech 2022,pp\. 491–495\.External Links:[Document](https://dx.doi.org/10.21437/Interspeech.2022-11074)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px2.p1.1),[§6](https://arxiv.org/html/2609.30984#S6.SS0.SSS0.Px1.p1.1)\.
- \[3\]V\. Chea, Y\. K\. Thu, C\. Ding, M\. Utiyama, A\. Finch, and E\. Sumita\(2015\)Khmer word segmentation using conditional random fields\.InKhmer Natural Language Processing 2015 \(KhNLP2015\),Phnom Penh, Cambodia,pp\. 62–69\.External Links:[Link](https://att-astrec.nict.go.jp/member/ding/KhNLP2015-SEG.pdf)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px3.p1.1)\.
- \[4\]H\. Choi, M\. Choi, Y\. Lim, M\. Lee, S\. Kim, S\. Yun, D\. Kim, and S\. Kim\(2024\)Spoken\-to\-written text conversion with large language model\.InProc\. Interspeech 2024,pp\. 2410–2414\.External Links:[Document](https://dx.doi.org/10.21437/Interspeech.2024-376)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px2.p1.1)\.
- \[5\]A\. Conneau, M\. Ma, S\. Khanuja, Y\. Zhang, V\. Axelrod, S\. Dalmia, J\. Riesa, C\. Rivera, and A\. Bapna\(2023\)FLEURS: few\-shot learning evaluation of universal representations of speech\.In2022 IEEE Spoken Language Technology Workshop \(SLT\),pp\. 798–805\.External Links:[Document](https://dx.doi.org/10.1109/SLT54892.2023.10023141)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px4.p1.1)\.
- \[6\]P\. Ebden and R\. Sproat\(2015\)The Kestrel TTS text normalization system\.Natural Language Engineering21\(3\),pp\. 333–353\.External Links:[Document](https://dx.doi.org/10.1017/S1351324914000175)Cited by:[§1](https://arxiv.org/html/2609.30984#S1.p1.1),[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.
- \[7\]Google\(2015\)Language resources: datasets and tools for basic natural language processing\.Note:[https://github\.com/google/language\-resources](https://github.com/google/language-resources)Khmer Thrax/Sparrowhawk grammars underkm/textnorm\(classifier, verbalizer\); repository archived\. Accessed 2026\-09\-25Cited by:[§5](https://arxiv.org/html/2609.30984#S5.SS0.SSS0.Px1.p1.1)\.
- \[8\]Google\(2016\)Sparrowhawk: an open\-source text normalization system\.Note:[https://github\.com/google/sparrowhawk](https://github.com/google/sparrowhawk)Open\-source release of the Kestrel TN framework; repository archived\. Accessed 2026\-09\-25Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.
- \[9\]Google\(2018\)High quality TTS data for Khmer \(SLR42\)\.Note:[https://www\.openslr\.org/42/](https://www.openslr.org/42/)Multi\-speaker km\-KH TTS corpus, CC BY\-SA 4\.0\. Accessed 2026\-09\-25Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px3.p1.1),[§5](https://arxiv.org/html/2609.30984#S5.SS0.SSS0.Px1.p1.1)\.
- \[10\]K\. Gorman and R\. Sproat\(2016\)Minimally supervised number normalization\.Transactions of the Association for Computational Linguistics4,pp\. 507–519\.External Links:[Document](https://dx.doi.org/10.1162/tacl%5Fa%5F00114),[Link](https://aclanthology.org/Q16-1036/)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px4.p1.1)\.
- \[11\]K\. Gorman and R\. Sproat\(2021\)Finite\-state text processing\.Synthesis Lectures on Human Language Technologies,Springer \(originally Morgan & Claypool\)\.External Links:[Document](https://dx.doi.org/10.1007/978-3-031-02179-4)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.
- \[12\]K\. Gorman\(2016\)Pynini: a Python library for weighted finite\-state grammar compilation\.InProceedings of the SIGFSM Workshop on Statistical NLP and Weighted Automata,Berlin, Germany,pp\. 75–80\.External Links:[Document](https://dx.doi.org/10.18653/v1/W16-2409),[Link](https://aclanthology.org/W16-2409/)Cited by:[§1](https://arxiv.org/html/2609.30984#S1.p1.1),[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1),[§4\.6](https://arxiv.org/html/2609.30984#S4.SS6.p1.1)\.
- \[13\]F\. E\. Huffman\(1970\)Cambodian system of writing and beginning reader, with drills and glossary\.Yale Linguistic Series,Yale University Press,New Haven\.Note:xii\+365 pp\. Reviewed by P\. N\. Jenner, Journal of Asian Studies 30\(3\):732–733, 1971, doi:10\.2307/2052533Cited by:[§2](https://arxiv.org/html/2609.30984#S2.SS0.SSS0.Px1.p1.1)\.
- \[14\]C\. Johny, L\. Wolf\-Sonkin, A\. Gutkin, and B\. Roark\(2021\)Finite\-state script normalization and processing utilities: the Nisaba Brahmic library\.InProceedings of the 16th Conference of the European Chapter of the Association for Computational Linguistics: System Demonstrations,pp\. 14–23\.External Links:[Document](https://dx.doi.org/10.18653/v1/2021.eacl-demos.3),[Link](https://aclanthology.org/2021.eacl-demos.3/)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px3.p1.1)\.
- \[15\]M\. Ma, H\. Zen, and J\. Zhao\(2026\)Leveraging large language models for text normalization of non\-standard words in text\-to\-speech synthesis\.InICASSP 2026 – 2026 IEEE International Conference on Acoustics, Speech and Signal Processing \(ICASSP\),pp\. 18622–18626\.External Links:[Document](https://dx.doi.org/10.1109/ICASSP55912.2026.11463552)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px2.p1.1)\.
- \[16\]M\. Mohri and R\. Sproat\(1996\)An efficient compiler for weighted rewrite rules\.In34th Annual Meeting of the Association for Computational Linguistics,Santa Cruz, California, USA,pp\. 231–238\.External Links:[Document](https://dx.doi.org/10.3115/981863.981894),[Link](https://aclanthology.org/P96-1031/)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1),[§4\.5](https://arxiv.org/html/2609.30984#S4.SS5.SSS0.Px2.p1.1)\.
- \[17\]M\. Mohri\(1997\)Finite\-state transducers in language and speech processing\.Computational Linguistics23\(2\),pp\. 269–311\.External Links:[Link](https://aclanthology.org/J97-2003/)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.
- \[18\]Y\. M\. Oo, T\. Wattanavekin, C\. Li, P\. De Silva, S\. Sarin, K\. Pipatsrisawat, M\. Jansche, O\. Kjartansson, and A\. Gutkin\(2020\)Burmese speech corpus, finite\-state text normalization and pronunciation grammars with an application to text\-to\-speech\.InProceedings of the Twelfth Language Resources and Evaluation Conference \(LREC 2020\),Marseille, France,pp\. 6328–6339\.External Links:[Link](https://aclanthology.org/2020.lrec-1.777/)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px3.p1.1)\.
- \[19\]E\. Pusateri, B\. R\. Ambati, E\. Brooks, O\. Platek, D\. McAllaster, and V\. Nagesha\(2017\)A mostly data\-driven approach to inverse text normalization\.InProc\. Interspeech 2017,pp\. 2784–2788\.External Links:[Document](https://dx.doi.org/10.21437/Interspeech.2017-1274)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px2.p1.1)\.
- \[20\]A\. Radford, J\. W\. Kim, T\. Xu, G\. Brockman, C\. McLeavey, and I\. Sutskever\(2023\)Robust speech recognition via large\-scale weak supervision\.InProceedings of the 40th International Conference on Machine Learning,Proceedings of Machine Learning Research, Vol\.202,pp\. 28492–28518\.External Links:[Link](https://proceedings.mlr.press/v202/radford23a.html)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px4.p1.1)\.
- \[21\]S\. Ritchie, R\. Sproat, K\. Gorman, D\. van Esch, C\. Schallhart, N\. Bampounis, B\. Brard, J\. F\. Mortensen, M\. Holt, and E\. Mahon\(2019\)Unified verbalization for speech recognition & synthesis across languages\.InProc\. Interspeech 2019,pp\. 3530–3534\.External Links:[Document](https://dx.doi.org/10.21437/Interspeech.2019-2807)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.
- \[22\]SIL Global\(2019\)Khmer character specification\.Note:[https://github\.com/sillsdev/khmer\-character\-specification](https://github.com/sillsdev/khmer-character-specification)Includes khnormal, a normalizer for the Khmer encoding structure \(MIT license\)\. Accessed 2026\-09\-25Cited by:[§2](https://arxiv.org/html/2609.30984#S2.SS0.SSS0.Px1.p1.1),[§4\.3](https://arxiv.org/html/2609.30984#S4.SS3.SSS0.Px3.p1.1)\.
- \[23\]K\. Sodimana, P\. De Silva, S\. Sarin, K\. Pipatsrisawat, O\. Kjartansson, M\. Jansche, and L\. Ha\(2018\)A step\-by\-step process for building TTS voices using open source data and frameworks for Bangla, Javanese, Khmer, Nepali, Sinhala, and Sundanese\.InProc\. 6th Workshop on Spoken Language Technologies for Under\-Resourced Languages \(SLTU 2018\),Gurugram, India,pp\. 66–70\.External Links:[Document](https://dx.doi.org/10.21437/SLTU.2018-14)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px3.p1.1),[§5](https://arxiv.org/html/2609.30984#S5.SS0.SSS0.Px1.p1.1)\.
- \[24\]K\. Sodimana, P\. De Silva, R\. Sproat, T\. Wattanavekin, A\. Gutkin, and K\. Pipatsrisawat\(2018\)Text normalization for Bangla, Khmer, Nepali, Javanese, Sinhala and Sundanese text\-to\-speech systems\.InProc\. 6th Workshop on Spoken Language Technologies for Under\-Resourced Languages \(SLTU 2018\),Gurugram, India,pp\. 147–151\.External Links:[Document](https://dx.doi.org/10.21437/SLTU.2018-31)Cited by:[§1](https://arxiv.org/html/2609.30984#S1.p2.1),[§2](https://arxiv.org/html/2609.30984#S2.SS0.SSS0.Px1.p1.1),[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px3.p1.1),[§5](https://arxiv.org/html/2609.30984#S5.SS0.SSS0.Px1.p1.1),[Table 4](https://arxiv.org/html/2609.30984#S5.T4)\.
- \[25\]R\. Sproat, A\. W\. Black, S\. Chen, S\. Kumar, M\. Ostendorf, and C\. D\. Richards\(2001\)Normalization of non\-standard words\.Computer Speech & Language15\(3\),pp\. 287–333\.External Links:[Document](https://dx.doi.org/10.1006/csla.2001.0169)Cited by:[§1](https://arxiv.org/html/2609.30984#S1.p1.1),[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.
- \[26\]R\. Sproat and N\. Jaitly\(2016\)RNN approaches to text normalization: a challenge\.Note:arXiv:1611\.00068External Links:1611\.00068,[Link](https://arxiv.org/abs/1611.00068)Cited by:[§1](https://arxiv.org/html/2609.30984#S1.p1.1),[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px2.p1.1)\.
- \[27\]R\. Sproat and N\. Jaitly\(2017\)An RNN model of text normalization\.InProc\. Interspeech 2017,pp\. 754–758\.External Links:[Document](https://dx.doi.org/10.21437/Interspeech.2017-35)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px2.p1.1)\.
- \[28\]M\. Sunkara, C\. Shivade, S\. Bodapati, and K\. Kirchhoff\(2021\)Neural inverse text normalization\.InICASSP 2021 – 2021 IEEE International Conference on Acoustics, Speech and Signal Processing \(ICASSP\),pp\. 7573–7577\.External Links:[Document](https://dx.doi.org/10.1109/ICASSP39728.2021.9414912)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px2.p1.1)\.
- \[29\]T\. Tai, W\. Skut, and R\. Sproat\(2011\)Thrax: an open source grammar compiler built on OpenFst\.Note:IEEE Automatic Speech Recognition and Understanding Workshop \(ASRU 2011\), toolkit demonstrationExternal Links:[Link](http://dihana.cps.unizar.es/proceedings/ASRU/2011/Toolkit/Thrax.pdf)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.
- \[30\]The Unicode Consortium\(2025\)The Unicode standard, version 17\.0\.0\.The Unicode Consortium,South San Francisco, CA\.Note:Chapter 16 \(Southeast Asia\-I\), Section 16\.4: KhmerExternal Links:ISBN 978\-1\-936213\-35\-1,[Link](https://www.unicode.org/versions/Unicode17.0.0/)Cited by:[§2](https://arxiv.org/html/2609.30984#S2.SS0.SSS0.Px1.p1.1)\.
- \[31\]D\. van Esch and R\. Sproat\(2017\)An expanded taxonomy of semiotic classes for text normalization\.InProc\. Interspeech 2017,pp\. 4016–4020\.External Links:[Document](https://dx.doi.org/10.21437/Interspeech.2017-402)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.
- \[32\]WeNet Community\(2022\)WeTextProcessing: text normalization & inverse text normalization\.Note:[https://github\.com/wenet\-e2e/WeTextProcessing](https://github.com/wenet-e2e/WeTextProcessing)Apache\-2\.0\. Accessed 2026\-09\-25Cited by:[§1](https://arxiv.org/html/2609.30984#S1.p2.1),[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.
- \[33\]M\. Wong, A\. Alshehri, S\. Kao, and H\. He\(2025\)PolyNorm: few\-shot LLM\-based text normalization for text\-to\-speech\.InProceedings of the 2025 Conference on Empirical Methods in Natural Language Processing: Industry Track,Suzhou, China,pp\. 77–85\.External Links:[Document](https://dx.doi.org/10.18653/v1/2025.emnlp-industry.6),[Link](https://aclanthology.org/2025.emnlp-industry.6/)Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px2.p1.1),[§6](https://arxiv.org/html/2609.30984#S6.SS0.SSS0.Px5.p1.1)\.
- \[34\]S\. Yath\(2023\)Khmercut: a \(fast\) Khmer word segmentation toolkit\.Note:[https://github\.com/seanghay/khmercut](https://github.com/seanghay/khmercut)Accessed 2026\-09\-25Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px4.p1.1),[§4\.4](https://arxiv.org/html/2609.30984#S4.SS4.p2.1)\.
- \[35\]S\. Yath\(2024\)KhmerTagger: inverse text normalization for Khmer automatic speech recognition\.Note:[https://github\.com/seanghay/khmertagger](https://github.com/seanghay/khmertagger)Apache\-2\.0\. Accessed 2026\-09\-25Cited by:[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px4.p1.1),[§6](https://arxiv.org/html/2609.30984#S6.SS0.SSS0.Px1.p1.1)\.
- \[36\]H\. Zhang, R\. Sproat, A\. H\. Ng, F\. Stahlberg, X\. Peng, K\. Gorman, and B\. Roark\(2019\)Neural models of text normalization for speech applications\.Computational Linguistics45\(2\),pp\. 293–337\.External Links:[Document](https://dx.doi.org/10.1162/coli%5Fa%5F00349)Cited by:[§1](https://arxiv.org/html/2609.30984#S1.p1.1),[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px2.p1.1),[§6](https://arxiv.org/html/2609.30984#S6.SS0.SSS0.Px5.p1.1)\.
- \[37\]Y\. Zhang, E\. Bakhturina, K\. Gorman, and B\. Ginsburg\(2021\)NeMo inverse text normalization: from development to production\.InProc\. Interspeech 2021,pp\. 4468–4472\.External Links:[Document](https://dx.doi.org/10.21437/Interspeech.2021-1571)Cited by:[§1](https://arxiv.org/html/2609.30984#S1.p2.1),[§3](https://arxiv.org/html/2609.30984#S3.SS0.SSS0.Px1.p1.1)\.相似文章
基于预训练文本到文本语言模型和读-标记-写策略的高效同传逆文本规范化研究
该论文提出一种基于预训练text-to-text模型和Read–Tag–Write解码策略的高效流式端到端逆文本正规范化(ITN)系统,在越南语数据集上达到与非流式基线相当的精度,同时满足实时延迟要求。
一种面向泰语和老挝语的音系全面、仅限ASCII的罗马化方案:系统性跨语言对应与中文用户友好设计
本文提出一种音系全面、仅限ASCII的罗马化方案,针对泰语和老挝语,旨在实现跨语言对应和机器处理,以辅助语言学习和语音处理。
多模态大语言模型真的理解低资源高棉文档吗?关于高棉文档视觉问答的一项初步研究
本文评估了开放多模态大语言模型在高棉文档视觉问答上的性能,发现虽然模型在处理英语和数字内容方面表现良好,但理解原生高棉脚本仍然具有挑战性。该研究使用了KH-FUNSD集合中的诊断子集,并比较了不同的模型配置。
越南北部高地、三角洲及海岸的回响:面向占语、高棉语和岱侬语的多语种语料库
介绍了首个面向占语、高棉语和岱侬语的多语种语料库及基准 CKTN,通过一种文字感知的适配方案来解决多语种编码器中的碎片化问题。
Dual-Form ASR:面向中文语音识别的语义感知逆文本规范化
本文提出Dual-Form ASR框架,通过配对监督和序列级目标,整合了口语形式自动语音识别与语义感知的书面形式逆文本规范化,从而提升中文语音识别任务的性能。