SpeechBrain 实战:为 CommonVoice 训练 KenLM n-gram 语言模型并提升 Wav2Vec2 解码性能
SpeechBrain 实战为 CommonVoice 训练 KenLM n-gram 语言模型并提升 Wav2Vec2 解码性能【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain导读本篇文章基于 SpeechBrain 仓库中的 recipes/CommonVoice/LM 配方完整讲解如何为 Mozilla CommonVoice 数据集训练 KenLM n-gram 语言模型并将其与已微调的 Wav2Vec2 ASR 模型结合通过 CTC 束搜索beam search显著降低词错误率WER。读完本文你将掌握从安装 KenLM 依赖、构建 n-gram 语料、编写超参数配置到最终在解码阶段接入.arpa语言模型文件的完整实战链路。一、背景为什么 Wav2Vec2 需要 n-gram 语言模型SpeechBrain 在 CommonVoice 上的 CTC 配方recipes/CommonVoice/ASR/CTC/README.md验证了一个重要结论将 Wav2Vec2 与语言模型结合使用可以带来显著的性能提升尤其是当模型在较小的语音数据集上微调时。其原理是纯 CTC 解码只依赖声学模型输出的字符/子词概率缺乏语言先验而 n-gram 语言模型能够在束搜索过程中为更像自然语言的假设路径加分从而纠正声学模型的拼写级错误。在 CommonVoice 实验中SpeechBrain 使用训练集转写文本训练出的 5-gram 模型在英语测试集上将 WER 从无 LM 时的水平进一步压低如 5-gram 加持下英语验证集 WER 10.79 / 测试集 11.37见 ASR/CTC README 结果表。注意对于中文zh-CN由于词的概念不明确该配方改用字符错误率CER评估且不使用 5-gram 语言模型。本 LM 配方即为此目的而设计它读取 CommonVoice 训练集的转写文本用 KenLM 训练 n-gram 模型输出为业界标准的 ARPA 格式可直接被 SpeechBrain 的 CTC 束搜索解码器加载。二、配方文件结构本配方位于 recipes/CommonVoice/LM共四个文件文件作用train.py主训练脚本解析超参数、准备数据、调用lmplz训练 n-gram、修复 ARPA 文件中缺失的/s符号hparams/train_kenlm.yaml超参数配置语言、数据路径、文本路径、gram 阶数等common_voice_prepare.py数据准备脚本与 recipes/CommonVoice/common_voice_prepare.py 同源将.tsv标注转换为 SpeechBrain 使用的 CSV 格式README.md使用说明即本文依据需要说明的是该配方没有独立的extra_requirements.txt文件README 中提到的pip install -r extra_requirements.txt是指 KenLM 的 Python 绑定等额外依赖具体安装方式见下文。三、环境准备安装 KenLM 及依赖KenLM 是一个用 C 编写的高效 n-gram 语言模型工具库其命令行程序lmplz负责从纯文本语料统计并训练 n-gram 模型。安装分三步1. 安装 Ubuntu 系统依赖sudo apt install build-essential cmake libboost-system-dev libboost-thread-dev libboost-program-options-dev libboost-test-dev libeigen3-dev zlib1g-dev libbz2-dev liblzma-dev这些包分别提供编译工具链build-essential、cmake、Boost 库KenLM 依赖的线程/程序选项/测试组件、Eigen3 线性代数库以及 zlib/bz2/lzma 压缩支持。完整依赖说明可参考 KenLM 官方依赖指南https://kheafield.com/code/kenlm/dependencies/。2. 下载并解压 KenLM 源码wget -O - https://kheafield.com/code/kenlm.tar.gz | tar xz3. 使用 CMake 编译二进制KenLM 使用 C 编写通过 CMake 构建mkdir kenlm/build cd kenlm/build cmake .. make -j2-j2指定 2 个并行编译任务可根据机器 CPU 核数调大。4. 将可执行文件加入 PATHlmplz、build_binary等可执行文件位于kenlm/build/bin需要将其加入环境变量用文本编辑器打开~/.bashrc在文件末尾追加一行替换为自己的实际路径export PATH$PATH:/your/path/to/kenlm/build/bin保存后执行source ~/.bashrc使配置生效提示KenLM 的 Python 绑定供解码阶段加载模型使用可通过pip install https://github.com/kpu/kenlm/archive/master.zip安装见 speechbrain/decoders/ctc.py 中的安装提示。四、超参数配置详解hparams/train_kenlm.yaml 是训练的核心配置使用 SpeechBrain 的 HyperPyYAML 语法!ref引用变量、!PLACEHOLDER标记必填占位符# Seed needs to be set at top of yaml, before objects with parameters are made seed: 1986 __set_seed: !apply:speechbrain.utils.seed_everything [!ref seed] output_folder: !ref results/CommonVoice/ngrams/language/seed # Data files data_folder: !PLACEHOLDER # e.g, /localscratch/cv-corpus-14.0-2023-06-23/en train_tsv_file: !ref data_folder/train.tsv language: en # accented_letters should be set according to the language accented_letters: True train_csv: !ref output_folder/train.csv skip_prep: False text_file: !ref output_folder/train.txt ngram: 5 ngram_file: !ref output_folder/language_ngramgram.arpa各参数含义参数默认值说明seed1986随机种子通过speechbrain.utils.seed_everything保证可复现output_folderresults/CommonVoice/ngrams/language/seed输出目录含中间 CSV、txt 语料与最终 ARPA 模型data_folder必填占位符CommonVoice 数据根目录需包含语言子目录如cv-corpus-14.0-2023-06-23/entrain_tsv_filedata_folder/train.tsvCommonVoice 官方训练标注文件Tab 分隔languageen语言代码决定文本规范化规则见第六节accented_lettersTrue是否保留带重音字母False时会将重音字母转成最近的非重音形式train_csvoutput_folder/train.csv数据准备阶段生成的 CSV含wrd转写列skip_prepFalse为True时跳过数据准备语料已存在时加速text_fileoutput_folder/train.txt供lmplz训练的纯文本语料每行一句ngram5n-gram 阶数CommonVoice 实验中使用 5-gramngram_fileoutput_folder/language_ngramgram.arpa输出的 ARPA 格式模型路径如en_5gram.arpa五、运行训练确保数据就绪后CommonVoice 数据集需先从commonvoice.mozilla.org/en下载在 recipes/CommonVoice/LM 目录下执行python train.py hparams/train_kenlm.yaml --data_folderyour/data/folder--data_folder通过 HyperPyYAML 的命令行覆盖机制sb.parse_arguments直接覆盖配置中的!PLACEHOLDER无需修改 YAML 文件。训练流程拆解脚本 train.py 的执行逻辑清晰共五步第 1 步解析超参数并创建实验目录hparams_file, run_opts, overrides sb.parse_arguments(sys.argv[1:]) with open(hparams_file, encodingutf-8) as fin: hparams load_hyperpyyaml(fin, overrides) sb.create_experiment_directory( experiment_directoryhparams[output_folder], hyperparams_to_savehparams_file, overridesoverrides, )第 2 步数据准备仅主进程执行兼容 DDPif not os.path.exists(hparams[text_file]): run_on_main( prepare_common_voice, kwargs{ data_folder: hparams[data_folder], save_folder: hparams[output_folder], train_tsv_file: hparams[train_tsv_file], accented_letters: hparams[accented_letters], language: hparams[language], skip_prep: hparams[skip_prep], }, ) csv2text()prepare_common_voice来自 recipes/CommonVoice/common_voice_prepare.py负责将train.tsv转换为 CSV并执行文本清洗详见第六节。run_on_main保证多卡DDP环境下只在主进程执行一次避免数据重复准备。第 3 步CSV 转纯文本语料csv2text()读取train.csv定位wrd列把每条转写按行写入train.txtdef csv2text(): annotation_file open(hparams[train_csv], newline, encodingutf-8) reader csv.reader(annotation_file) headers next(reader, None) text_file open(hparams[text_file], w, encodingutf-8) index_label headers.index(wrd) for row in reader: sent row[index_label] text_file.write(sent \n)第 4 步调用lmplz训练 n-gramtmp_ngram_file ngram.arpa cmd flmplz -o {hparams[ngram]} {hparams[text_file]} {tmp_ngram_file} os.system(cmd)lmplz -o 5表示训练 5-gram 模型输入语料来自train.txt原始输出暂存到ngram.arpa。第 5 步修复 ARPA 文件中的/s符号这是本配方一个值得注意的实现细节lmplz默认只写出s起始符而 SpeechBrain 的束搜索解码需要/s结束符来正确截断假设。脚本遍历 ARPA 文件在ngram 1计数行上把 unigram 数量 1并在首个s条目后追加一个等概率的/s条目with open(tmp_ngram_file, encodingutf-8) as read_file, open( hparams[ngram_file], w, encodingutf-8 ) as write_file: has_added_eos False for line in read_file: if not has_added_eos and ngram 1 in line: count line.strip().split()[-1] write_file.write(line.replace(f{count}, f{int(count) 1})) elif not has_added_eos and s in line: write_file.write(line) write_file.write(line.replace(s, /s)) has_added_eos True else: write_file.write(line) os.remove(tmp_ngram_file)最终模型写入ngram_file指定路径如en_5gram.arpa临时文件被清理。训练日志会输出模型路径5-gram kenlm model was built and saved in results/CommonVoice/ngrams/en/1986/en_5gram.arpa.六、语言相关的文本规范化n-gram 语料质量直接影响模型效果。prepare_common_voice在生成 CSV 时会根据language参数执行语言特定的预处理common_voice_prepare.py英语/法语/意大利语/基尼亚卢旺达语en/fr/it/rw过滤掉字母、数字与重音字符之外的符号并统一转为大写德语de特殊处理ß先替换为占位符再upper()避免 Python 的upper()把ß变成SS导致信息丢失法语fr额外处理L、D、J等粘连撇号与AUJOURDHUI等复合词阿拉伯语ar/波斯语fa使用各自字母表白名单过滤爱尔兰语ga-IE采用复杂的大小写规则upper()不确定改用小写加前缀规则西班牙语es修复数据集中$符号导致的键错误将$替换为s。此外若accented_lettersFalse还会通过 Unicode NFD 规范化剥离重音strip_accents并将、’替换为空格。这些规则保证了进入lmplz的语料干净、一致避免 OOV词表外词噪声。七、将 n-gram 模型接入 CTC 束搜索解码训练好的 ARPA 模型要与 ASR 系统结合需要在 CTC 配方的解码配置中启用 KenLM。以 recipes/CommonVoice/ASR/CTC/hparams/train_en_with_wav2vec.yaml 为例test_beam_search: blank_index: !ref blank_index beam_size: 100 beam_prune_logp: -12.0 token_prune_min_logp: -1.2 prune_history: False topk: 1 alpha: 1.0 beta: 0.5 # To use n-gram LM for decoding, follow steps in README.md. # kenlm_model_path: none接入步骤见 ASR/CTC README取消注释test_beam_search中的kenlm_model_path一行将其值设置为上一步训练出的 ARPA或build_binary转换的.bin文件路径。在源码层面speechbrain/decoders/ctc.py 中的CTCBeamSearcher接收kenlm_model_path参数文档注释明确说明kenlm_model_path : str, optional— The path to the kenlm model.Use .bin for a faster loading.也就是说若希望解码时加载更快可先用 KenLM 的build_binary工具将.arpa转为二进制.bin格式。kenlm_model通过 Python 绑定kenlm.Model(kenlm_model_path)加载当传入.arpa时会进一步调用load_unigram_set_from_arpa提取 unigram 集合ctc.py。其他束搜索参数的作用参数值说明beam_size100束宽越大搜索越充分但越慢beam_prune_logp-12.0束内剪枝的 log 概率阈值token_prune_min_logp-1.2单 token 剪枝阈值alpha1.0LM 权重对数域插值系数beta0.5长度惩罚系数八、结果与产出物训练完成后输出目录results/CommonVoice/ngrams/language/seed/包含train.csvSpeechBrain 格式的训练标注含ID, duration, wav, spk_id, wrd五列train.txt逐句转写纯文本语料language_ngramgram.arpa最终 n-gram 模型ARPA 格式即解码所需的产物。仓库 ASR/CTC README 结果表 展示了该 5-gram 模型在英语2024-01-05 版 CommonVoice上取得的验证集 WER 10.79、测试集 WER 11.37 的成绩预训练的 n-gram 模型也可从 README 提供的 Dropbox 共享文件夹获取它们同样基于 CommonVoice 训练集转写训练。九、小结通过本配方你可以在 SpeechBrain 框架内以数据准备 → 文本语料构建 → KenLM n-gram 训练 → ARPA 修复 → CTC 束搜索接入的完整链路为任意支持语言的 CommonVoice 数据集训练 n-gram 语言模型从而显著改善 Wav2Vec2 在小数据量场景下的解码效果。关键要点回顾KenLM 需先安装系统依赖并通过 CMake 编译lmplz可执行文件需加入PATH超参数集中于 train_kenlm.yamlngram: 5是 CommonVoice 实验中的默认选择训练脚本会自动修复 ARPA 文件缺失的/s符号无需手工干预语言相关文本规范化由language参数控制多语言场景请按需调整accented_letters解码接入只需在test_beam_search中设置kenlm_model_path生产环境建议使用.bin格式加速加载。如果你使用 SpeechBrain 进行科研或商业用途请按 README.md 末尾给出的 BibTeX 条目引用 SpeechBrain。【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

用 job-post-builder 技能写出高转化招聘 JD:七段式结构完整指南

用 job-post-builder 技能写出高转化招聘 JD:七段式结构完整指南

用 job-post-builder 技能写出高转化招聘 JD:七段式结构完整指南 【免费下载链接】knowledge-work-plugins Open source repository of plugins primarily intended for knowledge workers to use in Claude Cowork 项目地址: https://gitcode.com/GitHub_Trendin…

2026/9/15 11:18:04 阅读更多 →
Leantime 安全策略与生产环境加固:版本支持、漏洞披露及安全配置实战

Leantime 安全策略与生产环境加固:版本支持、漏洞披露及安全配置实战

Leantime 安全策略与生产环境加固:版本支持、漏洞披露及安全配置实战 【免费下载链接】leantime Leantime is a goals focused project management system for non-project managers. Building with ADHD, Autism, and dyslexia in mind. 项目地址: https://gitco…

2026/9/15 11:18:04 阅读更多 →
抖音无水印下载上手:300 条作品主页一次跑完

抖音无水印下载上手:300 条作品主页一次跑完

抖音无水印下载上手:300 条作品主页一次跑完 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批…

2026/9/15 11:17:03 阅读更多 →

最新新闻

【关注可白嫖源码】--课程设计--毕业设计-- 房屋租赁管理系统project95339(案件分析)

【关注可白嫖源码】--课程设计--毕业设计-- 房屋租赁管理系统project95339(案件分析)

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件 摘 要 传…

2026/9/15 11:56:52 阅读更多 →
无后端微信小程序实战:王者荣耀重复名与战力查询源码拆解

无后端微信小程序实战:王者荣耀重复名与战力查询源码拆解

简介:这份微信小程序源码面向王者荣耀玩家与小程序开发者,围绕特殊昵称生成与跨区战力查询两个场景,提供重复名批量生成、多种空白名(贵族居中、QQ/微信专属)以及微信区/QQ区最低战力查询功能,解决手动改名…

2026/9/15 11:56:52 阅读更多 →
【关注可白嫖源码】--课程设计--毕业设计-- springboot在线花店销售系统[编号:project95193](案件分析)

【关注可白嫖源码】--课程设计--毕业设计-- springboot在线花店销售系统[编号:project95193](案件分析)

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件 摘 要 随…

2026/9/15 11:56:52 阅读更多 →
Flutter双端开发实战:从工程架构到App Store上架全流程

Flutter双端开发实战:从工程架构到App Store上架全流程

1. 项目概述:为什么“一套代码跑双端”不是口号,而是可落地的工程现实 Flutter 双端开发实战,这个标题里藏着三个关键信息点: Flutter 是技术选型,双端是目标形态,实战是交付标准 。它不是教你怎么写个 …

2026/9/15 11:56:52 阅读更多 →
深入解析 Plate 表格多单元格选择崩溃:Slate 节点共享引用的根因与修复

深入解析 Plate 表格多单元格选择崩溃:Slate 节点共享引用的根因与修复

深入解析 Plate 表格多单元格选择崩溃:Slate 节点共享引用的根因与修复 【免费下载链接】plate Rich-text editor with AI and shadcn/ui 项目地址: https://gitcode.com/GitHub_Trending/pl/plate 导读 本文围绕 Plate 仓库中一份真实的缺陷修复计划展开&a…

2026/9/15 11:56:52 阅读更多 →
如何用 Prefect Managed 基础设施运行 flow 而不自建 worker

如何用 Prefect Managed 基础设施运行 flow 而不自建 worker

如何用 Prefect Managed 基础设施运行 flow 而不自建 worker 【免费下载链接】prefect Prefect is a workflow orchestration framework for building resilient data pipelines in Python. 项目地址: https://gitcode.com/GitHub_Trending/pr/prefect 如果你的 flow 需…

2026/9/15 11:55:52 阅读更多 →

日新闻

Java高级技术:从语言特性到性能优化全解析

Java高级技术:从语言特性到性能优化全解析

1. Java高级技术概述Java作为一门成熟的编程语言,经过二十多年的发展已经形成了完整的生态系统。在企业级应用开发、大数据处理、移动开发等领域,Java都占据着重要地位。掌握Java高级技术不仅意味着能够编写更高效的代码,更代表着开发者能够解…

2026/9/15 0:00:23 阅读更多 →
C#与Halcon结合的工业视觉处理实战指南

C#与Halcon结合的工业视觉处理实战指南

1. 项目概述:C#与Halcon强强联合的视觉处理利器这个基于C#和Halcon的视觉处理Demo项目,是我在工业质检领域摸爬滚打多年后提炼出的实战精华。它完美融合了C#的界面开发优势与Halcon强大的图像处理能力,就像给视觉工程师配上了一把瑞士军刀。项…

2026/9/15 0:00:23 阅读更多 →
32路工业串口服务器的硬核选型指南:确定性、鲁棒性与协议下沉

32路工业串口服务器的硬核选型指南:确定性、鲁棒性与协议下沉

1. 为什么“32路复合型”不是营销话术,而是工业现场真实痛点的硬解你有没有遇到过这样的场景:在某大型能源站的PLC机柜里,十几台不同年代、不同品牌的温控仪、电表、气体分析仪、阀门控制器,全靠RS-485总线挂在一根线上&#xff0…

2026/9/15 0:00:23 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/14 5:45:49 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/15 1:32:25 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/15 1:32:21 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/14 17:35:10 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/14 16:59:29 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/14 5:45:14 阅读更多 →