实战指南:用Python搞定中文语音合成的文本归一化(附WeTextProcessing代码)
在构建中文语音合成系统时,开发者常会遇到一个看似简单却影响深远的问题:如何让TTS引擎正确读出"2024年GDP增长5.2%"这样的文本?数字、日期、货币等非标准文本的规范化处理,直接决定了合成语音的专业度和自然感。本文将带你用Python打造工业级的中文文本归一化方案,重点解决TTS场景下的特殊文本转换难题。
1. 文本归一化的核心挑战
中文文本中存在大量需要特殊处理的非标准词汇(NSW),主要包括以下几类:
- 数字类:基数词("123")、序数词("第1")、分数("1/2")、百分比("5.2%")
- 时空表达:日期("2024-01-01")、时间("14:30")、持续时间("2小时30分")
- 计量单位:货币("¥100")、温度("36.5°C")、尺寸("5x7cm")
- 特殊序列:电话号码("10086")、车牌号("京A12345")、身份证号
这些文本如果直接送入TTS引擎,通常会产生不符合预期的读音。例如:
# 错误读音示例
"2024-01-01" → "二零二四杠零一杠零一" # 期望:"二零二四年一月一日"
"¥100" → "人民币符号一百" # 期望:"一百元"
更复杂的是,同一数字在不同语境下读音规则不同:
"房间号201" → "二零一"
"201路公交车" → "二零一"
"201不锈钢" → "二零一" # 行业特殊读法
2. WeTextProcessing实战配置
WeTextProcessing是当前中文TTS领域使用最广泛的文本归一化工具,基于Pynini的加权有限状态转换器(WFST)实现。以下是完整安装指南:

&spm=1001.2101.3001.5002&articleId=155049445&d=1&t=3&u=899d89ab96044b579e3585f1a74a7a80)
1780

被折叠的 条评论
为什么被折叠?



