尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SpeechBrain 实战:基于 wav2vec2 与 CTC 的 Switchboard 英文电话对话语音识别

SpeechBrain 实战:基于 wav2vec2 与 CTC 的 Switchboard 英文电话对话语音识别 SpeechBrain 实战基于 wav2vec2 与 CTC 的 Switchboard 英文电话对话语音识别【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain本篇技术指南围绕 SpeechBrain 仓库中的 Switchboard CTC 语音识别配方Recipe展开系统讲解如何以预训练 wav2vec2 为编码器、CTC 为训练准则在 Switchboard 电话对话语料上训练出可直接复现的端到端 ASR 模型并覆盖数据准备、配置调优、解码评测与 WER 指标口径等完整闭环。读完本文你将掌握该配方的运行方式、每一行关键超参数的含义与源码级实现原理并理解为何它能在 Eval2000 测试集上取得 Swbd 8.76 / Callhome 14.67 / 整体 11.78 的 WER 成绩。配方概览与适用场景该配方位于 recipes/Switchboard/ASR/CTC/用于在 Switchboard 语料上训练一套wav2vec2 编码器 CTC 解码器的 ASR 系统。与同目录下的 seq2seq、transformer 两套配方不同本配方采用 CTCConnectionist Temporal Classification作为训练与解码准则验证阶段使用贪心解码greedy decoding测试阶段使用 CTC Beam Search基于 SpeechBrain 的CTCBeamSearcher可选外挂 KenLM 语言模型做浅层融合shallow fusion文本单元为基于 SentencePiece 的 subword默认 unigram1000 词元训练数据为 Switchboard-1 Release 2LDC97S62测试集为 eval2000/Hub5 EnglishLDC2002S09 语音、LDC2002T43 转写并可选用 Fisher 语料LDC2004T19 等扩充 Tokenizer / LM 训练文本。从仓库结构看同一 ASR 目录下还有 seq2seq 与 transformer 两套可对照的配方本配方更侧重于低资源微调场景下的快速收敛与稳定复现。数据获取与前置依赖语料来源训练与评测所用数据均为 LDCLinguistic Data Consortium授权语料需要自行购买/申请用途语料LDC 编号训练集Switchboard-1 Release 2LDC97S62测试语音eval2000/Hub5 EnglishLDC2002S09测试转写Hub5 English TranscriptsLDC2002T43Tokenizer/LM 扩充可选Fisher Corpus Part 1/2LDC2004T19另含 LDC2005T19运行依赖运行命令如下python train_with_wav2vec.py hparams/train_with_wav2vec.yaml配方依赖 HuggingFacetransformers库来加载预训练 wav2vec2 模型README 明确指出需要安装该包。另外若在 train_with_wav2vec.yaml 中启用kenlm_model_path默认null还需要安装 KenLM 的 Python 绑定——这一点在 speechbrain/decoders/ctc.py 的CTCBaseSearcher.__init__中有显式的ImportError检查未安装时会直接提示。默认配置下不使用 LM因此仅需保证transformers可用。超参数文件逐段解析recipes/Switchboard/ASR/CTC/hparams/train_with_wav2vec.yaml 是整套系统的核心配置下面按功能模块逐段说明。全局与数据路径seed: 1312 output_folder: !ref results/wav2vec2_large_ctc/seed data_folder: !PLACEHOLDER # 需要替换为 Switchboard 数据集实际路径 splits: [train, dev] split_ratio: [99, 1] skip_prep: False add_fisher_corpus: True # Fisher 语料仅用于 Tokenizer 训练 normalize_words: True # 评测时移除转写中可删除/可替换的部分 max_utt: 300 # 同一句转写最多出现 300 次过滤 uh-huh 类高频废话seed通过speechbrain.utils.seed_everything在 YAML 顶部最先执行保证可复现性data_folder是唯一需要用户填写的占位符splits/split_ratio将 Switchboard 训练语料按对话数切分为 train/devadd_fisher_corpus: True时会额外生成train_lm.csv其中包含 Switchboard 训练文本 Fisher 转写仅用于 Tokenizer与 LM训练不参与声学模型训练max_utt: 300用于抑制 uh-huh 这类重复出现且无信息量的转写。训练参数number_of_epochs: 30 lr: 1.0 # 下游 DNN 的 Adadelta 学习率 lr_wav2vec: 0.0001 # wav2vec2 微调的 Adam 学习率 sorting: ascending # 按时长升序排序配合 batch_size4 节省显存 precision: fp32 # 可选 bf16 / fp16 / fp32 sample_rate: 16000 batch_size: 4 # 40GB 显存下的建议值 test_batch_size: 2 avoid_if_longer_than: 15.52 # 超过该秒数的训练句被剔除avoid_if_longer_than: 15.52的取值有明确依据训练集中最长句 27.97 秒测试集最长句 15.51 秒因此 15.52 秒的阈值仅会剔除训练集 192k 条中极少数约 31 条超长句同时保证batch_size4能跑在 40GB 显存上若显存充裕可设为大于 28 秒以保留全部数据。另外 YAML 注释明确说明使用data_parallel时 batch_size 会被 N 个任务均分使用 DDP 时 batch_size 会被 N 个任务相乘。Tokenizer 与词表token_type: unigram # 可选 unigram、bpe、char character_coverage: 1.0 output_neurons: 1000 # BPE/unigram 词表大小index 0 为 blank/eos/bos blank_index: 0 bos_index: 1 eos_index: 2词元模型通过 speechbrain/tokenizers/SentencePiece.py 在output_folder下训练训练文本来自train_tokenizer_csv即train_lm.csv。blank_index、bos_index、eos_index必须与 SentencePiece 词表索引一致。模型结构wav2vec2_hub: facebook/wav2vec2-large-lv60 # 预训练模型源 wav2vec_output_dim: 1024 dnn_neurons: 1024 freeze_wav2vec: False dropout: 0.15整体前向链路为wav2vec2预训练编码器→ 3 层 DNNLinear BatchNorm LeakyReLU Dropout→ CTC 线性层 → log_softmax。对应的enc定义在 train_with_wav2vec.yaml由三个Linear → BatchNorm1d → LeakyReLU末层无激活块堆叠而成中间插入两个 dropout0.15 的 Dropoutctc_lin将 1024 维映射到output_neurons1000维最后由log_softmax输出对数概率。wav2vec2 模块通过 speechbrain/integrations/huggingface/wav2vec2.py 的Wav2Vec2类接入关键参数sourceHuggingFace hub 上的模型名facebook/wav2vec2-large-lv60或本地路径首次运行自动下载output_norm: True对 wav2vec2 输出施加 affine layer_normfreeze为False时整个编码器随下游一起微调save_path模型缓存与断点目录。源码extract_features中还会依据feature_extractor.do_normalize对输入波形做 layer_norm 归一化并用make_padding_masks生成 attention mask。YAML 末尾还注释了一个可选方案改用 Fairseq 预训练权重如 XLSR-53作为编码器只需替换为speechbrain.lobes.models.fairseq_wav2vec.FairseqWav2Vec2并给出pretrained_path即可。数据增强speed_perturb: !new:speechbrain.augment.time_domain.SpeedPerturb orig_freq: !ref sample_rate speeds: [95, 100, 105] drop_freq: !new:speechbrain.augment.time_domain.DropFreq drop_freq_low: 0 drop_freq_high: 1 drop_freq_count_low: 1 drop_freq_count_high: 3 drop_freq_width: 0.05 drop_chunk: !new:speechbrain.augment.time_domain.DropChunk drop_length_low: 1000 drop_length_high: 2000 drop_count_low: 1 drop_count_high: 5 wav_augment: !new:speechbrain.augment.augmenter.Augmenter concat_original: True min_augmentations: 3 max_augmentations: 3 augment_prob: 1.0 augmentations: [!ref speed_perturb, !ref drop_freq, !ref drop_chunk]这是典型的波形域 SpecAugment 实现速度扰动95%/100%/105% 随机频率带清零 随机时间片段丢弃每次训练样本固定叠加 3 种增强min/max_augmentations: 3concat_original: True表示保留原始波形副本。值得注意的是增强发生在波形域而非特征域且train_with_wav2vec.py中会用wav_augment.replicate_labels同步复制标签速度扰动下标签需保持一致。这些类全部来自 speechbrain/augment/time_domain.py 与 speechbrain/augment/augmenter.py。优化器与学习率调度model_opt_class: !name:torch.optim.Adadelta lr: !ref lr # 1.0 rho: 0.95 eps: 1.e-8 wav2vec_opt_class: !name:torch.optim.Adam lr: !ref lr_wav2vec # 0.0001 lr_annealing_model: !new:speechbrain.nnet.schedulers.NewBobScheduler initial_value: !ref lr improvement_threshold: 0.0025 annealing_factor: 0.8 patient: 0 lr_annealing_wav2vec: !new:speechbrain.nnet.schedulers.NewBobScheduler initial_value: !ref lr_wav2vec improvement_threshold: 0.0025 annealing_factor: 0.9 patient: 0下游 DNN 采用 Adadeltalr1.0预训练编码器采用 Adamlr1e-4——这是 wav2vec2 微调的标准双学习率策略两类参数分属两个优化器由ASR.init_optimizers分别创建并注册到 Checkpointer。调度器为 NewBob验证集 loss 未在阈值内改善即按因子衰减学习率模型 0.8、wav2vec2 0.9。解码参数test_searcher: !name:speechbrain.decoders.CTCBeamSearcher beam_size: 143 beam_prune_logp: -12.0 token_prune_min_logp: -1.2 prune_history: True topk: 1 alpha: 0.8 beta: 1.2 kenlm_model_path: null # 可指向 OpenSLR 下载或 kenLM 训练的 .bin/.arpaCTCBeamSearcher实现在 speechbrain/decoders/ctc.py其文档说明它借鉴了 PyCTCDecode 的思路不对 blank/non-blank 概率分别追踪而是将每个新词元概率累加到总分并合并文本相同的 beam。它内置了四种加速启发式beam 剪枝得分低于最优 beam 减去beam_prune_logp即剔除、token 剪枝低于token_prune_min_logp剔除、历史剪枝prune_history按 n-gram 历史去重、blank 帧跳过。alpha/beta分别是 LM 浅层融合权重与句长惩罚权重。若启用kenlm_model_path建议使用.bin二进制格式.arpa加载极慢相关逻辑在CTCBaseSearcher的__init__中kenlm 未安装会直接抛出ImportError。训练脚本源码级解析recipes/Switchboard/ASR/CTC/train_with_wav2vec.py 继承sb.core.Brain定义ASR类是整个训练流程的骨架。前向与损失计算compute_forward对应文件 L65-L82完成对训练阶段先施加波形增强然后依次过wav2vec2、enc、ctc_lin、log_softmax返回(p_ctc, wav_lens)。compute_objectivesL84-L126则区分三个阶段TRAIN仅计算ctc_loss来自 speechbrain/nnet/losses.py并对增强后的标签调用replicate_labelsVALID使用speechbrain.decoders.ctc_greedy_decode贪心解码再经 tokenizer 还原为词序列TEST使用test_searcher即CTCBeamSearcher做束搜索解码取hyp[0].text作为最优假设。非训练阶段都会追加 WER/CER 统计若normalize_words开启则先经normalize_fn处理预测与目标序列再计入指标。每个 epoch 结束时验证阶段会依据 WER 通过checkpointer.save_and_keep_only(min_keys[WER])保留最优断点测试阶段将 WER 明细写入output_wer_folder下的文本文件。数据管线dataio_prepareL220-L338定义了两条动态管线音频管线audio_pipelineL284-L312读取 Switchboard 的.sph段文件由于数据准备阶段已将start/stop换算为采样点8kHz 下此处通过audio_io.load按frame_offset/num_frames直接切片若采样率非 16kHz 则用torchaudio.transforms.Resample重采样对于双声道通话记录依据channel字段A/B选择对应声道。文本管线text_pipelineL321-L330调用 SentencePiece 的encode_as_ids同时产出tokens_bos、tokens_eos、tokens三种形式本配方仅使用tokens做 CTC 训练。双优化器初始化init_optimizersL183-L207按wav2vec2.freeze决定是否创建 wav2vec2 的 Adam 优化器并始终为model即ModuleList[enc, ctc_lin]创建 Adadelta 优化器二者均注册进 Checkpointer 以便断点续训。freeze_optimizers则保证冻结状态下的优化器不会被调度。数据准备细节从 LDC 原始语料到 CSVrecipes/Switchboard/ASR/CTC/switchboard_prepare.py 中的prepare_switchboard是数据准备入口在训练主进程中通过run_on_main只执行一次。它会校验LDC97S62目录下的docs、swb1_d1~swb1_d4子目录并从 OpenSLR 自动下载 Switchboard 词对齐转写switchboard_word_alignments.tar.gz。产出的 CSV 列结构为ID, duration, start, stop, channel, wav, words, spk_id其中start/stop为 8kHz 采样下的采样点wav为绝对路径words为清洗后的大写转写。数据处理中值得注意的几点均有源码佐证转写清洗filter_text针对 train / eval2000 / fisher 三套数据分别应用正则规则。训练数据会去除[SILENCE]、...等标记处理笑声标记如[LAUGHTER-STORY] → STORY、部分词partial word如-Y、花括号非标准词以及THEM_1 → THEM等规范化逻辑对应 Kaldi 的swbd1_map_words.pl缩写词映射借助 Switchboard 词表sw-ms98-dict.text与 MSU 单字母音素表构建缩写映射将IBM转为 Fisher 约定的i._b._m.形式make_acronym_map/map_acronyms使训练文本与 Fisher 语料口径一致重复句限制write_csv通过utt2count计数器将同一转写出现超过max_utt次的语句剔除抑制 uh-huh 类噪声eval2000 测试集eval2000_data_prep解析 Hub5 的.stm转写文件按文件名前缀区分 Switchboard 段sw_与 Callhome 段en分别产出test_swbd.csv、test_callhome.csv再合并为test.csv同时解析en20000405_hub5.glm规则文件生成glm.csvparse_glm_file供评测期做词级替代匹配Fisher 扩充fisher_data_prep将 Fisher Part1/2 的转写清洗后与 Switchboard 训练文本合并成train_lm.csvTokenzier 训练用该文件不做max_utt限制对齐 Kaldi 的 LM 训练口径。评测口径normalize_util 与 WER 计算电话对话数据存在大量口头语、语气词与不完整词直接按原始文本算 WER 会严重失真。recipes/Switchboard/ASR/CTC/normalize_util.py 提供了对齐 Kaldilocal/score.sh的评测归一化逻辑expand_contractions展开常见缩写wont → WILL NOT、cause → BECAUSE等与通用后缀规则nt → NOT、re → ARE…并拆分连写词如pseudo-rebel → pseudo rebel删除以-开头的不完整词剔除UNK、UH、UM、MM等排除词表中的语气词依据glm.csv中的 Hub4-E/Hub5-E 替代拼写与缩写映射read_glm_csv解析将预测词替换为参考词的有效替代移除[LAUGHTER]/[NOISE]标记、残留标点及 THOUGHLAUGHTER 这类拼接词。该函数由 train_with_wav2vec.py 以functools.partial注入ASR实例仅作用于 TEST 阶段。最终 WER/CER 由speechbrain.utils.metric_stats.ErrorRateStats统计验证阶段保存最佳模型以 WER 为键测试结果写入output_wer_folder下的wer_test_swbd.txt、wer_test_callhome.txt、wer_test.txt。复现结果README 记录的已发布复现结果如下Releasehyperparams fileSwbd WERCallhome WEREval2000 WERHuggingFace linkFull model linkGPUs17-09-22train_with_wav2vec.yaml8.7614.6711.78asr-wav2vec2-switchboardn.a.4xA100 40GB该结果对应facebook/wav2vec2-large-lv60编码器 unigram(1000) 词表 CTC Beam Searchbeam_size143、alpha0.8、beta1.2的默认配置训练环境为 4 张 A100 40GB。Eval2000 整体 WER 11.78% 由 Swbd 段8.76%与 Callhome 段14.67%混合构成符合 Hub5 评测集一半 Switchboard、一半 Callhome 电话对话的构成比例。扩展阅读与引用如需在同一数据集上对比其他建模方式可查看同目录下的 seq2seq 配方 与 transformer 配方对 CTC 解码器本身感兴趣的读者可深入 speechbrain/decoders/ctc.py 阅读CTCPrefixScore实现论文算法与CTCBeamSearcherPyCTCDecode 风格两套解码路径以及 speechbrain/inference/ASR.py 中基于该体系封装的推理接口。若在研究中引用本配方或 SpeechBrain请按仓库 recipes/Switchboard/ASR/CTC/README.md 末尾给出的 BibTeX 条目引用 SpeechBrain 相关论文speechbrainV1与通用speechbrain两条。【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表