SpeechBrain 端到端语音识别ASR模板实战基于 mini-librispeech 从零训练 CTC seq2seq 识别器【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain本文是 SpeechBrain 仓库中 templates/speech_recognition/ASR 模板的完整技术指南。该模板用少量数据mini-librispeech演示了如何从零训练一个离线端到端E2E注意力式语音识别器以 CRDNN 为编码器、GRU 为解码器联合 CTC 与 seq2seq 多任务损失训练解码阶段使用与 RNN 语言模型耦合的 beam search。读完本文你将掌握该模板三个核心文件train.py、train.yaml、mini_librispeech_prepare.py的作用与调用链能够一键复现训练、理解全部关键超参数并用训练好的模型对任意音频文件执行推理。模板定位一套可直接运行的 ASR 最小可行示例该文件夹位于templates/speech_recognition/ASR提供的是一个可工作、有详细注释的完整示例用于基于几小时数据从零训练一个 seq2seq CTC语音识别器。整个目录只包含五个文件文件作用train.py主代码文件定义ASR(sb.Brain)类与完整训练流程train.yaml超参数文件配置执行所需的一切参数数据、模型、增强、解码、优化mini_librispeech_prepare.py按需下载 mini-librispeech 并生成数据 manifest 文件inference.yaml推理专用配置与train.yaml保持模型结构一致transcribe_file.py对单个音频文件执行转写的推理脚本需要强调的是这是一个模板template而非生产级配方recipetemplates/README.md明确说明这些模板是开发新 recipe 的良好起点覆盖序列回归增强、序列到序列语音识别、序列分类说话人识别等任务。模板刻意选用 mini-librispeech 这种极小数据集目的是让整个流程在普通机器上即可跑通要获得可用的识别性能仍需在更大数据集如完整 LibriSpeech上训练。三步走Tokenizer → LM → ASR 的完整依赖链本模板的 ASR 训练假设分词器tokenizer与语言模型LM已经训练完毕。上层说明文件 templates/speech_recognition/README.md 给出了完整的依赖顺序训练 Tokenizer依据训练集转写文本学习词片subword切分规则。SpeechBrain 依赖流行的 SentencePiece 实现支持 unigram / bpe / char 三种 token 类型命令为cd Tokenizer python train.py tokenizer.yaml对应配置 templates/speech_recognition/Tokenizer/hparams/tokenizer.yaml 中默认token_type: unigram、token_output: 10001000 个 BPE/unigram 词片索引 0 预留为 blank/eos/bos/unk。训练 LM在目标 token 之上训练语言模型理想情况下使用与目标应用同领域的较大文本语料本示例直接基于训练集转写训练 RNNLMcd ../LM python train.py RNNLM.yaml训练语音识别器即本模板命令为cd ../ASR python train.py train.yaml一个关键约束贯穿始终声学模型使用的分词器必须与 LM 相同以避免 token 不匹配。本模板默认直接从 SpeechBrain 的 HuggingFace 仓库speechbrain/asr-crdnn-rnnlm-librispeech下载预训练好的 LM 与 tokenizer 检查点因此你无需真的先手动完成前两步若想用自己的 LM/tokenizer只需把pretrained_path指向包含lm.ckpt与tokenizer.ckpt的本地目录。一键启动训练命令与执行入口训练的核心命令只有一条python train.py train.yaml从源码结构看train.py 的__main__入口第 432-504 行完整串联了以下步骤sb.parse_arguments(sys.argv[1:])解析命令行参数支持--device、--seed等 run_opts 与--hparams覆盖项sb.utils.distributed.ddp_init_group(run_opts)初始化分布式仅在多卡 DDP 训练时有意义load_hyperpyyaml(fin, overrides)加载 YAML 超参数hyperpyyaml 语法支持!ref、!new、!apply等指令sb.create_experiment_directory(...)创建输出目录并保存超参数副本run_on_main(prepare_mini_librispeech, ...)在主进程上执行数据准备可由skip_prep控制跳过run_on_main下载噪声与 RIR 数据用于数据增强dataio_prepare(hparams)构建 train/valid/test 三个DynamicItemDatasethparams[pretrainer].collect_files()与.load_collected()下载并加载预训练 LM、tokenizer 与声学模型实例化ASRBrain 对象调用fit()训练用evaluate()在测试集上评估按 WER 取最佳 checkpoint最后保存固定名latestcheckpoint。数据准备mini-librispeech 下载与 manifest 生成minilibrispeech_prepare.py 中的prepare_mini_librispeech(data_folder, save_json_train, save_json_valid, save_json_test)负责数据准备三个数据子集来自 OpenSLR训练集train-clean-5.tar.gz约 5 小时OpenSLR 31验证集dev-clean-2.tar.gz约 2 小时OpenSLR 31测试集test-clean.tar.gz完整 LibriSpeech 测试集OpenSLR 12准备流程的源码逻辑为若三个 JSON manifest 已存在则跳过skip()检测否则检查LibriSpeech/{train-clean-5,dev-clean-2,test-clean}三个目录是否存在不存在则下载并解压随后扫描.flac音频文件与.trans.txt转写文件用read_audio读取每个音频计算时长最终生成如下格式的 JSON manifest{ uttid: { wav: {data_root}/LibriSpeech/train-clean-5/.../uttid.flac, length: 4.32, words: the corresponding transcript } }注意wav字段中的{data_root}占位符会在 train.py 的DynamicItemDataset.from_json(..., replacements{data_root: data_folder})处被替换为真实路径。超参数全景解析train.yamltrain.yaml 是模板的灵魂按主题可分为以下几组下面逐一给出关键参数及其默认值与含义。训练与数据组织参数默认值含义seed2602随机种子通过!apply:speechbrain.utils.seed_everything在实例化任何带参数对象前设置data_folder../data数据集目录缺省时自动下载output_folderresults/CRDNN_BPE_960h_LM/seed实验输出目录日志、checkpointnumber_of_epochs15总训练轮数number_of_ctc_epochs5前 N 轮启用 CTC 辅助损失联合训练之后仅用 seq2seq 损失batch_size8批大小lr1.0初始学习率配合 Adadelta 优化器ctc_weight0.5CTC 损失在多任务损失中的权重总损失 (1 - ctc_weight) * seq2seq ctc_weight * ctcsortingascending按序列长度排序升序/降序/随机升序可大幅减少 zero-padding 带来的无效计算ckpt_interval_minutes15每 N 分钟保存一次 checkpointlabel_smoothing0.1seq2seq NLL 损失的标签平滑系数num_workers4DataLoader 读取数据的工作进程数取决于机器 CPU 核数特征与词表参数默认值含义sample_rate16000采样率n_fft400FFT 点数16kHz 下对应 25ms 窗n_mels40Mel 滤波器组数量output_neurons1000输出类别数即 BPE token 数必须与 LM 一致blank_index/bos_index/eos_index0CTC blank、解码起始符、结束符索引三者共用索引 0特征提取器为speechbrain.lobes.features.Fbank归一化使用speechbrain.processing.features.InputNormalizationnorm_type: global即全局均值/方差归一化。模型结构CRDNN 编码器 Attention GRU 解码器编码器 CRDNNCNN RNN DNN 的组合参数参数默认值含义activationtorch.nn.LeakyReLU激活函数dropout0.15Dropout 概率cnn_blocks/cnn_channels2/(128, 256)CNN 块数与各块通道数cnn_kernelsize(3, 3)CNN 卷积核尺寸time_pooling_size4时间维池化大小rnn_classspeechbrain.nnet.RNN.LSTMRNN 类型可替换为 GRU/LiGRU 等rnn_layers/rnn_neurons4/1024RNN 层数与隐单元数rnn_bidirectionalTrue是否双向dnn_blocks/dnn_neurons2/512顶部 DNN 块数与神经元数也是解码器的enc_dim解码器为 AttentionalRNNDecoderspeechbrain.nnet.RNN.AttentionalRNNDecoderrnn_type: gru、attn_type: location基于位置的注意力适合语音时序对齐、hidden_size: 1024、attn_dim: 1024、channels: 10、kernel_size: 100location attention 的卷积参数、num_layers: 1。token 先经speechbrain.nnet.embedding.Embeddingemb_size: 128嵌入编码器输出与解码器输出分别接ctc_lin与seq_lin两个线性层映射到output_neurons维再经log_softmax得到 log 后验。所有可训练子模块encoder、embedding、decoder、ctc_lin、seq_lin、normalize、lm_model被收集进modules字典由 Brain 类负责设备迁移与 train/eval 切换同时用torch.nn.ModuleList组装为model作为 checkpoint 的recoverables之一。数据增强波形域 特征域双重 Augmenter模板对增强的注释特别说明它演示了所有可用增强策略以展示其用法与组合方式实际应用参考其他 recipe通常建议只挑选子集以获得更好效果。波形域增强speechbrain/augment/time_domain.py默认开启的包括加混响AddReverbRIR 数据、加噪声AddNoiseSNR 0~15 dB、速度扰动SpeedPerturb85%~115%、频率带随机置零DropFreq、时间块随机丢弃DropChunk、削波DoClip、随机幅度RandAmp、batch 内求和构造的 babble 噪声AddNoisetorch.sum与比特分辨率随机降低DropBitResolutionenable_codec_augment默认关闭。这些增强由speechbrain.augment.augmenter.Augmenter组合parallel_augment: False顺序应用、concat_original: True原始信号拼接到 batch、min/max_augmentations控制每次随机挑选的增强数量。特征域增强speechbrain/augment/freq_domain.py包括时间/频率移位RandomShift、时间/频率块丢弃SpectrogramDropreplace: zeros、时间/频率扭曲Warping窗口 20/4bicubic插值同样由Augmenter组合并借助augment_start_index/concat_end_index均为batch_size保持原始输入不被改动。增强与标签的同步由 train.py 中的prepare_tokens完成——调用wav_augment.replicate_labels(...)/fea_augment.replicate_labels(...)让 token 标签随增强样本复制保证数据对齐。解码beam search 与三类 scorer验证与测试阶段使用 S2SRNNBeamSearcherspeechbrain.decoders.S2SRNNBeamSearcher。关键解码参数参数默认值含义valid_beam_size/test_beam_size8/80验证/测试束宽测试可更重min/max_decode_ratio0.0/1.0解码长度相对编码长度的最小/最大比例eos_threshold1.5提前结束的 EOS 概率阈值using_max_attn_shift/max_attn_shiftTrue/240注意力位移限制防止注意力漂移temperature/temperature_lm1.25/1.25解码/语言模型温度Scorer 体系speechbrain/decoders/scorer.py由ScorerBuilder管理rnnlm_scorerRNNLMScorer加载预训练 RNNLM2 层、2048 神经元权重lm_weight: 0.50coverage_scorerCoverageScorer基于累计注意力权重的覆盖惩罚coverage_penalty: 1.5用于抑制重复解码ctc_scorerCTCScorer测试解码时额外融合 CTC 概率ctc_weight_decode: 0.0默认关闭开启可提精度但明显拖慢解码。full_scorers对完整词表打分如 RNNLM、coveragepartial_scorers对剪枝后的 token 打分如 CTC剪枝规模由scorer_beam_scale: 1.5控制。验证阶段刻意使用轻量 scorer仅 coverage测试阶段才叠加 LM 与 CTC 以获得最佳 WER。优化与调度优化器torch.optim.Adadeltalr: 1.0、rho: 0.95、eps: 1e-8适合本任务规模调度器NewBobSchedulerspeechbrain/nnet/schedulers.pyimprovement_threshold: 0.0025、annealing_factor: 0.8、patient: 0——若连续验证 WER 改善低于阈值则以 0.8 倍衰减学习率指标ErrorRateStats同时计算 WER词错误率与 CER字符错误率split_tokens: True。训练循环源码解析ASR Brain 类的四个关键钩子train.py 的核心是继承speechbrain.core.Brain的ASR类它通过重写四个钩子定义完整行为compute_forward(batch, stage)第 62-116 行把 batch 移到设备 →prepare_features提取并归一化 Fbank 特征含波形/特征增强→ 编码器前向得到encoded_signal→ token 嵌入后送入解码器 → 输出seq_logprobs若is_ctc_active则额外输出ctc_logprobs非训练阶段调用valid_search/test_search得到预测 token。is_ctc_active(stage)第 118-133 行仅训练阶段且current_epoch number_of_ctc_epochs时启用 CTC即 CTC 只在训练初期起辅助收敛作用。compute_objectives(predictions, batch, stage)第 201-255 行seq2seq 分支用nll_loss带label_smoothing计算CTC 分支用ctc_loss按ctc_weight加权求和验证/测试时把 token 序列经 tokenizerdecode_ids还原为词序列累计 WER/CER。on_stage_end(stage, stage_loss, epoch)第 275-324 行验证阶段按 WER 执行 NewBob 学习率退火、写日志、checkpointer.save_and_keep_only(meta{WER: ...}, min_keys[WER])保留最佳 checkpoint测试阶段把 WER 统计写入test_wer_file。dataio_prepare第 327-429 行定义了动态数据管线audio_pipeline用read_audio读音频text_pipeline用 tokenizer 把词序列编码为tokens_list并派生出三种标签——tokens_bos前插 BOS喂解码器、tokens_eos后接 EOS算损失、tokens无特殊符算 CTC 损失这正是CTC seq2seq多任务结构在数据层的体现。数据集按sorting策略用filtered_sorted(sort_keylength)排序以提升批处理效率。为什么需要预训练小数据收敛策略模板明确说明mini-librispeech 数据量过小不足以让端到端模型从零收敛因此先用更大的模型在完整 LibriSpeech 960h 上按 seq2seq 1k BPE 配方训练的模型预训练再在 mini-librispeech 上微调。这一策略由pretrainer实现speechbrain/utils/parameter_transfer.py 的Pretrainer同时加载三个负载lm: pretrained_path/lm.ckpt预训练 RNNLMtokenizer: pretrained_path/tokenizer.ckpt预训练 SentencePiece tokenizermodel: pretrained_path/asr.ckpt预训练声学模型真实场景中若使用大数据集完全可以跳过预训练从零开始训练——只需把pretrained_path指向你自己的或本地训练好的LM 与 tokenizer 即可。推理实战对单个音频文件转写训练完成后可用 transcribe_file.py 对任意音频做转写python transcribe_file.py speech_file.wav results/4234/save该脚本的工作方式值得注意它先把model.ckpt与normalizer.ckpt从 save 目录符号链接到上一级目录使自训模型与预训练的 LM/tokenizer 处于同一目录再由speechbrain.inference.ASR.EncoderDecoderASR.from_hparams(source., hparams_fileinference.yaml, savedir...)统一加载最后调用transcribe_file()打印识别文本。文档注释强调若你修改了 train.yaml 中的模型结构务必同步修改 inference.yaml否则权重无法正确加载。inference.yaml 是 train.yaml 的精简镜像保留特征、模型、LM、scorer 与 beam search 配置并把compute_features → normalize → enc组装为LengthsCapableSequential编码管线供EncoderDecoderASR的HPARAMS_NEEDED [tokenizer]、MODULES_NEEDED [encoder, decoder]约束使用见 speechbrain/inference/ASR.py 第 35-64 行。从源码看EncoderDecoderASR.transcribe_file会把音频load_audio后构造伪 batch 调用transcribe_batch返回词序列字符串。实用提示与扩展方向HPC/大数据集运行train.yaml 头部注释给出强建议——先把数据集压缩为单个 tar/zip 复制到计算节点本地磁盘如 SLURM 集群的$SLURM_TMPDIR再解压并把data_folder指向本地路径避免共享文件系统成为 I/O 瓶颈。替换 token 类型train.py 的 docstring 说明该实验文件足够灵活可通过修改参数文件尝试不同编码器、解码器与 token如字符级而非 BPE。换更大数据集模板的上层 README 指引参考recipes/LibriSpeech/ASR中的竞争性配方该目录包含 seq2seq、CTC、transformer、transducer 等多套完整实现。继续学习该模板与tutorials/tasks/speech-recognition-from-scratch.ipynb教程主题一致后者提供了更手把手的讲解本文仅引用仓库内教程未提供外部链接。【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考