
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),仅供参考