StreamTN
A Low-Latency Streaming Chinese Text Normalization Model for Streaming TTS in Dialogue Systems
Abstract Text-to-Speech (TTS) is an essential module that provides spoken responses in an LLM-centered spoken dialogue system (SDS). To ensure accurate TTS synthesis, responses generated by an LLM must be converted into TTS-readable formats via a Text Normalization (TN) module, imposing strict low-latency requirements in real-time SDS scenarios. Existing TN solutions are largely rule-based, rely on manual engineering, and generalize poorly to unseen patterns. Although an LLM itself can perform TN through prompt engineering, it faces key limitations: high first-token latency due to non-streaming processing, hallucination risks, and degraded intelligence or reasoning when the core LLM module is fine-tuned solely for TN. To address these challenges, we propose StreamTN, a lightweight LLM-based Chinese streaming TN model. Built on Qwen3-0.6B, StreamTN employs a dual-track streaming framework in which input tokens and output tokens are processed on two parallel tracks, enabling low-latency real-time inference without complex prompting. Moreover, task-specific fine-tuning yields superior TN performance and fewer hallucinations than rule-based systems and general-purpose LLMs. We also introduce a TN benchmark that spans diverse text scenarios, providing a comprehensive evaluation standard for speech generation in spoken dialogue systems. Experiments demonstrate the effectiveness of StreamTN in accuracy and inference latency.
This page is for research demonstration purposes only.
Appendix: Supplementary Experiments
Detailed latency decomposition, full evaluation metrics, and ablations referenced in the rebuttal.
A. Latency Comparison
FPD is the sum of the upstream waiting time and the TN computation time. Streaming StreamTN starts after receiving
the first d tokens from Qwen3-32B (~20 tokens/s on 2×A6000). Non-streaming methods must wait for the
complete input (a mean of 27.58 tokens → roughly 1.4 s at 20 tokens/s) before producing any output, which is
the architectural latency advantage of the dual-track design.
| Method |
Micro-F1 |
Upstream Wait (ms) |
TN Compute (ms) |
FPD (ms) |
| StreamTN (streaming, d=1) |
0.7030 |
70 |
5 |
75 |
| StreamTN (streaming, d=2) |
0.7952 |
115 |
6 |
121 |
| StreamTN (streaming, d=4) * |
0.8937 |
206 |
7 |
213 |
| StreamTN (streaming, d=8) |
0.9072 |
385 |
9 |
394 |
| StreamTN (streaming, d=16) |
0.9239 |
744 |
12 |
756 |
| WeTextProcessing |
0.7853 |
≈1,400 |
10.5 |
≈1,400 |
| Qwen3-0.6B (prompted) |
0.4872 |
≈1,400 |
50.3 |
≈1,400 |
| FlatTN |
0.7569 |
≈1,400 |
24.9 |
≈1,400 |
| BiLSTM |
0.8941 |
≈1,400 |
2.8 |
≈1,400 |
| StreamTN (non-streaming) |
0.9639 |
≈1,400 |
37.0 |
≈1,400 |
* configuration adopted in our main experiments. For streaming rows, “Upstream Wait” is the time
to receive the first d tokens and “TN Compute” is StreamTN’s incremental first-token compute.
For non-streaming methods, “Upstream Wait” is the time to receive the complete input, a simulated estimate
(≈1.4 s) obtained from the mean input length (27.58 tokens) divided by the upstream token rate (~20 tokens/s)
rather than a directly measured value. FPD is therefore dominated by this wait, and the method’s own compute
(mean, shown in the “TN Compute” column, ≤50 ms) adds only a negligible amount. TN compute for BiLSTM
and non-streaming StreamTN is the time to the first output token; for the other non-streaming methods it is the
full-output processing time.
B. Full Evaluation Metrics
Character-level Micro-F1 is the primary metric because it accommodates pronunciation-equivalent variants
(e.g., “2900¥” → “两千九百元” or “二千九百元” are both correct for TTS).
Sentence-level exact match and CER are reported as complementary, stricter metrics.
| Method |
Micro-P |
Micro-R |
Micro-F1 |
CER |
Sentence Acc. |
| WeTextProcessing |
0.7587 |
0.8139 |
0.7853 |
0.2780 |
0.4350 |
| Qwen3-0.6B (prompted) |
0.5282 |
0.4521 |
0.4872 |
0.4774 |
0.2655 |
| BiLSTM |
0.8677 |
0.9222 |
0.8941 |
0.1698 |
0.6038 |
| FlatTN |
0.7390 |
0.7758 |
0.7569 |
0.3115 |
0.3328 |
| StreamTN (non-streaming) |
0.9620 |
0.9658 |
0.9639 |
0.0490 |
0.6838 |
| StreamTN (streaming, d=4) |
0.8931 |
0.8943 |
0.8937 |
0.1399 |
0.5523 |
C. Prompt Used for the General-Purpose LLM Baseline
The exact prompt used to evaluate the non-fine-tuned Qwen3-0.6B baseline:
messages = [
{"role": "system", "content": "你是一个专业的文本标准化助手,请为我做一个文本标准化任务,将原始文本中的数字时间符号等全部标准化为汉字,用于后续TTS系统合成。"},
{"role": "user", "content": raw_text.strip()}
]
More detailed rule-based prompts were also tested but substantially increased per-item latency while still causing
frequent insertion, deletion, and out-of-input hallucination errors.
D. Zero-Vector Ablation: Shared Zero vs. Learned Delay Embedding
In the dual-track design, the input and output embeddings are added element-wise. During the delay phase the output
track contributes a zero vector, so the summed embedding carries only the raw input; once the input ends, the input
track contributes a zero vector, so the summed embedding carries only the output history. The phase is therefore
recoverable from whichever track is nonzero, which is why sharing a single zero vector for delay and
pad does not confuse the model. Replacing it with a learned delay embedding yields no consistent gain.
| Delay Frame |
Micro-F1 (shared zero) |
Micro-F1 (learned delay) |
| 1 frame |
0.7030 ± 0.0010 |
0.7024 ± 0.0013 |
| 2 frames |
0.7952 ± 0.0015 |
0.7950 ± 0.0008 |
| 4 frames * |
0.8937 ± 0.0009 |
0.8954 ± 0.0011 |
| 8 frames |
0.9072 ± 0.0011 |
0.9082 ± 0.0010 |
| 16 frames |
0.9239 ± 0.0008 |
0.9210 ± 0.0009 |
E. LoRA Rank / Alpha Ablation
With learning rate 1e-5 and the q/k/v/o projections fixed, a rank sweep (α=4r) raises Micro-F1 from 0.5228
(r=2) to 0.7292 (r=32), still below full fine-tuning (0.8937 at d=4). The gap is therefore configuration-dependent
rather than an inherent LoRA limitation.
| Rank (α=4r) |
Micro-P |
Micro-R |
Micro-F1 |
CER |
Sentence Acc. |
| r=2 (α=8) |
0.4959 |
0.5527 |
0.5228 |
0.6480 |
0.0135 |
| r=4 (α=16) |
0.5649 |
0.6043 |
0.5839 |
0.5483 |
0.0349 |
| r=8 (α=32) |
0.6251 |
0.6423 |
0.6336 |
0.4727 |
0.0658 |
| r=16 (α=64) |
0.6761 |
0.6859 |
0.6810 |
0.4057 |
0.1173 |
| r=32 (α=128) |
0.7319 |
0.7264 |
0.7292 |
0.3441 |
0.1783 |
F. Error Analysis
On the 1,262-sample test set, 565 samples (44.8%) contain at least one character-level
error. Character-level Levenshtein alignment (tie priority S>D>I) yields 33,684 matches, 2,736 substitutions
(51.9%), 1,264 deletions (24.0%), and 1,271 insertions (24.1%), for 5,271 total edits.
| Category |
Samples |
M |
S |
D |
I |
Errors (%) |
| Integers and Decimals | 100 | 1827 | 70 | 13 | 22 | 1.99 |
| Ordinal Numbers | 100 | 2318 | 138 | 36 | 59 | 4.42 |
| Phone Numbers | 100 | 2593 | 167 | 68 | 46 | 5.33 |
| Years and Dates | 97 | 2620 | 52 | 25 | 60 | 2.60 |
| Time Expressions | 100 | 2503 | 26 | 37 | 81 | 2.73 |
| Fractions and Percentages | 99 | 2095 | 70 | 51 | 31 | 2.88 |
| Military Code | 100 | 1268 | 99 | 14 | 7 | 2.28 |
| Uppercase Amounts | 70 | 1326 | 26 | 4 | 23 | 1.01 |
| Amount Readings | 78 | 1417 | 87 | 31 | 22 | 2.66 |
| Physical Units | 68 | 1751 | 27 | 8 | 13 | 0.91 |
| Chemical Formulas and Equations | 100 | 5571 | 995 | 428 | 561 | 37.64 |
| Simple Chemicals | 100 | 2823 | 244 | 139 | 68 | 8.56 |
| Mathematical Expressions | 100 | 2695 | 98 | 76 | 31 | 3.89 |
| Advanced Mathematical Expressions | 50 | 2877 | 637 | 334 | 247 | 23.11 |
Complex chemistry and advanced mathematics account for 11.9% of samples but 60.7% of total edits, indicating that
whole-expression rewrites and omissions (hallucination / context loss) are the dominant failure mode for these
categories, rather than tokenizer fragmentation alone.
High-Frequency Edits
Substitutions (ref → hyp)
| Count | Edit |
| 41 | 两 → 二 |
| 32 | 一 → 二 |
| 25 | 加 → 和 |
| 23 | 勾 → 九 |
| 15 | 一 → 1 |
| 13 | 二 → 2 |
| 11 | 三 → 3 |
| 11 | 千 → 百 |
| 10 | 十 → 0 |
| 10 | 加 → 与 |
| 10 | 甲 → 乙 |
| 9 | 四 → 4 |
| 9 | 幺 → 一 |
| 9 | 百 → 千 |
| 8 | 。 → , |
| 8 | 洞 → 零 |
| 7 | 五 → 5 |
| 7 | 三 → 二 |
| 7 | 拐 → 七 |
| 6 | 六 → 6 |
| 6 | 千 → 万 |
| 6 | 四 → 三 |
| 6 | 十 → 百 |
| 5 | 九 → 9 |
| 5 | 二 → 两 |
| 5 | 三 → 四 |
| 5 | 生 → 等 |
| 5 | 成 → 于 |
| 5 | 价 → 亚 |
| 4 | 万 → 百 |
Deletions
| Count | Character |
| 38 | 的 |
| 36 | 二 |
| 35 | , |
| 28 | 分 |
| 25 | 一 |
| 24 | 十 |
| 23 | 百 |
| 16 | 在 |
| 16 | (space) |
| 15 | 于 |
| 15 | 数 |
| 14 | 加 |
| 13 | 以 |
| 13 | 三 |
| 13 | 酸 |
| 12 | 个 |
| 12 | 。 |
| 12 | 应 |
| 11 | 时 |
| 11 | 之 |
| 11 | 为 |
| 11 | 生 |
| 11 | 乘 |
| 11 | x |
| 10 | 五 |
| 10 | 号 |
| 10 | 锰 |
| 10 | 离 |
| 10 | 子 |
| 9 | 九 |
Insertions
| Count | Character |
| 47 | 零 |
| 43 | 分 |
| 42 | , |
| 40 | 一 |
| 29 | 反 |
| 28 | 的 |
| 27 | 应 |
| 25 | 为 |
| 24 | 十 |
| 22 | 子 |
| 21 | 个 |
| 21 | 该 |
| 18 | 二 |
| 17 | 百 |
| 16 | 离 |
| 15 | 千 |
| 15 | 锰 |
| 15 | 化 |
| 14 | 1 |
| 14 | 氧 |
| 14 | 0 |
| 11 | 四 |
| 11 | 中 |
| 11 | 乙 |
| 11 | 于 |
| 10 | 和 |
| 10 | 价 |
| 9 | 是 |
| 9 | 六 |
| 9 | x |