ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PaddleSpeech 中文文本正则化 constants 模块解析:全角半角转换表与 NSW 检测正则

PaddleSpeech 中文文本正则化 constants 模块解析:全角半角转换表与 NSW 检测正则 人工智能语音音频【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSpeech点击查看免费下载导读本文围绕 PaddleSpeech项目目录TTS 中文前端中zh_normalization.constants模块展开该模块承载着中文文本正则化Text Normalization最底层的两类基础设施全角/半角字符转换映射表与非标准词NSW, Non-Standard-Word提取正则。读完本文你将掌握 PaddleSpeech 如何把全角字母、数字、标点、空格统一到半角空间如何用一条正则区分有拼音的汉字与需要口播化的特殊符号串并能理解这些常量在 text_normlization.py 中的真实调用关系。一、模块定位中文 TTS 文本前端的地基常量在 PaddleSpeech 的 TTS 流程中原始文本必须先经过前端处理才能送入声学模型与声码器其中一步就是对数字、日期、温度、百分比等非标准词NSW进行口播化verbalization例如把27149读作二七一四九、把62读作百分之六十二。该能力由 zh_normalization 包提供而 constants.py 正是这个包中不依赖任何业务规则的纯常量定义模块被包内的num.py、chronology.py、phonecode.py、quantifier.py等规则模块共同复用。从包结构看zh_normalization内部各文件职责清晰文件职责constants.py全角/半角映射表、NSW 正则RE_NSWchar_convert.py繁体转简体num.py数字、分数、百分数、数值范围等口播规则chronology.py日期、时间、时间范围规则phonecode.py手机号、电话号码规则quantifier.py温度、度量衡单位规则text_normlization.py对外主入口TextNormalizer编排所有规则二、全角/半角转换映射表四组 dict 的实现原理constants.py的第一类常量是全角Full-width与半角Half-width字符的映射表全部以 Pythondict形式定义键值均为 Unicode 码点int因此可以直接配合字符串的str.translate()方法批量转换。import string from pypinyin.constants import SUPPORT_UCS4 # 英文字符全角 - 半角映射表 (num: 52) F2H_ASCII_LETTERS { ord(char) 65248: ord(char) for char in string.ascii_letters } # 英文字符半角 - 全角映射表 H2F_ASCII_LETTERS {value: key for key, value in F2H_ASCII_LETTERS.items()}其核心技巧是利用 Unicode 的编码规律全角字符与对应半角字符的码点差恒为 65248即 0xFF00 − 0x20。因此不需要手工枚举 52 个英文字母只需遍历string.ascii_letters对每个字符码点加 65248 即得到全角形式减去该偏移即取原码点即还原为半角。反向表H2F_*则通过反转正表的键值对生成。模块共定义了四组映射表数量与来源如下映射表覆盖字符数量生成来源F2H_ASCII_LETTERS/H2F_ASCII_LETTERS英文字母大小写52string.ascii_lettersF2H_DIGITS/H2F_DIGITS数字 0–910string.digitsF2H_PUNCTUATIONS/H2F_PUNCTUATIONS标点符号32string.punctuationF2H_SPACE/H2F_SPACE空格U3000 ↔ 普通空格1显式字典其中空格映射没有使用偏移规律而是显式定义F2H_SPACE {\u3000: } # 全角空格中文输入法常见- 半角空格 H2F_SPACE { : \u3000} # 反向映射值得注意标点映射表F2H_PUNCTUATIONS目前虽已定义但在text_normlization.py的主流程中并未被直接调用实际使用的只有字母、数字、空格三张全角→半角表见下文调用链这为后续扩展标点统一处理预留了接口。三、RE_NSW识别非有拼音汉字的 NSW 检测正则第二类常量是RE_NSW用于从文本中提取非标准词——即不属于有拼音的汉字的字符串片段。其设计思路是反向排除法先列出 Unicode 中所有 CJK 汉字区间再取这些区间的补集。正则按运行环境是否支持 UCS-44 字节 Unicode分为两个版本由pypinyin.constants的SUPPORT_UCS4标志决定if SUPPORT_UCS4: RE_NSW re.compile(r(?:[^ r\u3007 # 〇 r\u3400-\u4dbf # CJK扩展A:[3400-4DBF] r\u4e00-\u9fff # CJK基本:[4E00-9FFF] r\uf900-\ufaff # CJK兼容:[F900-FAFF] r\U00020000-\U0002A6DF # CJK扩展B r\U0002A703-\U0002B73F # CJK扩展C r\U0002B740-\U0002B81D # CJK扩展D r\U0002F80A-\U0002FA1F # CJK兼容扩展 r])) else: RE_NSW re.compile( # pragma: no cover r(?:[^ r\u3007 # 〇 r\u3400-\u4dbf # CJK扩展A r\u4e00-\u9fff # CJK基本 r\uf900-\ufaff # CJK兼容 r]))两个版本的正则含义相同匹配连续一段不属于任何汉字区间的字符(?:...)保证连续的非汉字片段被整体捕获。差异仅在于覆盖的汉字范围UCS-4 版本默认分支覆盖 8 个区间〇U3007、CJK 扩展 A、CJK 基本区、CJK 兼容区以及扩展 B/C/D 与兼容扩展区能够覆盖生僻字与增补平面汉字降级版本仅保留前 4 个区间适用于不支持增补平面字符的 Python 构建并用# pragma: no cover标记为不参与覆盖率统计的兜底分支。从正则语义可以推断数字、拉丁字母、标点、空格、全角符号等不需要拼音标注的字符串都会被RE_NSW命中这正是 NSW非标准词需要被单独口播化的目标对象。该常量目前主要作为 NSW 提取工具存在与num.py、phonecode.py等文件中针对数字、电话的细粒度RE_*规则形成互补。四、调用链常量如何进入 normalize_sentence 主流程constants.py的常量并非孤立定义而是被 TextNormalizer.normalize_sentence 在基本字符转换阶段直接使用from .constants import F2H_ASCII_LETTERS from .constants import F2H_DIGITS from .constants import F2H_SPACE # normalize_sentence 内部 sentence tranditional_to_simplified(sentence) # 1. 繁体转简体 sentence sentence.translate(F2H_ASCII_LETTERS).translate( F2H_DIGITS).translate(F2H_SPACE) # 2. 全角-半角整个normalize_sentence的执行顺序体现了规则的优先级设计基础转换繁体转简体char_convert.tranditional_to_simplified 三张全角→半角映射表保证后续正则匹配基于统一字符空间日期时间优先RE_DATE/RE_DATE2、RE_TIME_RANGE/RE_TIME度量与数字温度RE_TEMPERATURE、度量衡replace_measure、分数RE_FRAC、百分数RE_PERCENTAGE、手机号与电话RE_MOBILE_PHONE/RE_TELEPHONE/RE_NATIONAL_UNIFORM_NUMBER、数值范围RE_RANGE、负数/整数/小数/带量词数字收尾后处理_post_replace把/替换为每、~/替换为至、圈号 ①–⑩ 替换为一到十、希腊字母 α–ω 替换为中文读音并过滤特殊符号。其中str.translate()的参数正是constants.py中以码点为键的映射表——这就是常量模块设计成dict[int, int]而非普通字符串替换的深层原因可直接复用于标准库高效批量转换。五、NSW 类型全景constants 支撑的归一化能力RE_NSW所定义的非标准词概念在 zh_normalization 的 README 中有完整示例以下是 PaddleSpeech 支持的 NSW 归一化类型raw → normalizedNSW 类型原始文本归一化结果序列号电影中梁朝伟扮演的陈永仁的编号27149电影中梁朝伟扮演的陈永仁的编号二七一四九基数词这块黄金重达324.75克这块黄金重达三百二十四点七五克数值范围12~23十二到二十三日期她出生于86年8月18日她出生于八六年八月十八日时间等会请在12:05请通知我等会请在十二点零五分请通知我温度今天的最低气温达到-10°C今天的最低气温达到零下十度分数现场有7/12的观众投出了赞成票现场有十二分之七的观众投出了赞成票百分数明天有62的概率降雨明天有百分之六十二的概率降雨金额随便来几个价格12块534.5元随便来几个价格十二块五三十四点五元电话这是固话0421-33441122这是固话零四二一三三四四一一二二这些数字类规则的实现细节如DIGITS零到九的映射、UNITS十百千万亿位权、COM_QUANTIFIERS度量衡量词表位于 num.py其正则全部基于半角数字编写这再次印证了constants.py全角→半角映射在整个正则化管线中的前置作用——必须先统一字符空间数字口播规则才能可靠命中。六、扩展阅读与使用建议若要查看完整规则集合与替换函数可深入 num.py、chronology.py、phonecode.py、quantifier.py对外统一入口是TextNormalizer.normalize(text)返回按句切分并逐句归一化后的句子列表text_normlization.py调用入口通过paddlespeech.t2s.frontend.zh_normalization包的from ... import *对外暴露见init.py。使用限制说明RE_NSW的 UCS-4 分支依赖 Python 构建时的SUPPORT_UCS4标志由pypinyin暴露降级分支无法识别扩展 B 区以外的生僻字在极端文本上可能出现 NSW 提取遗漏。若在自有管线中复用constants.py建议保持与 PaddleSpeech 相同的 Python 环境约束并将全角→半角转换置于所有正则规则之前执行。赞分享人工智能语音音频【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSpeech点击查看免费下载相关推荐PaddleSpeech 中文文本正则化Text Normalization模块源码解析从 NSW 到标准发音文本PaddleSpeech 中文文本正则化Text Normalization模块源码解析从 NSW 到标准发音文本 导读 本文围绕 PaddleSpee人工智能语音音频NLP媒体生成PaddleSpeech 中文文本正则化模块zh_normalization完全指南TTS 前端 NSW 文本规范化实战解析PaddleSpeech 中文文本正则化模块zh_normalization完全指南TTS 前端 NSW 文本规范化实战解析 导读 中文语音合成TTS人工智能语音音频PaddleSpeech 中文文本正则化TextNormalizer解析TTS 前端的 NSW 归一化原理与实战PaddleSpeech 中文文本正则化TextNormalizer解析TTS 前端的 NSW 归一化原理与实战 本篇文章以 PaddleSpeech 仓人工智能语音音频上一篇TradingAgents-CN v1.0.1 使用手册配置管理、单股同步与上游同步实战指南下一篇Backstage v1.24.0-next.0 深度解析新认证服务落地、EventsService 迁移与 Guest 登录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表