Chapter 19: 附录 A:TN / ITN 速查与工程实战手册

本章摘要: 文本规范化(TN)与逆文本规范化(ITN)是 ASR 系统中“最后两公里”的基础设施。本章提供了一份详尽的规则速查表,涵盖中文(普通话/粤语)、英文、混合语境以及特殊符号的处理标准。同时,本章讨论了在工程实现中如何通过正则(Regex)与加权有限状态转换器(WFST)来落地这些规则。


19.0 核心概念:听觉真值 vs 视觉真值

在开始编写规则之前,必须在团队内部统一以下两个概念,否则标注和训练将陷入混乱:

  1. TN (Text Normalization) — 听觉真值 (Auditory Truth) * 场景:ASR 声学模型训练、语言模型(LM)训练。 * 原则所听即所得。将所有非表音字符(数字、符号、缩写)转换为其发音对应的文字。 * 目标:消除歧义。模型不应去“猜” $10 是读 ten dollars 还是 ten bucks,TN 必须确定一种读法。

  2. ITN (Inverse Text Normalization) — 视觉真值 (Visual Truth) * 场景:ASR 最终结果展示、字幕生成、RAG 检索输入。 * 原则符合书写规范。将口语化的文字流还原为符合语法、美观、紧凑的书面形式。 * 目标:可读性与检索性。

| 维度 | 原始文本 (Raw) | TN (训练输入) | ITN (推理输出) | 备注 |

维度 原始文本 (Raw) TN (训练输入) ITN (推理输出) 备注
数字 3D打印 三 D 打 印 3D打印 训练时英文通常大写
日期 2024-01-01 二 零 二 四 年 一 月 一 日 2024年1月1日 ITN 需统一格式
符号 50% 百 分 之 五 十 50% 符号读音顺序往往颠倒
标点 Hello! hello Hello! 训练通常去标点、转小写

19.1 中文(普通话)深度规范速查

中文处理最大的难点在于数字的多音字(一/幺,二/两)以及单位与数字的粘连

19.1.1 数字读法全集 (The "Yi" and "Er" Dilemma)

这是中文 ASR 训练数据的头号杀手。

| 场景 | 数字 | TN (训练读法) | 规则判据 (Rule of Thumb) |

场景 数字 TN (训练读法) 规则判据 (Rule of Thumb)
基数/计数 1, 2 , 默认读法。
数量 (量词前) 2个 两 个 后面紧跟量词(个、只、条、万、亿)。
位读 (ID/电话) 1, 2 , 电话号码、身份证、房间号。注意:2 在号码中通常读 ,极少读
年份 2011 二 零 一 一 年份中的 1 通常读 ,不读
大数 200 两 百 / 二 百 这是一个摇摆区。建议统一规范为 两百,或在数据增广时随机替换。
序数 第2 第 二 前缀为“第”时永远读
小数/分数 0.2, 1/2 零 点 二, 二 分 之 一 小数和分母读

工程实现注记: 在编写 TN 脚本时,无法仅靠正则区分 110 是“报警电话”(幺幺零)还是“房间号”(一一零)还是“数量”(一百一十)。

  • 策略 A:使用 NLP Tagger 标注实体类型,再应用规则。
  • 策略 B:对于模糊情况,保留多种读法生成多条训练数据(Data Augmentation)。

19.1.2 日期与时间的正则化

输入格式极度发散,输出(ITN)必须收敛。

| 类型 | 常见输入格式 | TN (Spoken) | ITN 标准化输出 |

类型 常见输入格式 TN (Spoken) ITN 标准化输出
标准日期 2023-05-04 二零二三年 五月 四日 2023年5月4日
斜杠日期 2023/5/4 二零二三年 五月 四日 2023年5月4日
点号日期 2023.5.4 二零二三年 五月 四日 2023年5月4日
口语日期 月四号 五月 四号 5月4日 (将“号”转“日”)
农历 腊月二十三 腊月 二十三 腊月二十三 (通常不转阿拉伯数字)
时间段 14:00-15:00 十四点 到 十五点 14:00-15:00

19.1.3 货币与计量单位 (Prefix vs Suffix)

中文口语习惯将符号(如 ¥, $)放在数字之后读出单位,书写时却在前面。

| 符号 | 含义 | TN 规则 (Text → Audio) | ITN 规则 (Audio → Text) |

符号 含义 TN 规则 (Text → Audio) ITN 规则 (Audio → Text)
RMB ¥100一百 元 / 一百 块 一百元 / 100元 (推荐) 或 ¥100
**$** Dollar $10十 美元 / 十 刀 十美元$1010美元

19.2 英文(English)深度规范速查

英文 TN 的核心在于非标准词(NSW)的展开大小写(Truecasing)

19.2.1 缩写词的分类处理

必须区分 Acronyms (连读) 和 Alphabetisms (逐字母读)。

| 类型 | 示例 | TN 策略 | 备注 |

类型 示例 TN 策略 备注
Alphabetisms FBI, IBM, USA f b i, i b m, u s a 训练时字母间加空格,防止模型学成单词。
Acronyms NASA, JPEG, ASAP nasa, jay peg, a sap 需维护读音词典 (Lexicon)。
混合型 JPEG2000 jay peg two thousand 需切分后分别处理。
多义缩写 Dr. doctor (Dr. Li) / drive (Mulholland Dr.) 需基于 N-gram 或语法树的上下文判断。
多义缩写 St. saint (St. Paul) / street (Wall St.) 同上。

19.2.2 数字的复杂读法

| 类型 | 文本 | TN 变体 (需覆盖多种情况) | ITN 策略 |

类型 文本 TN 变体 (需覆盖多种情况) ITN 策略
年份 1995 nineteen ninety five 19... 优先按两位分组识别。
年份 2005 two thousand five (含 and 可选) 2000-2009 通常读 thousand
年份 2024 twenty twenty four 2010+ 回归两位分组读法。
电话 0 oh / zero 必须在词表中同时映射 ohzero0
货币 $2.50 two fifty / two dollars and fifty cents ITN 需支持简读还原。
罗马数字 King Henry VIII king henry the eighth 必须展开,否则模型学不到发音。

19.3 多语种混合 (Code-Switching) 实战指南

当一句话中同时出现中文、英文、数字时,分词符(Tokenization)的处理决定了系统的上限。

19.3.1 核心原则:空格策略 (The Spacing Policy)

Golden Rule: 在训练数据中,中英文交界处必须插入空格

  • 错误示例: 我爱Python编程
  • Token 序列可能变成: [我, 爱, P, y, t, h, o, n, 编, 程] (Char-level) 或 [我, 爱, Py, thon, 编, 程] (BPE)。
  • 后果:BPE 切分不稳定,模型难以学习英文单词边界。

  • 正确示例: 我 爱 Python 编 程

  • 处理流程: 1. 将中文汉字按字切分(加空格)。 2. 检测到连续英文字符串,保持为一个单词(或 BPE token),其前后加格。 3. 检测到数字,根据 TN 规则转为汉字或英文单词。

19.3.2 常见混合模式速查

| 原始文本 | TN 处理 (Training Input) | ITN 处理 (User View) | 难点说明 |

原始文本 TN 处理 (Training Input) ITN 处理 (User View) 难点说明
Office 365 office three six five Office 365 产品名中的数字往往一位位读。
Windows 10 windows ten Windows 10 版本号读基数。
WiFi信号 wai fai 信 号 Wi-Fi信号 WiFi 常见读音需映射到规范词 Wi-Fi
App a p p (逐字) / app (单词) App 两种读法在国内都极常见,需双重支持。
C# c sharp C# 不要写成 C井
C++ c plus plus C++ 不要写成 C加加

19.4 粤语(Cantonese)特有规范

粤语涉及三套书写系统的纠缠:口语字、书面语(标准中文)、拼音(Jyutping)。

| 类别 | 例子 | 处理策略 |

类别 例子 处理策略
口语字 (必须保留) (的), (在), (这么) TN: 绝不转为普通话汉字。训练字表必须包含这些字符。


ITN: 除非任务是“粤语翻译”,否则保留口语字。 | | 英粤夹杂 | 我个 file 呢 | TN: 我 个 file 呢 (英文保留原词,不转拼音)。


发音典: 需为 file 标注粤语口音的音素 (如 f aai1 ou4) 或直接用英文音素。 | | 特色词汇 | 士多 (Store), 波士 (Boss) | 作为固定词条处理,不还原为英文。 | | 正字法 (Gotcha) | 里度 vs 呢度 (这里) | 粤语正字法不统一。建议:训练前选定一套标准(如“粤语审音配词字库”),做同义词归一化。 |


19.5 符号与标点:去留的艺术

19.5.1 训练阶段 (TN)

  • 标点符号:通常全部删除。对于长停顿,可以插入 <sil><pause> 标记。
  • 特殊字符+, -, *, / 必须翻译成文字(加、减、乘、除/斜杠)。
  • Emoji: 🥲 通常删除,除做情感分析辅助任务。

19.5.2 推理阶段 (ITN 后)

  • 标点恢复 (Punctuation Restoration):这是一个独立的 NLP 模型(通常是 BERT/Transformer-based)。
  • 处理顺序:ASR Output → ITN (转数字/格式) → Punctuation Model (加标点)。
  • 理由:标点模型通常在规范文本上训练,先做 ITN 把 三点半 变成 3:30 有助于标点模型判断句读。

19.6 专名与热词的冲突处理 (RAG/Biasing)

当结合 MLLM/RAG 时,TN/ITN 可能会破坏检索键值(Key)。

| 冲突场景 | 问题描述 | 解决方案 |

冲突场景 问题描述 解决方案
检索键不匹配 知识库 Key 为 iPhone 14,ASR 识别为 爱疯十四 热词注入:在解码阶段给 iPhone14 加偏置。


模糊检索:RAG 检索时使用拼音或 Embedding 相似度,而非精确匹配。 | | 多音字实体 | 歌手 那英 (Na Ying),ASR 可能把 识别为 na4。 | 强制发音典:在 Lexicon 中强制定义 那英 n a1 y ing1。 | | 术语归一化 | 用户说 k8s,知识库里是 Kubernetes。 | 同义词表 (Synonyms):在 ITN 后挂载一个领域术语映射层。 |


19.7 常见陷阱 (Gotchas) 与调试技巧

  1. “零”的消失与重现 * TN: 101一百零一 (有零)。 * TN: 110一百一十 (无零,虽然有人读一百一)。 * Gotcha: 不同的 TTS 引擎生成的合成数据,对“零”的处理可能不一致,需清洗。

  2. 地址中的数字 * “长安街1号” vs “长安街一号”。 * 建议: 地址类数字通常 ITN 还原为阿拉伯数字,因为便于导航输入。

  3. 负号与连接符 * -5 (负五) vs 3-5 (三到五)。 * 正则技巧: 如果 - 前面有空格或行首,且后面跟数字,大概率是“负”。如果两边都是数字,大概率是“到”或“至”。

  4. 小数点陷阱 * 英文 3.14three point one four。 * 章节 Chapter 3.14three point one four。 * IP地址 192.168.1.1one nine two dot one six eight... (point vs dot)。


19.8 练习题

基础题 (50%)