ARTICLE DETAIL

资讯详情

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

PaddleSpeech 文本正则化(Text Normalization)实战指南:原理、测试流程与 CER 评估

PaddleSpeech 文本正则化(Text Normalization)实战指南:原理、测试流程与 CER 评估 人工智能语音音频NLP媒体生成【免费下载链接】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/paddlepaddle/PaddleSpeech点击查看免费下载文本正则化Text Normalization简称 TN是语音合成TTS与语音识别ASR链路中不可或缺的前置环节它负责将口语文本中出现的数字、日期、时间、百分比、电话号码、金额等非标准词Non-Standard WordNSW转换为适合发音的书面表达。本指南以 PaddleSpeech 仓库中的 examples/other/tn/README.md 为核心文档完整讲解其测试数据格式、两阶段测试流程、底层TextNormalizer的实现规则以及基于 CER字符错误率与 sclite 的评估方法。读完本文你将掌握如何运行 TN 评测、如何解读评测报告并能从源码层面理解每条归一化规则的生效机制。一、什么是文本正则化为什么 TTS/ASR 需要它在中文语音合成中模型期望输入的是「怎么说」而不是「怎么写」。例如用户提供的文本是「今天的最低气温达到 -10°C」如果直接送入合成前端模型会尝试逐字符朗读「-10°C」而正确的读音应当是「零下十度」。文本正则化正是完成这类「书面符号 → 可发音文本」转换的模块。从源码结构看PaddleSpeech 将中文 TN 能力实现为独立子包 paddlespeech/t2s/frontend/zh_normalization/其中text_normlization.py 提供核心类TextNormalizer对外入口为normalize_sentence与normalizenum.py 负责数字类规则整数、小数、分数、百分数、量词、数值范围chronology.py 负责日期与时间类规则phonecode.py 负责手机号与固话规则quantifier.py 负责温度与度量单位规则char_convert.py 负责繁简体转换constants.py 定义全角/半角字符映射常量。examples/other/tn目录则是这套能力的独立评测示例它不依赖任何模型只验证文本正则化本身的准确性因此非常适合作为理解 TN 行为、回归验证规则质量的入口。二、测试数据格式以|分隔的「原始文本 | 标准文本」对TN 评测的数据文件位于 examples/other/tn/data/textnorm_test_cases.txt。该文档明确约定使用|作为 raw_data 与 normed_data 的分隔符即每行格式为原始文本raw_data| 归一化文本normed_data文件共 127 行测试用例覆盖了文档与源码中定义的全部 NSW 类型。部分典型样例原始文本归一化文本覆盖的 NSW 类型今天的最低气温达到-10°C.今天的最低气温达到零下十度.温度含负数现场有7/12的观众投出了赞成票现场有十二分之七的观众投出了赞成票分数1945年5月2日苏联士兵在德国国会大厦上升起了胜利旗一九四五年五月二日苏联士兵在德国国会大厦上升起了胜利旗日期等会请在12:05请通知我等会请在十二点零五分请通知我时间明天有62%的概率降雨明天有百分之六十二的概率降雨百分数这是固话0421-33441122这是固话零四二一三三四四一一二二电话这是手机86 18544139121这是手机八六一八五四四一三九一二一手机号您的帐户当前可用余额为63.89元您的帐户当前可用余额为六十三点八九元金额/小数12~23十二到二十三数值范围25cm²二十五平方厘米度量单位1234个人一千二百三十四个人数词 量词10076一零零七六编号逐位朗读值得注意的是测试集中还包含若干语义边界用例例如「不管三七二十一」与「九九八十一难」这类成语中的数字不应被改写为其他表达保持原样即为正确输出说明 TN 规则必须依赖上下文正则匹配而非简单的全局替换。三、两阶段测试流程数据预处理 归一化评测整个评测流程由 examples/other/tn/run.sh 串联分为两个 Python 阶段最后再用 sclite 输出详细报告。3.1 阶段一get_textnorm_data.py 将测试文件拆分为评测所需格式examples/other/tn/get_textnorm_data.py 读取测试用例文件按|拆分后写入两个文件python3 get_textnorm_data.py --test-filedata/textnorm_test_cases.txt --output-dirdata/textnorm输入参数--test-file原始测试用例文件默认data/textnorm_test_cases.txt输出参数--output-dir输出目录默认data/textnorm。脚本为每条用例生成形如utt_0、utt_1的流水号 ID并写出两个文件data/textnorm/text每行utt_ID 原始文本作为待归一化的输入data/textnorm/text.ref每行utt_ID 标准文本作为评测参考ground truth。3.2 阶段二test_textnorm.py 调用 TextNormalizer 并计算 CERexamples/other/tn/test_textnorm.py 是本评测的核心脚本python3 test_textnorm.py --input-dirdata/textnorm --output-direxp/textnorm--input-dir阶段一生成的预处理数据目录默认data/textnorm--output-dir结果输出目录默认exp/textnorm。脚本的关键调用链如下test_textnorm.pyfrom paddlespeech.t2s.frontend.zh_normalization.text_normlization import TextNormalizer from paddlespeech.t2s.utils.error_rate import char_errors它实例化TextNormalizer()对每条原始文本调用text_normalizer.normalize_sentence(raw_text)得到归一化结果然后通过char_errors(gt_text, textnorm_text)计算编辑距离与参考长度。两个细节值得注意脚本定义了del_en_add_space函数test_textnorm.py用正则[a-zA-Z]删除文本中的英文字母并为每个汉字后加空格。其目的有两个一是把英文单词从 CER 统计中剔除因为中文 TN 规则不负责翻译英文例如用例「for english severice press star key」保持原样二是把汉字切分为字符序列便于按字符粒度计算编辑距离。平均 CER 的计算公式为test_textnorm.pyavg_cer 总编辑距离之和 / 总参考长度之和即sum(edit_distances) / sum(ref_lens)属于加权平均而非简单平均。char_errors的实现位于 paddlespeech/t2s/utils/error_rate.py它在字符级上计算参考序列与假设序列之间的 Levenshtein 编辑距离返回(编辑距离, 参考长度)二元组。同时脚本会把参考文本与归一化结果分别写入exp/textnorm/text.ref.clean与exp/textnorm/text.tn供后续 sclite 使用。四、底层原理TextNormalizer 的归一化规则流水线TN 的全部规则逻辑集中在TextNormalizer.normalize_sentencetext_normlization.py。整个流程按固定顺序执行多组正则替换顺序本身即是规则设计的一部分——先处理更长、更特殊的模式如日期、时间范围再处理通用数字模式以避免更宽泛的正则提前吃掉匹配片段。4.1 字符基础转换繁简体与全半角首先执行三个基础转换sentence tranditional_to_simplified(sentence) sentence sentence.translate(F2H_ASCII_LETTERS).translate(F2H_DIGITS).translate(F2H_SPACE)tranditional_to_simplified来自 char_convert.py完成繁体到简体映射F2H_ASCII_LETTERS、F2H_DIGITS、F2H_SPACE来自 constants.py把全角字母、全角数字、全角空格转换为半角为后续基于 ASCII 数字/符号的正则匹配铺路。4.2 按类型逐类替换的 NSW 规则随后依次执行顺序见 text_normlization.py顺序规则正则来源典型效果1日期chronology.py的RE_DATE/RE_DATE21995年3月1日 → 一九九五年三月一日2时间含范围chronology.py的RE_TIME_RANGE/RE_TIME12:05 → 十二点零五分3温度quantifier.py的RE_TEMPERATURE-10°C → 零下十度4度量单位quantifier.py的replace_measure25cm² → 二十五平方厘米5分数num.py的RE_FRAC7/12 → 十二分之七6百分数num.py的RE_PERCENTAGE62% → 百分之六十二7手机号phonecode.py的RE_MOBILE_PHONE86 18544139121 → 八六一八五四四一三九一二一8固话/全国统一号码phonecode.py的RE_TELEPHONE/RE_NATIONAL_UNIFORM_NUMBER0421-33441122 → 零四二一三三四四一一二二9数值范围num.py的RE_RANGE12~23 → 十二到二十三10负整数num.py的RE_INTEGER-15 → 负十五11小数num.py的RE_DECIMAL_NUM324.75 → 三百二十四点七五12正整数 量词num.py的RE_POSITIVE_QUANTIFIERS1234个人 → 一千二百三十四个人13无符号编号数字num.py的RE_DEFAULT_NUM10076 → 一零零七六逐位朗读14通用数字num.py的RE_NUMBER兜底处理其余数字4.3 后置替换与特殊符号清理最后执行_post_replacetext_normlization.py处理两类内容符号级替换/→ 每如 400米/秒 场景、~与→ 至、圈号①~⑩→ 一~十、希腊字母 α~Ω → 阿尔法~欧米伽特殊字符过滤用正则清理-、《》、【】、{}、、#、、、_、|、…、\等不适合直接朗读的符号。4.4 长文本切分对外提供的normalize方法text_normlization.py会先用SENTENCE_SPLITOR匹配、。等句读符号把长文本切成句子再逐句调用normalize_sentence保证规则在小粒度语句上稳定生效。此外纯中文场景下_split还会先移除空格并过滤——、《》、【】、、{}、()、#“”^_|…\等字符text_normlization.py。4.5 支持的 NSW 类型总览t2s 前端 zh_normalization 的 README 汇总了当前支持的 NSW 类型与示例包括编号serial number、基数词cardinal、数值范围numeric range、日期date、时间time、温度temperature、分数fraction、百分数percentage、金额money、电话telephone。该规则集的设计参考了 PaddlePaddle DeepSpeech 项目的相关实现详见该 README 的 References 说明。五、安装 sclite 并运行评测文档给出的启动方式需要先在仓库根目录下安装评测工具 sclite再执行评测脚本。在examples/other/tn目录下依次运行cd ../../../tools bash extras/install_sclite.sh cd - ./run.sh命令含义拆解cd ../../../tools从examples/other/tn三级向上进入仓库根目录下的 tools 目录注意该相对路径以示例目录为起点bash extras/install_sclite.sh安装 SCTKNIST 语音识别评分工具包对应脚本位于 tools/extras/install_sclite.sh安装产物位于${MAIN_ROOT}/tools/sctkcd -切回examples/other/tn./run.sh执行完整评测。run.sh的执行逻辑examples/other/tn/run.shsource path.sh加载环境其中 path.sh 会设置MAIN_ROOT仓库根目录、扩展PATH与PYTHONPATH并强制LC_ALLC、PYTHONIOENCODINGUTF-8以保证中文在 Python 与 bash 间传递时不出现编码错误依次运行阶段一数据拆分与阶段二归一化 CER 计算若USE_SCLITEtrue默认开启调用 sclite 做详细错误分析${MAIN_ROOT}/tools/sctk/bin/sclite -i wsj -r ./exp/textnorm/text.ref.clean trn -h ./exp/textnorm/text.tn trn -e utf-8 -o all-i wsj输入格式为 WSJ 风格每行文本(utt_ID)-r ... trn参考文件clean 版参考文本-h ... trn假设文件归一化输出-e utf-8指定 UTF-8 编码保证中文正确统计-o all输出全部统计报告文件。六、结果解读CER 与 sclite 报告6.1 平均 CER文档记录的当前基线结果为The avg CER of text normalization is: 0.00730093543235227即在这 125 条可评测用例、共 2254 个参考字符上归一化输出的平均字符错误率约为0.73%。由于test_textnorm.py中先删除了英文字母再统计该指标反映的是纯中文 TN 规则的稳定性约 99.27% 的字符处理结果与标准答案完全一致。6.2 sclite 明细报告sclite 输出的汇总表如下取自文档原文,-----------------------------------------------------------------. | | # Snt # Wrd | Corr Sub Del Ins Err S.Err | |---------------------------------------------------------------| | Sum/Avg| 125 2254 | 99.4 0.1 0.5 0.2 0.8 4.8 | -----------------------------------------------------------------各列含义# Snt句子用例总数 125# Wrd参考字符总数 2254Corr正确率99.4%即 99.4% 的字符被正确归一化Sub替换率0.1%即 0.1% 的字符被错误替换Del删除率0.5%即 0.5% 的参考字符未被输出Ins插入率0.2%即多输出了 0.2% 的多余字符Err总错误率0.8%由 Sub Del Ins 累加得到0.1 0.5 0.2 0.8S.Err句子错误率4.8%即约 4.8% 的用例中存在至少一个字符错误。CER 为 0.73%而 sclite 的 Err 为 0.8%两者略有差异这是因为二者统计口径不同test_textnorm.py的 CER 按「总编辑距离 / 总参考长度」加权计算而 sclite 的汇总表按字符相对比例展示。6.3 典型错误来源分析结合测试用例与规则实现可以推断当前 CER 主要来自几类边界场景以下为基于源码与用例结构的推断非官方结论英文与中文混排如「M1 芯片」「iPad Pro 12.9」「5G」等用例del_en_add_space会删除英文字母但数字如 12.9仍参与比较若归一化结果与答案不完全一致则会计入误差量词上下文歧义如「123加456」→「一百二十三加四百五十六」依赖RE_POSITIVE_QUANTIFIERS之后还能继续匹配加法表达式这类组合规则对边界敏感方言式口语表达如「不管三七二十一」「九九八十一难」要求规则识别成语而保持原样属于典型的「不该动就不动」约束。七、将 TN 接入实际 TTS 流程examples/other/tn是独立评测入口而 TN 在生产环境中的角色是 TTS 前端的一部分。在 PaddleSpeech 中TextNormalizer被封装在 paddlespeech/t2s/frontend/ 前端组件里TTS 推理时会先对输入文本做正则化再经过分词、音素转换等步骤送入声学模型。因此本评测得到的 CER 可以视为「前端文本处理质量」的量化指标——它不涉及声学模型与声码器能够单独定位文本侧的错误是调试 TTS 前端规则、回归验证规则修改效果的最小闭环。八、小结TN 评测使用 data/textnorm_test_cases.txt 中的 127 条用例以|分隔原始文本与标准文本评测通过get_textnorm_data.py数据拆分→test_textnorm.py归一化 CER 计算→ sclite明细报告三个阶段完成入口脚本为 run.sh核心能力由 TextNormalizer 提供覆盖日期、时间、温度、分数、百分数、电话、金额、范围、量词等十余类 NSW 规则当前基线 avg CER 为 0.0073约 0.73%sclite 汇总显示 99.4% 的字符正确率与 0.8% 的总错误率可作为后续规则修改的对比基准。如果读者希望深入某条规则的具体正则实现建议按类型阅读 num.py、chronology.py、phonecode.py 与 quantifier.py并结合测试用例逐条验证是理解中文 TN 规则工程化落地的最佳路径。赞分享人工智能语音音频NLP媒体生成【免费下载链接】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/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐如何高效管理网盘资源百度网盘批量转存工具完全指南如何高效管理网盘资源百度网盘批量转存工具完全指南 你是否曾经面对数十个百度网盘分享链接只能一个个手动复制、粘贴、输入提取码、点击转存这种重复劳动不仅耗时耗人工智能语音音频PaddleSpeech 中文 TTS 文本规范化Text Normalization实现原理与使用指南PaddleSpeech 中文 TTS 文本规范化Text Normalization实现原理与使用指南 本文围绕 PaddleSpeech TTS 前端中人工智能语音音频NLP媒体生成Chat2DB 上手指南:把 40 种数据库收进一个免费 AI 工作台Chat2DB 上手指南:把 40 种数据库收进一个免费 AI 工作台 周五下午,你要在一个项目里同时查 MySQL 的表结构、看 Redis 里的缓存键,还人工智能语音音频上一篇NS-USBLoader终极指南3步搞定Switch游戏传输与系统破解下一篇Krokiet一键清理重复文件快速释放磁盘空间创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表