人工智能语音音频【免费下载链接】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 仓库中的 examples/other/ngram_lm 示例为主线系统讲解如何基于 KenLM 从零训练中文字符级char与词级wordN-gram 语言模型完成文本预处理、ARPA 模型训练、二进制模型量化压缩并最终将模型接入 CTC 束搜索解码作为外部语言模型打分器。读完本文你将掌握一套可直接复跑的中文 N-gram 语言模型构建流程以及 KenLM 评分 API 在语音识别解码中的实际用法。一、示例定位N-gram 语言模型在语音识别中的作用在语音识别ASR系统中声学模型负责将音频映射为字符或子词的候选序列而语言模型LM负责评估候选序列在语言上的合理性。N-gram 语言模型统计前 N-1 个词/字符条件下出现当前词/字符的条件概率是一种轻量、高效、无需 GPU 即可训练的传统统计语言模型。PaddleSpeech 将这一需求封装为独立示例 examples/other/ngram_lm其顶层 README 仅有一句话导航s0 为 KenLM ngram lm真正的技术内容集中在 s0/README.md 及其配套脚本中examples/other/ngram_lm/ ├── README.md # 顶层导航s0 - kenlm ngram lm └── s0/ ├── README.md # 核心说明训练流程与结果展示 ├── run.sh # 三段式stage 0/1/2主流程 ├── path.sh # 环境变量初始化 ├── requirements.txt # jieba 分词依赖 ├── data/ # 训练语料与纠错混淆词典 └── local/ ├── build_zh_lm.sh # 预处理 调 ngram_train.sh ├── download_lm_zh.sh # 下载现成中文 LM └── kenlm_score_test.py # KenLM API 功能验证该示例的产出ARPA 文本模型 .klm.bin二进制模型在仓库中至少有两处直接消费场景一是在 examples/aishell/asr0 的 CTC 束搜索解码配置中作为lang_model_path使用二是在 paddlespeech/s2t/decoders/scorers/ngram.py 中被封装为解码器的 N-gram Scorer。这两条集成路径会在后文详述。二、环境准备安装 KenLM 与 jieba示例要求两套 Python 依赖KenLM语言模型训练lmplz、build_binary命令行工具与推理kenlmPython 包的核心。运行run.sh时会先做检查python3 -c import kenlm; || { echo kenlm package not install!; exit -1; }jieba中文分词器用于词级模型的文本切分也用于评分测试脚本中的按词打分。依赖声明见 examples/other/ngram_lm/s0/requirements.txtjieba0.39此外utils/zh_tn.py 还会用到zhon汉字 Unicode 常量库。在执行前先初始化示例环境见 s0/path.sh. path.sh bash run.shpath.sh的核心作用是export MAIN_ROOTrealpath ${PWD}/../../../../ # 指向仓库根目录 export PATH${MAIN_ROOT}:${MAIN_ROOT}/utils:${PATH} export LC_ALLC export PYTHONIOENCODINGUTF-8 # 规避 LC_ALLC 下的 UnicodeDecodeError export PYTHONPATH${MAIN_ROOT}:${PYTHONPATH} export LD_LIBRARY_PATH/usr/local/lib/:${LD_LIBRARY_PATH}MAIN_ROOT指向仓库根目录后续所有build_zh_lm.sh、ngram_train.sh都会通过它引用仓库 utils 目录下的公共工具脚本PYTHONIOENCODINGUTF-8与LC_ALLC的搭配是为了保证中文语料在管道传输时不出现编码解码异常。三、快速开始run.sh 的三段式流程主流程脚本 s0/run.sh 采用 PaddleSpeech 标准的stage/stop_stage控制范式参数解析由 utils/parse_options.sh 完成共分三个阶段stage内容关键命令0下载现成中文 LM并验证 KenLM 的score/full_scores接口local/download_lm_zh.shlocal/kenlm_score_test.py1训练中文字符级5-gram 模型local/build_zh_lm.sh --order 5 --prune 0 1 2 4 4 ... char2训练中文词级3-gram 模型local/build_zh_lm.sh --order 3 --prune 0 0 0 ... word脚本开头会对 kenlm 做存在性检查并准备产物目录mkdir -p exp cp data/text_correct.txt exp/text训练语料 data/text_correct.txt 为网购咨询类口语短句例如少先队员因该为老人让坐祛痘印可以吗有效果吗每行一句共 200 余行。该文件源自 pycorrector 的测试语料来源说明见 s0/data/README.md同目录的 custom_confusion.txt 是变体→本体的错别字混淆表供后续文本纠错场景参考本示例的训练流程本身并不消费它。如需只跑某一阶段可用 PaddleSpeech 通用的方式指定例如仅训练字符级模型bash run.sh --stage 1 --stop_stage 1四、Stage 0下载现成中文 LM 与 KenLM API 验证4.1 下载 5-gram 中文二进制模型local/download_lm_zh.sh 会从 Paddle 官方对象存储下载一个训练于中文 Gigaword 语料、经过 prune01244 剪枝的字符级 5-gram 二进制模型DIRdata/lm mkdir -p ${DIR} URLhttps://deepspeech.bj.bcebos.com/zh_lm/zh_giga.no_cna_cmn.prune01244.klm MD529e02312deb2e59b3c8686c7966d4fe3 TARGET${DIR}/zh_giga.no_cna_cmn.prune01244.klm下载工具封装在 utils/utility.sh 的download函数中会校验 MD5文件已存在则直接跳过。该模型同时被 ASR 解码示例复用——examples/aishell/asr0/local/download_lm_ch.sh 下载的是同一 URL。4.2 KenLM 评分 API 详解local/kenlm_score_test.py 是理解 KenLM Python 接口的最佳入口它覆盖了四个核心能力1.model.score(sentence)——整句对数概率返回整句的 log10 概率内部自动拼接s与/smodel kenlm.Model(language_model_path) # 加载二进制模型 print(model.score(sentence)) # 未分词的整句 print(model.score(sentence_char_split)) # 字符级切分空格分隔 print(model.score(sentence_word_split)) # jieba 词级切分测试脚本还校验了一个关键行为full_scores返回的条目数应等于空格切分后的 token 数 1即包含句首s状态assert split_size len(sentence_char_split.split()) 1, error split size.2.model.full_scores(sentence)——逐 token 打分full_scores逐 token 返回三元组(log10_prob, ngram_length, is_oov)可用于观察每个字符实际命中了多长的 n-gram 上下文words [s] list(sentence) [/s] for i, (prob, length, oov) in enumerate(model.full_scores(sentence_char_split)): print({0} {1}: {2}.format(prob, length, .join(words[i 2 - length: i 2]))) if oov: print(\t{0} is an OOV.format(words[i 1]))3. OOV词表外检测通过w not in model判断 token 是否在词表中。由于下载的zh_giga.no_cna_cmn.prune01244.klm是字符级模型词级切分后几乎全部成词都会 OOV# 字符级切分下OOV 应为三个特殊字符 assert oov [❗, ️, ], error oov # 词级切分下绝大多数词 OOV盘点、不怕、网站…… assert oov [盘点, 不怕, 网站, ❗, ️, 海淘, 向来, 便宜, 保真, ], error oov4.perplexity(sentence)与 BOS/EOS 控制full_scores(sentence, bosFalse, eosFalse)可以去掉句首/句尾标记此时返回条数与输入 token 数严格相等model.perplexity()计算句子困惑度测试脚本用先救挨饿的人与先就挨饿的人两组同音易混句对比 PPL验证模型对正确写法应给出更低困惑度n model.perplexity(sentence_char_split1) # 先 救 挨 饿 的 人 然 后 治 疗 病 人 。 n model.perplexity(sentence_char_split2) # 先 就 挨 饿 的 人 然 后 治 疗 病 人 。这些接口正是 PaddleSpeech 解码器内部使用 KenLM 的底层依据详见第七节。五、Stage 1 2训练字符级与词级中文 N-gram 模型5.1 参数速查与产物命名规则run.sh中两个 stage 的核心参数如下参数字符级stage 1词级stage 2含义token_typecharword建模粒度order53N-gram 阶数prune0 1 2 4 40 0 0各阶剪枝计数阈值a2222二进制模型指针压缩位数q88概率量化位数b88二值化位数产物文件名把关键超参全部编码进名字便于管理多版本模型text_zh_char_o5_p0_1_2_4_4_a22_q8_b8.arpa text_zh_char_o5_p0_1_2_4_4_a22_q8_b8.arpa.klm.bin text_zh_word_o3_p0_0_0_a22_q8_b8.arpa text_zh_word_o3_p0_0_0_a22_q8_b8.arpa.klm.bin命名规则为输入名_zh_char|word_oorder_pprune_aa_qq_bb.arpa。其中p0_1_2_4_4即prune0 1 2 4 4去掉空格后的紧凑写法含义是 1-gram 剪枝阈值 0、2-gram 阈值 1、3-gram 阈值 2、4-gram 阈值 4、5-gram 阈值 4。5.2 文本预处理zh_tn.pylocal/build_zh_lm.sh 首先调用仓库公共脚本 utils/zh_tn.py 做中文文本正则化Text NormalizationTN 切分python3 ${MAIN_ROOT}/utils/zh_tn.py --token_type ${type} ${text} ${text}.${type}.tnzh_tn.py是一份 1400 余行的中文 TN 实现源自 speechio/chinese_text_normalization负责数字转中文如13斤→十三斤CHINESE_DIGIS、大/小写数字系统、POSITIVE/NEGATIVE/POINT等常量控制转换规则标点归一化基于zhon库的hanzi常量区分离散标点CHINESE_PUNC_STOP如。与非停标点CHINESE_PUNC_NON_STOP统一全半角语气词、儿化音等白名单处理如ER_WHITELIST保护女儿、儿童、托儿所等词不被误切token 级切分--token_type char时逐字以空格分隔输出--token_type word时调用jieba.lcut按词分隔。预处理前后对比取自 s0/README.md 的结果展示 exp/text 少先队员因该为老人让坐 祛痘印可以吗有效果吗 我家宝宝13斤用多大码的 exp/text.char.tn 少 先 队 员 因 该 为 老 人 让 坐 祛 痘 印 可 以 吗 有 效 果 吗 我 家 宝 宝 十 三 斤 用 多 大 码 的 exp/text.word.tn 少先队员 因该 为 老人 让 坐 祛痘 印 可以 吗 有 效果 吗 我家 宝宝 十三斤 用多大码 的可以看到13斤在字符级被展开为十三斤、用多大码在词级被 jieba 整体切分为一个词。切分后的文本才是lmplz的训练输入——KenLM 要求训练语料以空格分隔的 token 序列形式按行输入。5.3 训练与压缩ngram_train.sh预处理完成后build_zh_lm.sh 调用仓库公共脚本 utils/ngram_train.sh 完成建模与二进制化# 1) lmplz从分词文本估计 n-gram 计数并输出 ARPA 格式 lmplz -o ${order} -S ${mem} --prune ${prune} ${text} ${arpa} # 2) build_binary将 ARPA 压缩为 trie 二进制模型 build_binary -a ${a} -q ${q} -b ${b} trie ${arpa} ${lmbin}lmplz参数说明参数默认值作用-o5N-gram 阶数决定上下文长度-S80%训练内存上限可为绝对值如2G或百分比--prune0各阶剪枝阈值计数低于阈值的 n-gram 被丢弃用于控制模型体积与过拟合build_binary参数说明参数默认值作用trie—存储结构trie在内存与速度间取得平衡另有probing可选-a22trie 指针压缩位数值越小模型越小、可能略增查询开销-q8概率量化位数对数概率的存储精度-b8二值化位数实现细节值得注意build_zh_lm.sh虽接收--a/--q/--b参数由 parse_options 解析但脚本内部只把--order/--mem/--prune转发给ngram_train.sh实际生效的是 ngram_train.sh 中的默认值a22、q8、b8恰好与产物文件名a22_q8_b8一致。另外 run.sh 中传给build_zh_lm.sh的写法是--q ${a}值为 22由于该参数不被转发不影响最终结果。读者如自行修改a/q/b期望生效需要同步修改ngram_train.sh的传参链路。5.4 剪枝的意义从结果看参数选择从 s0/README.md 给出的 ARPA 统计可以直观看到剪枝效果。字符级 5-gramprune 0 1 2 4 4\data\ ngram 1587 ngram 2395 ngram 3100 ngram 42 ngram 50而词级 3-gramprune 0 0 0不剪枝\data\ ngram 1689 ngram 21398 ngram 31506两组数字对比明显同样的 200 余行小语料字符级 5-gram 在剪枝后 5-gram 数量被压到 0高阶计数全部低于阈值 44-gram 仅剩 2 条词级 3-gram 不剪枝时 3-gram 高达 1506 条。这解释了示例选择字符 5-gram 配剪枝、词 3-gram 不剪枝的搭配逻辑——字符组合爆炸快必须剪枝控制体积词级在小语料下 3 阶已能覆盖多数上下文。ARPA 文件头部还展示了概率格式log10\1-grams: -3.272324 unk 0 0 s -0.36706257每行格式为log10概率 token [回退权重]unk、s、/s是 KenLM 约定的特殊标记。六、产物解读exp 目录与文件清单按 s0/README.md 展示完整运行run.sh后exp/目录共 7 个文件exp/ ├── text # 原始语料副本 ├── text.char.tn # 字符级 TN 结果 ├── text.word.tn # 词级 TN 结果jieba 分词 ├── text_zh_char_o5_p0_1_2_4_4_a22_q8_b8.arpa # 字符 5-gram ARPA ├── text_zh_char_o5_p0_1_2_4_4_a22_q8_b8.arpa.klm.bin # 字符 5-gram 二进制 ├── text_zh_word_o3_p0_0_0_a22_q8_b8.arpa # 词 3-gram ARPA └── text_zh_word_o3_p0_0_0_a22_q8_b8.arpa.klm.bin # 词 3-gram 二进制README 同时给出了各文件的 MD5 校验值如3ae083627b9b6cef1a82d574d8483f97 exp/text可用于核对产物是否一致。ARPA 文本模型方便人读与二次加工如合并、插值.klm.bin二进制模型体积小、加载快是实际解码时的首选。七、接入 ASR 解码NgramScorer 与解码配置本示例训练的 LM 并非孤立产物PaddleSpeech 已内置完整的消费链路。7.1 解码器侧的 N-gram Scorerpaddlespeech/s2t/decoders/scorers/ngram.py 实现了基于 KenLM 的 N-gram 打分器类图结构为Ngrambase抽象基类持有kenlm.LanguageModel与kenlm.State负责将 PaddleSpeech 词表映射为 KenLM tokeneos映射为/sNgramFullScorer继承BatchScorerInterface对词表全部 token 打分用于全集打分NgramPartScorer继承PartialScorerInterface对候选子集打分用于部分展开。核心打分逻辑在score_partial_中逐 token 维护 KenLM 状态机self.lm kenlm.LanguageModel(ngram_model) state kenlm.State() self.lm.NullContextWrite(state) # 初始化空上下文状态 ... self.lm.BaseScore(state, ys, out_state) # 基于历史状态推进 scores[i] self.lm.BaseScore(out_state, self.chardict[j], self.tmpkenlmstate)它依赖的ScorerInterface见 paddlespeech/s2t/decoders/scorers/scorer_interface.py定义了束搜索中外部打分器长度奖励、神经网络 LM、N-gram LM 等的统一接口契约。也就是说KenLM 在这里以外部打分器身份与声学模型得分融合从而在解码时引入语言先验。7.2 解码配置文件中的使用方式examples/aishell/asr0/conf/tuning/decode.yaml 展示了标准接入配置decode_batch_size: 128 error_rate_type: cer decoding_method: ctc_beam_search lang_model_path: data/lm/zh_giga.no_cna_cmn.prune01244.klm alpha: 2.2 beta: 4.3 beam_size: 500 cutoff_prob: 0.99 cutoff_top_n: 40 num_proc_bsearch: 10其中与本主题直接相关的两个关键项lang_model_path指向 KenLM 二进制模型正是 stage 0 下载或自定义训练的.klm.bin解码时由Ngrambase加载alpha/beta语言模型得分与声学得分的融合权重——alpha为 LM 对数概率的缩放系数beta为句长补偿偏置两者需要在开发集上网格调优。这组配置意味着你完全可以用第五节训练的text_zh_char_o5_p0_1_2_4_4_a22_q8_b8.arpa.klm.bin替换lang_model_path对领域语料定制语言模型从而在特定场景如电商咨询、口语短句获得更贴合的解码先验。decoding_method: ctc_beam_search表明该 LM 主要服务于 CTC 束搜索解码路径。八、参数调优建议与注意事项阶数与语料量匹配小语料建议 3-gram 起步语料达到千万句量级再考虑 5-gram 以上否则高阶 n-gram 大量稀疏需配合剪枝参考 5.4 节的统计对比。剪枝阈值从低阶到高阶递增KenLM 的--prune按1-gram 2-gram ... N-gram顺序给出计数阈值高阶阈值通常设得更高示例字符级0 1 2 4 4即遵循该思路。量化压缩是上线标配build_binary -a 22 -q 8 -b 8是体积与精度的常用平衡点若追求更小体积可尝试-a 21或更低q需在验证集上确认 PPL 与 WER 不显著劣化。预处理一致性至关重要训练侧zh_tn.py的 TN 与切分必须与解码侧的分词/正则化策略保持一致否则 LM 打分时会大量命中 OOV见 4.2 节的 OOV 断言示例。编码环境务必按 s0/path.sh 设置LC_ALLC与PYTHONIOENCODINGUTF-8避免中文语料在 shell 管道中出现编码错误。九、小结通过 examples/other/ngram_lm 示例PaddleSpeech 提供了一条从原始中文文本到可部署语言模型的完整流水线zh_tn.py负责文本正则化与 char/word 切分 →lmplz负责 N-gram 计数与剪枝并输出 ARPA →build_binary负责量化为 trie 二进制 → KenLM Python APIscore/full_scores/perplexity负责推理验证 → 最终经 ngram.py 的NgramFullScorer/NgramPartScorer接入 CTC 束搜索解码或直接填入 decode.yaml 的lang_model_path使用。掌握这条链路即可为任意中文领域语料定制轻量语言模型为 ASR 解码引入领域语言先验。赞分享人工智能语音音频【免费下载链接】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 N-Gram 语言模型实战基于 KenLM 训练中文字符级与词级 LM 全流程PaddleSpeech N Gram 语言模型实战基于 KenLM 训练中文字符级与词级 LM 全流程 本指南以 PaddleSpeech 仓库中的 exa人工智能语音音频NLP媒体生成PaddleSpeech N-gram 语言模型训练实战基于 KenLM 构建中文 n-gram LMPaddleSpeech N gram 语言模型训练实战基于 KenLM 构建中文 n gram LM 本指南以 PaddleSpeech 仓库中 examp人工智能语音音频NLP媒体生成LivePortrait 2024-07-10 更新详解音视频合成、驱动视频自动裁剪与运动模板实战LivePortrait 2024 07 10 更新详解音视频合成、驱动视频自动裁剪与运动模板实战 LivePortrait 在 2024 07 10 发布了人工智能语音音频NLP媒体生成上一篇告别繁琐配置NAS-Tools与Synology DSM深度集成指南下一篇VAR模型部署到边缘设备TensorRT INT8量化实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
给 2013 年的老 Mac 装 Sonoma:OpenCore Legacy Patcher 完整实操指南 给 2013 年的老 Mac 装 Sonoma:OpenCore Legacy Patcher 完整实操指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher
如果你的 MacBook 在"… · 2026/9/25 3:14:39
动态规划(DP)算法实战指南:从状态定义到状态转移的完整解题框架 教程 【免费下载链接】Learn-Algorithms 算法学习笔记 项目地址: https://gitcode.com/gh_mirrors/le/Learn-Algorithms 点击查看 免费下载 动态规划(Dynamic Programming,DP)是算法学习中最重要也最考验思维的算法设计范式之一。… · 2026/9/25 3:14:39
Swift Package Manager 的 Platform 平台枚举全解析:从预定义平台到自定义扩展 开发工具构建工具 【免费下载链接】swift-package-manager The Package Manager for the Swift Programming Language 项目地址: https://gitcode.com/gh_mirrors/sw/swift-package-manager 点击查看 免费下载 在 Swift Package Manager 中,PackageDesc… · 2026/9/25 3:14:39
ng-zorro-antd Checkbox 禁用机制解析:nzDisabled、表单联动与 CSS 降级实现 UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 本文以 ng-zorro-antd 中 Checkbox 组件的"不可用(Disabled&#x… · 2026/9/25 3:14:33
ipatool:3条命令从App Store下载IPA ipatool:3条命令从App Store下载IPA 【免费下载链接】ipatool Command-line tool that allows you to search for iOS, iPadOS, tvOS, visionOS, and macOS apps on the App Store, and download .ipa or macOS .pkg app packages. 项目地址: https://gitcode.com… · 2026/9/25 3:14:33
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37