ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ESPnet 儿童语音识别实战:基于 MyST 数据集的 WavLM + Transformer 端到端 ASR Recipe 全解析

ESPnet 儿童语音识别实战:基于 MyST 数据集的 WavLM + Transformer 端到端 ASR Recipe 全解析 人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载MySTMy Science Tutor是首个大规模儿童会话语音语料库其儿童语音的声学特性音高偏高、发音不稳定、词汇量有限与成人语音差异显著是 ASR 领域公认的高难度评测场景。本文以 egs2/myst/asr1 这一 ESPnet 官方 Recipe 为主体完整讲解从 LDC 数据集获取、目录配置、FLAC 转 WAV、Kaldi 风格数据准备到基于 WavLM 自监督前端 Transformer 编码器的模型训练、解码配置与 WER/CER/TER 评测结果的完整技术链路。读完本文你将掌握如何在 ESPnet2 框架下复现儿童语音识别模型myst_wavlm_aed_transformer并能根据 run.sh 与 conf/tuning 下的配置模板改造出属于自己的儿童语音 ASR 系统。一、MyST 数据集与 Recipe 概述My Science Tutor (MyST) 是一套大规模儿童会话语音语料库由 Pradhan、Cole 与 Ward 等人在 LREC-COLING 2024 上正式发布详见 README.md 的参考文献。该语料库收录了儿童与虚拟科学导师进行开放式对话的语音覆盖真实课堂教学场景其内容包含大量口语化表达、儿童特有的发音偏差以及会话性语音特征因而成为评估儿童语音识别能力的代表性基准。egs2/myst/asr1/README.md 即 ESPnet 官方为 MyST 提供的完整 Recipe包含数据准备、训练配置与评测结果三大部分。其核心技术路线可以概括为前端使用 S3PRL 接入 WavLM-Large 自监督模型提取多层融合特征编码器Transformer18 层并配套提供 Conformer12 层备选配置解码器标准 Transformer 解码器采用 CTC 与注意力机制联合解码分词英文 BPEunigram 模式词表 5000训练数据配合 0.9/1.0/1.1 三倍速扰动扩充训练集。该 Recipe 的目录结构包含数据准备脚本 local/data.sh、数据集路径配置 db.sh、环境配置 path.sh 与 cmd.sh、训练入口 run.sh以及完整的一组 conf 配置文件。二、数据获取与路径配置2.1 从 LDC 下载数据集MyST 数据集由 LDCLinguistic Data Consortium发行目录编号为LDC2021S05。Recipe 本身不会自动下载该数据db.sh 中MYSTdownloads仅为占位约定需要用户自行从 LDC 目录获取并解压到本地。# 下载并解压后编辑 db.sh 指定数据集根目录 $ vim db.sh MYST/path/to/myst解压后的数据集目录结构应如下对应 README.md 的检查清单/path/to/myst └── myst_child_conv_speech ├── data ├── docs └── index.htmlRecipe 的数据准备阶段依赖myst_child_conv_speech这一子目录其中data目录存放按train/development/test划分的音频与转写文件docs目录存放语料说明文档。2.2 数据集路径校验local/data.sh 在 stage 1 会执行路径校验if [ -z ${MYST} ]; then log Fill the value of MYST of db.sh exit 1 fi if [ ! -d ${MYST}/myst_child_conv_speech ]; then echo stage 1: Please download data from https://catalog.ldc.upenn.edu/LDC2021S05 and save to ${MYST} exit 1 fi从源码可以看出MYST变量为空或myst_child_conv_speech目录缺失时Recipe 会直接终止并给出提示这是避免后续阶段误操作的重要保护逻辑。三、数据准备FLAC 转 WAV 与 Kaldi 风格目录构建3.1 音频格式转换stage 2MyST 原始音频为 FLAC 格式。Recipe 通过 local/flac_to_wav.py 调用 ffmpeg 完成格式转换并支持多进程并行加速def flac2wav(filepath): assert filepath.endswith(.flac) outfilepath filepath[:-5] .wav cmd fffmpeg -hide_banner -loglevel error -y -i {filepath} {outfilepath} _ os.system(cmd) if os.path.isfile(outfilepath): os.remove(filepath)转换完成后原始的.flac文件会被删除以释放磁盘空间。该转换由data.sh的 stage 2 调度执行${cmd} JOB1:1 ${logdir}/flac_to_wav.JOB.log \ python local/flac_to_wav.py \ --multiprocessing \ --njobs ${nj} \ --myst_dir ${original_dir}其中nj默认值为 32见 data.sh 的nj32可以通过--njobs控制并行度。需要特别说明的是FLAC 转换是可选的。在 run.sh 中作者给出了两种路径的注释说明# if your sox supports flac file, set local_data_opts and audio_format as below. #local_data_opts #audio_formatflac # if your sox does not support flac file, set local_data_opts and audio_format as below. local_data_opts--flac2wav true audio_formatwav也就是说若本机 sox 支持 FLAC 解码可以保持audio_formatflac并跳过转换否则启用--flac2wav true将audio_format设为wav。当前 Recipe 默认采用后者WAV 格式。3.2 数据准备stage 3local/prepare_data.py 负责将原始 MyST 目录转换为 ESPnet2 所需的 Kaldi 风格数据目录。其核心逻辑为将原始分区train/development/test映射为train/dev/test注意development→dev的命名映射递归扫描各分区下的全部.wav或.flac文件对每个音频文件在相同目录下寻找同名.trn转写文件audio_base .trn生成四个标准文件text音频ID 转写文本utt2spk音频ID 学生ID说话人 ID 取自路径中的学生目录spk2utt由utt2spk派生wav.scp音频ID 音频绝对路径for audio_file in tqdm(audio_files): student_id audio_file.split(/)[-3] session_dir os.path.dirname(audio_file) audio_base os.path.splitext(os.path.basename(audio_file))[0] transcription_file os.path.join(session_dir, audio_base .trn) if os.path.isfile(transcription_file): with open(transcription_file, r) as trn: transcription trn.read().strip() text_data f{audio_base} {transcription}\n utt2spk_data f{audio_base} {student_id}\n wav_scp_data f{audio_base} {audio_file}\n从代码可见该脚本以 10000 条cache_size 10000为缓冲阈值批量写入文件避免海量语音文件导致的内存压力只有存在对应.trn转写文件的音频才会进入数据集保证了 text 与音频的一一对应。data.sh在调用prepare_data.py之后还会执行一系列后处理for dset in $partitions; do # 对 text / utt2spk / wav.scp 排序 sort $f -o $f # 由 utt2spk 生成 spk2utt utils/utt2spk_to_spk2utt.pl $utt2spk_file $spk2utt_file # 移除 UTF-8 空白字符转为 ASCII 转写 iconv -f utf-8 -t ascii//TRANSLIT $text_file ${text_file}.ascii # 校验数据目录完整性 utils/validate_data_dir.sh --no-feats $data_partition done这里有两处值得注意的工程细节转写文本 ASCII 化iconv -f utf-8 -t ascii//TRANSLIT将转写中的 UTF-8 字符如智能引号、连字符变体转换为 ASCII 等价形式规避后续分词与编码阶段可能出现的 Unicode 异常目录校验调用 ESPnet 通用脚本 validate_data_dir.sh 检查text、utt2spk、spk2utt、wav.scp的一致性如 ID 是否对齐、格式是否合法确保数据质量。完成 stage 3 后data/{train,dev,test}三个标准数据目录即就绪可进入特征与训练阶段。四、训练配置WavLM 前端 Transformer 编码器4.1 run.sh 顶层参数run.sh 是整个训练流程的入口脚本它通过 ESPnet2 通用的 asr.sh 驱动完整训练管线。其关键参数如下train_settrain valid_setdev test_setstest encodertransformer frontendwavlm asr_configconf/tuning/train_asr_${frontend}_${encoder}.yaml inference_configconf/decode_asr.yaml nbpe5000 bpemodeunigram local_data_opts--flac2wav true audio_formatwav min_wav_duration0.3 ./asr.sh \ --lang en \ --gpu_inference true \ --token_type bpe \ --bpemode ${bpemode} \ --nbpe ${nbpe} \ --max_wav_duration 30 \ --speed_perturb_factors 0.9 1.0 1.1 \ --use_lm false \ --feats_normalize utt_mvn \ --feats_type raw \ --asr_config ${asr_config} \ --inference_config ${inference_config} \ --inference_asr_model valid.acc.best.pth \ --train_set ${train_set} \ --valid_set ${valid_set} \ --test_sets ${test_sets} \ --lm_train_text data/${train_set}/text \ --bpe_train_text data/${train_set}/text \ --local_data_opts ${local_data_opts} \ --audio_format ${audio_format} \ --min_wav_duration ${min_wav_duration} \ $逐项解读这些参数的作用默认值可对照 asr.sh 模板参数本 Recipe 取值说明--token_type bpebpe子词切分方式为 BPE--bpemode unigramunigramBPE 训练算法为 unigram--nbpe 50005000BPE 词表规模为 5000--speed_perturb_factors 0.9 1.0 1.1三倍速扰动对训练语音做 0.9 / 1.0 / 1.1 倍速扰动以扩充数据、增强鲁棒性--use_lm false关闭不使用外部语言模型解码纯靠 AM CTC--feats_normalize utt_mvn逐句 MVN每句话独立做均值方差归一化无全局 CMVN 统计--feats_type raw原始波形直接输入原始音频由前端模型提取特征--max_wav_duration 3030 秒过滤超长音频--min_wav_duration 0.30.3 秒过滤过短音频作者注释说明这是为了规避 stage 11 的TooShortUttError--inference_asr_model valid.acc.best.pth最优模型以验证集准确率最高的 checkpoint 用于解码--gpu_inference trueGPU 解码解码阶段使用 GPU 加速其中--min_wav_duration 0.3是一个值得注意的调参细节ESPnet 的数据准备阶段会对过短音频抛出TooShortUttError将该阈值从模板默认值0.1 秒提高到 0.3 秒可以在儿童语音存在大量极短的口头回应如 yeah、okay场景下显著减少训练中断。4.2 WavLM 前端与特征下采样核心训练配置 train_asr_wavlm_transformer.yaml 定义了模型架构。前端部分采用 S3PRL 接入自监督预训练模型 WavLM-Large并将上游参数全部冻结freeze_param: [ frontend.upstream ] frontend: s3prl frontend_conf: frontend_conf: upstream: wavlm_large download_dir: ./hub multilayer_feature: True preencoder: linear preencoder_conf: input_size: 1024 output_size: 80关键设计点frontend: s3prlESPnet2 的 S3PRL 前端会从指定download_dir此处为./hub加载预训练上游模型首次运行会自动下载 WavLM-Large 权重multilayer_feature: True融合 WavLM-Large 多层 Transformer 的输出特征而非仅取最后一层可提供更丰富的声学表征freeze_param: [frontend.upstream]冻结上游 WavLM 的全部参数训练时只更新下游模块。这样既保留了大规模预训练知识又大幅降低了显存占用与训练开销preencoder: linear线性投影层将 WavLM 的 1024 维多层融合特征下采样到 80 维与经典 FBank 特征维度对齐供编码器消费。4.3 Transformer 编码器 / 解码器encoder: transformer encoder_conf: output_size: 256 attention_heads: 4 linear_units: 1024 num_blocks: 18 dropout_rate: 0.1 positional_dropout_rate: 0.1 attention_dropout_rate: 0.1 input_layer: conv2d2 normalize_before: true decoder: transformer decoder_conf: attention_heads: 4 linear_units: 2048 num_blocks: 6 dropout_rate: 0.1 positional_dropout_rate: 0.1 self_attention_dropout_rate: 0.1 src_attention_dropout_rate: 0.1编码器为 18 层 Transformer隐藏维度 256、4 注意力头、FFN 隐层 1024输入层使用两层卷积conv2d2对 80 维特征做时间与频率维度的下采样解码器为 6 层 TransformerFFN 隐层 2048。各 dropout 均设置为 0.1normalize_before: true采用 Pre-LN 结构LayerNorm 置于残差之前这一配置在现代 Transformer 训练中收敛更稳定。4.4 训练目标与正则model_conf: ctc_weight: 0.3 lsm_weight: 0.1 length_normalized_loss: false extract_feats_in_collect_stats: falsectc_weight: 0.3CTC 损失与注意力损失的加权系数。损失函数为L ctc_weight * L_ctc (1 - ctc_weight) * L_att0.3 是 ESPnet 常见的混合训练取值与解码配置中的ctc_weight保持一致lsm_weight: 0.1标签平滑系数 0.1抑制模型过度自信、提升泛化extract_feats_in_collect_stats: false由于采用utt_mvn逐句归一化无需在统计收集阶段提取特征与之配套的feats_normalize utt_mvn在 run.sh 中设置。4.5 批处理、优化器与数据增强batch_type: numel batch_bins: 16000000 accum_grad: 4 max_epoch: 20 best_model_criterion: - - valid - acc - max keep_nbest_models: 4 use_amp: true optim: adam optim_conf: lr: 0.002 weight_decay: 0.000001 scheduler: warmuplr scheduler_conf: warmup_steps: 15000 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, 27] num_freq_mask: 2 apply_time_mask: true time_mask_width_ratio_range: [0., 0.05] num_time_mask: 5batch_type: numelbatch_bins: 16000000以元素总数numel为粒度动态组批将每个 batch 的张量元素数控制在约 1600 万。这也解释了结果目录名exp/asr_asr_train_asr_wavlm_transformer_raw_en_bpe5000_sp_bs16000000中bs16000000的来历accum_grad: 4每 4 个 batch 累积一次梯度更新等效扩大 batch sizemax_epoch: 20训练上限 20 个 epochuse_amp: true启用自动混合精度训练显著降低显存与训练时间优化器Adamlr0.002weight_decay1e-6 WarmupLR 调度器warmup 15000 步这是 Transformer 类模型的标准配置SpecAugment时间扭曲窗口 5、频域掩码2 个宽度 0–27、时域掩码5 个宽度比例 0–0.05用于增强声学特征鲁棒性。4.6 Conformer 备选配置除 Transformer 外Recipe 还提供了 train_asr_wavlm_conformer.yaml 作为备选。其前端、preencoder、解码器与训练超参完全一致仅编码器替换为 12 层 Conformerencoder: conformer encoder_conf: output_size: 256 attention_heads: 4 linear_units: 1024 num_blocks: 12 macaron_style: true rel_pos_type: latest pos_enc_layer_type: rel_pos selfattention_layer_type: rel_selfattn activation_type: swish use_cnn_module: true cnn_module_kernel: 31Conformer 在 Transformer 注意力基础上引入了卷积模块cnn_module_kernel: 31、相对位置编码rel_posrel_selfattn与 Macaron 式前馈结构activation_type: swish使用 Swish 激活。该配置训练上限放宽到max_epoch: 70并保留keep_nbest_models: 10个最优模型。想要实验不同编码器只需修改 run.sh 中的encodertransformer为conformer配置文件路径由conf/tuning/train_asr_${frontend}_${encoder}.yaml自动拼出。五、解码与评测5.1 解码配置decode_asr.yaml 定义推理阶段参数beam_size: 20 ctc_weight: 0.3 lm_weight: 0.0 maxlenratio: 0.0 minlenratio: 0.0 penalty: 0.0beam_size: 20束搜索宽度ctc_weight: 0.3与训练目标一致推理时在 CTC 前缀得分与注意力得分之间以 0.3 / 0.7 加权联合打分lm_weight: 0.0由于--use_lm false语言模型权重置零maxlenratio / minlenratio均为 0.0长度由模型自回归预测不施加外部长度约束。解码由--gpu_inference true在 GPU 上执行模型选择验证集准确率最优的valid.acc.best.pth由 run.sh 的--inference_asr_model指定。5.2 官方评测结果README.md 的 RESULTS 章节 记录了基于 WavLM Transformer训练目录exp/asr_asr_train_asr_wavlm_transformer_raw_en_bpe5000_sp_bs16000000在测试集上的完整评测包含字级CER、词级WER与句级TER三个维度的指标WER测试集datasetSntWrdCorrSubDelInsErrS.Errdecode_asr_asr_model_valid.acc.best/test1318020230688.47.64.03.415.061.9CER测试集datasetSntWrdCorrSubDelInsErrS.Errdecode_asr_asr_model_valid.acc.best/test13180101604393.22.14.73.610.461.9TER测试集datasetSntWrdCorrSubDelInsErrS.Errdecode_asr_asr_model_valid.acc.best/test1318022824086.46.76.84.017.661.9解读这些数字测试集共 13180 句Snt其中WER 15.0%、CER 10.4%、TER 17.6%WER 的误差构成中替换错误Sub 7.6%占比最高删除Del 4.0%与插入Ins 3.4%相对较低CER字符级显著低于 WER说明儿童口语中高频出现的多词短语错误主要源于词边界与功能词层面S.Err句子错误率高达 61.9%即在约六成的句子上模型产生了至少一个词错误这直观反映了儿童会话语音语音重叠、自发言语、不完整句的整体难度。这些评测结果来自 Recipe 作者在 2024 年 11 月的实际训练与解码可作为复现时的对照基线。评测过程本身由 ESPnet 通用脚本 show_asr_result.sh 等工具完成读者可在自己的exp/目录下运行同一脚本生成报告。六、复现环境与模型发布6.1 实验环境快照README.md 的 Environments 章节 记录了生成上述结果时的精确软件环境复现时可作为版本对齐依据项目版本日期2024-11-25CSTPython3.12.3AnacondaESPnetespnet 202409PyTorch2.4.0Git commit6b5c6230a794aa4a5df872be69e417a3fbfe821b2024-11-246.2 预训练模型训练好的最优模型以myst_wavlm_aed_transformer为名对外发布托管于 Hugging Face 的 espnet 组织详见 README.md。该模型可直接用于推理或微调例如通过 ESPnet 标准的模型加载接口按名称拉取无需重新训练即可对儿童语音进行识别。七、从零运行 Recipe 的完整步骤综合前述各章节在具备 ESPnet 环境Python 3.12、PyTorch 2.4、espnet 202409 及以上版本与 GPU 的前提下完整运行该 Recipe 的步骤如下# 1. 进入 recipe 目录 cd egs2/myst/asr1 # 2. 编辑 db.sh填入数据集路径 vim db.sh # MYST/path/to/myst # 3. 按需选择调度后端默认 local单机直接跑 vim cmd.sh # cmd_backendlocal # 4. 依次执行数据准备stage 1-3 ./run.sh --stage 1 --stop_stage 3 # 5. 执行训练默认全套流程从 stage 开始自动衔接 ./run.sh --stage 4 --stop_stage 12 # 6. 或一次性从零跑到评测 ./run.sh其中run.sh末尾的$允许将命令行参数透传给 asr.sh如--stage、--stop_stage、--ngpu等实现灵活的断点续跑。需要注意首次训练 WavLM 前端会从./hub目录下载 WavLM-Large 权重由 train_asr_wavlm_transformer.yaml 的download_dir: ./hub指定数据准备阶段若 sox 支持 FLAC可保持 FLAC 管线否则按 run.sh 默认的--flac2wav trueaudio_formatwav执行训练与解码所需的算力较高18 层 Transformer 6 层解码器、numel 组批、AMP 混合精度建议在配备多卡 GPU 的节点上运行并通过 cmd.sh 切换至 Slurm / PBS / SGE 等集群后端。八、总结与扩展方向MyST Recipe 是 ESPnet2 中预训练自监督前端 下游轻量 ASR范式的典型案例通过冻结 WavLM-Large 并叠加 80 维线性投影将大规模预训练表征与可训练的 Transformer 编码器高效结合配合速度扰动、SpecAugment、混合精度与 numel 动态组批在 20 个 epoch 内即在儿童会话语音上取得 WER 15.0% 的成绩。若要在该 Recipe 基础上继续探索仓库内已有现成路径可供参考更换编码器将 run.sh 的encoder改为conformer即可切换至 train_asr_wavlm_conformer.yaml12 层 Conformer 相对位置编码更换上游模型修改配置中的upstream: wavlm_large为其他 S3PRL 支持的预训练模型如 HuBERT、Wav2Vec2 等对比不同自监督表征在儿童语音上的表现引入语言模型将--use_lm false改为启用 LM 训练或接入外部语言模型降低替换错误数据规模实验调整--speed_perturb_factors、--min_wav_duration等参数研究数据增强与时长过滤对儿童语音识别的影响。参考文献[1] Pradhan, Sameer, Ronald Cole, and Wayne Ward. My Science Tutor (MyST)–a Large Corpus of Childrens Conversational Speech. Proceedings of the 2024 Joint International Conference on Computational Linguistics, Language Resources and Evaluation (LREC-COLING 2024). 2024.赞分享人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载相关推荐ESPnet 儿童语音识别实战CMU Kids 数据集的 WavLM 特征 Transformer/Conformer ASR Recipe 全解析ESPnet 儿童语音识别实战CMU Kids 数据集的 WavLM 特征 Transformer/Conformer ASR Recipe 全解析 导读人工智能语音音频深度学习NLPESPnet OGI Kids Speech ASR 实战Branchformer-Transformer 儿童语音识别 Recipe 全解析ESPnet OGI Kids Speech ASR 实战Branchformer Transformer 儿童语音识别 Recipe 全解析 本文基于 ES人工智能语音音频深度学习NLPespnet 端到端语音意图识别实战HarperValley 数据集 ASR Recipe 完整解析espnet 端到端语音意图识别实战HarperValley 数据集 ASR Recipe 完整解析 导读 本文围绕 espnet 仓库中 egs2/harp人工智能语音音频深度学习NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表