全面解析 ESPnet:Aishell 项目深入指南
项目结构如下
这里我们优先讲解asr1下的run.sh 和asr.sh。asr.sh在run.sh 中被调用
aishell
\---asr1| asr.sh👈| cmd.sh| db.sh| path.sh| pyscripts| README.md| run.sh👈| run_streaming.sh| run_whisper_finetune.sh| scripts| steps| utils|+---conf| | decode_asr_branchformer.yaml| | decode_asr_rnn.yaml| | decode_asr_simu_streaming.yaml| | decode_asr_streaming.yaml| | decode_asr_transformer.yaml| | decode_asr_transformer_ngram.yaml| | fbank.conf| | pbs.conf| | pitch.conf| | queue.conf| | slurm.conf| | train_asr_branchformer.yaml| | train_asr_conformer.yaml| | train_asr_rnn.yaml| | train_asr_streaming_conformer.yaml| | train_asr_streaming_transformer.yaml| | train_asr_transformer.yaml| | train_lm.yaml| | train_lm_transformer.yaml| || \---tuning| decode_asr_whisper_noctc_beam10.yaml| train_asr_branchformer_e24_amp.yaml| train_asr_branchformer_fast_selfattn_e24_amp.yaml| train_asr_conformer.yaml| train_asr_conformer_e12_amp.yaml| train_asr_conformer_e12_brctc_intermediate_stage1.yaml| train_asr_conformer_e12_brctc_intermediate_stage2.yaml| train_asr_ctc_conformer_e15_linear1024.yaml| train_asr_ctc_e_branchformer_e12.yaml| train_asr_e_branchformer_e12_mlp1024_linear1024_mactrue_amp.yaml| train_asr_transformer.yaml| train_asr_transformer2.yaml| train_asr_transformer3.yaml| train_asr_transformer_lr0.002.yaml| train_asr_whisper_large_lora_finetune.yaml| train_asr_whisper_medium_finetune.yaml| train_asr_whisper_medium_lora_finetune.yaml| train_lm_rnn.yaml| train_lm_rnn2.yaml| train_lm_transformer.yaml|\---localdata.shdownload_and_untar.shpath.sh
- run.sh
#!/usr/bin/env bash
# 指定脚本使用 bash 作为解释器,env 用于找到 bash 的路径# 设置 bash 为 'debug' 模式,当出现以下情况时,脚本会退出:
# - -e: 一旦有任何命令返回非零状态,立即退出
# - -u: 尝试使用未定义的变量时会导致脚本退出
# - -o pipefail: 如果管道中的任何命令失败,整个管道返回非零状态
set -e
set -u
set -o pipefail# 定义训练集、验证集和测试集的变量
train_set=train # 训练集名称
valid_set=dev # 验证集名称
test_sets="dev test" # 测试集名称,可以包含多个集合# 定义 ASR 训练和推理的配置文件路径
asr_config=conf/train_asr_branchformer.yaml # ASR 训练配置文件
inference_config=conf/decode_asr_branchformer.yaml # ASR 推理配置文件# 定义语言模型的配置文件路径和使用标志
lm_config=conf/train_lm_transformer.yaml # 语言模型的配置文件
use_lm=false # 是否使用语言模型(此处为 false)
use_wordlm=false # 是否使用词级语言模型(此处为 false)# 速度扰动相关配置
# 如果指定了 speed_perturb_factors,train_set 将变为 "${train_set}_sp"
speed_perturb_factors="0.9 1.0 1.1" # 速度扰动因子,增强训练数据的多样性# 调用 asr.sh 脚本,执行 ASR 训练或推理过程
./asr.sh \--nj 32 \ # 指定并行作业的数量,这里设置为 32--inference_nj 32 \ # 指定推理阶段的并行作业数量,也设置为 32--ngpu 4 \ # 指定使用的 GPU 数量,这里设置为 4--lang zh \ # 指定语言,这里设置为中文(zh)--audio_format "flac.ark" \ # 指定音频文件的格式,这里设置为 flac.ark--feats_type raw \ # 指定特征的类型,这里选择原始特征(raw)--token_type char \ # 指定标记类型,这里选择字符级别(char)--use_lm ${use_lm} \ # 是否使用语言模型,使用前面定义的 use_lm 变量--use_word_lm ${use_wordlm} \ # 是否使用词级语言模型,使用前面定义的 use_wordlm 变量--lm_config "${lm_config}" \ # 传递语言模型配置文件的路径--asr_config "${asr_config}" \ # 传递 ASR 训练配置文件的路径--inference_config "${inference_config}" \ # 传递推理配置文件的路径--train_set "${train_set}" \ # 传递训练集的名称--valid_set "${valid_set}" \ # 传递验证集的名称--test_sets "${test_sets}" \ # 传递测试集的名称--speed_perturb_factors "${speed_perturb_factors}" \ # 传递速度扰动因子的设置--asr_speech_fold_length 512 \ # 设置 ASR 语音的折叠长度(输入序列的长度)--asr_text_fold_length 150 \ # 设置 ASR 文本的折叠长度--lm_fold_length 150 \ # 设置语言模型的折叠长度--lm_train_text "data/${train_set}/text" "$@" # 指定用于训练语言模型的文本文件路径,并传递额外参数
下一步的线索: 就是要着重去看 asr.sh 和 上面提到的几个yaml文件。
- conf/train_asr_branchformer.yaml
# 网络架构配置# 编码器相关配置
encoder: branchformer # 使用的编码器架构,这里是 Branchformer
encoder_conf:output_size: 256 # 编码器输出的特征向量大小use_attn: true # 是否使用注意力机制attention_heads: 4 # 注意力头的数量attention_layer_type: rel_selfattn # 注意力层类型,此处为相对自注意力pos_enc_layer_type: rel_pos # 位置编码层类型,使用相对位置编码rel_pos_type: latest # 相对位置类型,取最新的use_cgmlp: true # 是否使用 CGMLP(卷积增强的多层感知机)cgmlp_linear_units: 2048 # CGMLP 中线性层的单元数cgmlp_conv_kernel: 31 # CGMLP 中卷积核的大小use_linear_after_conv: false # 卷积后是否使用线性层gate_activation: identity # 门控激活函数类型,这里使用恒等函数merge_method: concat # 合并方法,这里使用拼接cgmlp_weight: 0.5 # 仅在合并方法为 "fixed_ave" 时使用的权重attn_branch_drop_rate: 0.0 # 仅在合并方法为 "learned_ave" 时使用的注意力分支丢弃率num_blocks: 24 # 编码器的块数量dropout_rate: 0.1 # dropout 概率positional_dropout_rate: 0.1 # 位置编码的 dropout 概率attention_dropout_rate: 0.1 # 注意力层的 dropout 概率input_layer: conv2d # 输入层类型,这里使用二维卷积stochastic_depth_rate: 0.0 # 随机深度的比例# 解码器相关配置
decoder: transformer # 使用的解码器架构,这里是 Transformer
decoder_conf:attention_heads: 4 # 注意力头的数量linear_units: 2048 # 解码器中的线性层单元数num_blocks: 6 # 解码器的块数量dropout_rate: 0.1 # dropout 概率positional_dropout_rate: 0.1 # 位置编码的 dropout 概率self_attention_dropout_rate: 0. # 自注意力层的 dropout 概率src_attention_dropout_rate: 0. # 源注意力层的 dropout 概率# 混合 CTC/注意力模型相关配置
model_conf:ctc_weight: 0.3 # CTC 损失的权重lsm_weight: 0.1 # 标签平滑选项length_normalized_loss: false # 是否使用长度归一化损失# 小批量相关配置
batch_type: numel # 批次类型,这里使用元素数量
batch_bins: 25000000 # 批次大小的总元素数# 优化相关配置
accum_grad: 1 # 梯度累积的次数
grad_clip: 5 # 梯度裁剪阈值
max_epoch: 60 # 最大训练轮数
val_scheduler_criterion: # 验证调度器标准- valid # 验证集- acc # 准确率
best_model_criterion: # 最佳模型标准
- - valid # 验证集- acc # 准确率- max # 最大值
keep_nbest_models: 10 # 保留的最佳模型数量# 优化器配置
optim: adam # 使用的优化器,这里是 Adam
optim_conf:lr: 0.001 # 学习率weight_decay: 0.000001 # 权重衰减# 学习率调度器配置
scheduler: warmuplr # 使用的学习率调度器类型
scheduler_conf:warmup_steps: 35000 # 暖启动步骤数num_workers: 4 # 数据加载器的工作线程数量
use_amp: true # 是否使用自动混合精度
unused_parameters: false # 如果在 DDP 中有一些参数未使用,则设置为 true# 规格增强相关配置
specaug: specaug # 使用的规格增强方法
specaug_conf:apply_time_warp: true # 是否应用时间扭曲time_warp_window: 5 # 时间扭曲窗口大小time_warp_mode: bicubic # 时间扭曲模式apply_freq_mask: true # 是否应用频率遮罩freq_mask_width_range: # 频率遮罩宽度范围- 0- 27num_freq_mask: 2 # 频率遮罩的数量apply_time_mask: true # 是否应用时间遮罩time_mask_width_ratio_range: # 时间遮罩宽度比例范围- 0.- 0.05num_time_mask: 10 # 时间遮罩的数量