- 人工智能
- 语音
- 音频
- 深度学习
- NLP
【免费下载链接】espnet
End-to-End Speech Processing Toolkit
ESPnet2 为 SLUE 2022 Challenge(基于 VoxCeleb 音频的语音情感理解任务)提供了完整的端到端训练配方,位于 egs2/slue-voxceleb/asr1/。该任务要求模型同时输出语音转写文本和情感意图标签(Neutral / Positive / Negative),本文将基于该配方的结果文档 README.md 逐层展开:从数据准备、流水线结构到两组核心实验的完整网络配置与意图分类评测脚本,帮助读者掌握"ASR + 意图联合建模"这一 ESPnet2 多目标范式的全流程实现。
一、任务与实验环境概述
SLUE(Sentiment-aware Language Understanding Evaluation)VoxCeleb 子任务的评测方式是:模型对每条语音先输出情感意图标签、再输出转写文本,二者拼接在同一行文本中(形如Positive hello world)。评测时先比较意图标签的逐行一致率(Intent Classification Accuracy),再用 sclite 计算去掉意图词后的转写 WER。
原结果文档记录了以下运行环境,可作为复现该结果的参考基线:
| 项 | 版本 |
|---|---|
| 记录时间 | Tue Dec 28 12:28:28 EST 2021 |
| Python | 3.9.5 |
| ESPnet | 0.10.3a2 |
| PyTorch | 1.8.1+cu102 |
| Git 提交 | 6bf3c2a4f138d35331634d2e879bbc5c32a5266e(2021-12-22) |
需要注意:当前仓库代码已在该版本之后持续演进,配方中的local/data.sh、local/score.sh等脚本结构保持一致,但asr.sh的 stage 划分与参数可能有更新,复现时以当前仓库脚本为准。
二、数据准备:从 TSV 标注到 Kaldi 风格数据目录
2.1 数据源说明
配方依赖 VoxCeleb 数据,需要在 db.sh 中手动设置VOXCELEB环境变量(该数据无法自动下载):
VOXCELEB=若未设置,local/data.sh 在 stage 1 检查不到VOXCELEB/LICENSE.txt时会直接报错退出。
2.2 三个数据划分与 TSV 映射
local/data_prep_slue.py 将官方 TSV 标注文件转换为 ESPnet2 所需的text/wav.scp/utt2spk,三个划分分别对应:
| 划分 | TSV 文件 | 音频目录前缀 |
|---|---|---|
| train | slue-voxceleb_fine-tune.tsv | fine-tune_raw/ |
| devel | slue-voxceleb_dev.tsv | dev_raw/ |
| test | slue-voxceleb_test_blind.tsv | test_raw/ |
脚本中有两个值得注意的细节:
意图标签与转写拼接:非盲测集的
text文件内容格式为<intent> <speaker>,即:words = ( row[4].replace(" ", "_") + " " + row[1].encode("ascii", "ignore").decode() )意图词(第 4 列)中的空格被替换为下划线以保证单 token 匹配,后面跟随说话人字段。
<mixed>意图的样本会被直接跳过。盲测集处理:test 集没有参考转写,
text中意图位填<blank>(提交结果需提交到官方 leaderboard),说话人取自 TSV 第 1 列。
2.3 目录整理与 BPE 词表
local/data.sh的 stage 2 完成三件事:对text/wav.scp/utt2spk排序、用utt2spk_to_spk2utt.pl生成spk2utt并用utils/validate_data_dir.sh --no-feats校验目录;随后调用 local/run_spm.sh 构建 BPE 词表,并把原始data目录替换为data_bpe_1000(即 1000 词 BPE 词表版本),供后续token_type=word之外的模式复用。
三、训练流水线:run.sh 与 asr.sh 的 stage 结构
3.1 入口命令
run.sh 是配方的入口,默认配置如下:
train_set="train" valid_set="devel" test_sets="test devel" asr_config=conf/train_asr.yaml ./asr.sh \ --lang en \ --ngpu 1 \ --use_lm false \ --nbpe 5000 \ --token_type word \ --feats_type raw \ --gpu_inference true \ --max_wav_duration 30 \ --feats_normalize utterance_mvn \ --inference_nj 8 \ --inference_asr_model valid.acc.ave_10best.pth \ --asr_config "${asr_config}" \ --train_set "${train_set}" \ --valid_set "${valid_set}" \ --test_sets "${test_sets}" "$@"关键参数解读:
| 参数 | 取值 | 作用 |
|---|---|---|
--token_type word | word | 使用词级词表(data/en_token_list/word/tokens.txt),不训练 BPE;意图标签作为一个独立词进入词表 |
--feats_type raw | raw | 直接消费 16 kHz 原始波形,前端在训练时在线提取(dump/raw) |
--feats_normalize utterance_mvn | 逐句 MVN | 该配方不使用全局 MVN 统计,而是逐句均值方差归一化,跳过 stage 10 的 global_mvn 汇总 |
--max_wav_duration 30 | 30 秒 | stage 4 中过滤时长超出范围的句子(VoxCeleb 音频普遍较短,此处放宽上限) |
--inference_asr_model valid.acc.ave_10best.pth | 10 best 平均 | 解码时使用验证集准确率前 10 名 epoch 的平均权重模型,与 README 中实验名valid.acc.ave_10best对应 |
--use_lm false | 关闭 LM | 跳过 stage 6~8 的语言模型训练,只训练 ASR 模型 |
--gpu_inference true | GPU 解码 | 配合--inference_nj 8并行 8 个解码任务 |
3.2 asr.sh 的 stage 流程
asr.sh 是 ESPnet2 的标准 ASR 模板,与本配方相关的 stage 为:
- Stage 1:调用
local/data.sh准备data/{train,devel,test}; - Stage 3:
feats_type=raw时,用scripts/audio/format_wav_scp.sh规范化wav.scp(统一格式与采样率),生成dump/raw/org/*; - Stage 4:按
min/max_wav_duration与utt2num_samples过滤过长/过短句子,并删除空文本; - Stage 5:
token_type=word时通过espnet2.bin.tokenize_text --write_vocabulary true从lm_train.txt统计词级词表,词表首行固定为<blank>(CTC blank / ignore index),末行为<sos/eos>; - Stage 10:以
--collect_stats true运行espnet2.bin.asr_train收集 shape 统计(由于--feats_normalize utterance_mvn,会跳过 sum 统计的聚合); - Stage 11:加载
--config conf/train_asr.yaml进行正式训练; - Stage 12~13:分别对
test与devel解码,并调用local/score.sh完成意图准确率、Macro F1 与 WER 评测。
四、核心实验配置详解
结果文档记录了两组 Conformer 实验,对应两份配置文件。两者均采用"编码器 + Transformer 解码器 + Specaugment 谱增强"的联合建模结构,差异在于输入表示与模型规模。
4.1 实验一:Conformer 编码器 + Transformer 解码器(谱增强)
配置文件:conf/tuning/train_asr_conformer.yaml,完整内容如下:
# network architecture # encoder related encoder: conformer encoder_conf: output_size: 512 attention_heads: 8 linear_units: 2048 num_blocks: 12 dropout_rate: 0.1 positional_dropout_rate: 0.1 attention_dropout_rate: 0.1 input_layer: conv2d normalize_before: true macaron_style: true pos_enc_layer_type: "rel_pos" selfattention_layer_type: "rel_selfattn" activation_type: "swish" use_cnn_module: true cnn_module_kernel: 31 decoder: transformer decoder_conf: attention_heads: 8 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 optim: adam optim_conf: lr: 0.0002 scheduler: warmuplr # pytorch v1.1.0+ required #Tune warmup steps scheduler_conf: warmup_steps: 25000 max_epoch: 50 model_conf: ctc_weight: 0.3 lsm_weight: 0.1 length_normalized_loss: false extract_feats_in_collect_stats: false 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 - 30 num_freq_mask: 2 apply_time_mask: true time_mask_width_range: - 0 - 40 num_time_mask: 2 best_model_criterion: - - valid - acc - max keep_nbest_models: 10配置要点:
- 编码器:12 层 Conformer,隐藏维度 512、8 头注意力、前馈内维 2048,
input_layer: conv2d作为子采样前端,rel_pos相对位置编码 +rel_selfattn相对自注意力 + macaron 风格的双前馈结构,CNN 模块卷积核为 31; - 解码器:6 层标准 Transformer,线性内维 2048;
- 优化策略:Adam(lr=2e-4)+ WarmupLR(25000 步预热),最多 50 epoch;
- 模型损失:
ctc_weight: 0.3表示 CTC 与 attention 损失的混合训练权重,lsm_weight: 0.1为 label smoothing 系数; - Specaugment:时间扭曲(窗口 5,bicubic 插值)+ 2 条频带掩码(宽度 0~30)+ 2 条时域掩码(宽度 0~40),与原文档"with spectral augmentation"的描述一致;
- 模型选择:按验证集
acc最大值挑选 best model,keep_nbest_models: 10保留 10 个最优 epoch,正是解码端valid.acc.ave_10best.pth的来源。
由于该实验使用feats_type=raw+utterance_mvn,音频前端为 ESPnet2 内置的在线 FBank 提取(配合--feats_normalize utterance_mvn做逐句归一化),不依赖外部 SSL 特征。
结果文档同时注明该模型有预训练权重发布于 Hugging Face(espnet/siddhana_slue_asr_train_asr_conformer_raw_en_word_valid.acc.ave_10best),可直接下载用于推理对照。
4.2 实验二:Conformer(output_size 256)+ 冻结 wav2vec 2.0 上游
配置文件:conf/tuning/train_asr_wav2vec2_conformer_small.yaml。该文件与 conf/train_asr.yaml(run.sh默认引用的配置)内容一致,核心差异在于引入 s3prl 前端与参数冻结:
batch_type: numel batch_bins: 6000000 encoder: conformer accum_grad: 2 encoder_conf: output_size: 256 attention_heads: 4 linear_units: 1024 num_blocks: 12 ... input_layer: conv2d2 decoder: transformer decoder_conf: attention_heads: 4 linear_units: 2048 num_blocks: 6 ... optim: adam optim_conf: lr: 0.002 weight_decay: 1.0e-06 scheduler: warmuplr scheduler_conf: warmup_steps: 5000 max_epoch: 100 freeze_param: [ "frontend.upstream" ] frontend: s3prl frontend_conf: frontend_conf: upstream: wav2vec2_large_ll60k download_dir: ./hub multilayer_feature: True preencoder: linear preencoder_conf: input_size: 1024 # 若更换 upstream,需同步修改此值 output_size: 80与实验一的结构性差异:
- SSL 前端:
frontend: s3prl加载wav2vec2_large_ll60k上游模型提取帧级特征(multilayer_feature: True聚合多层输出),再经线性 preencoder 从 1024 维投影到 80 维,作为 Conformer 的输入;freeze_param: ["frontend.upstream"]冻结 wav2vec 2.0 全部参数,只训练 preencoder 与下游 ASR 模型——这是一种"自监督特征 + 轻量判别头"的半微调方案; - 更小的编码器:
output_size: 256、4 头注意力、linear_units: 1024,input_layer: conv2d2(2 步下采样); - 批处理与优化:
batch_type: numel+batch_bins: 6000000(按 600 万个样本点动态攒批)、accum_grad: 2梯度累积、lr=2e-3 配 5000 步 warmup、最多 100 epoch——比实验一更长的训练预算以弥补冻结特征的表达上限; - Specaugment 与模型选择标准与实验一完全相同。
该配置同样适用extract_feats_in_collect_stats: false,即 stage 10 收集统计时生成 dummy stats 而非真实前向提特征,加快统计阶段。
4.3 备选:Conformer + Hugging Face 文本后编码器
配方中还提供了一份 conf/tuning/train_asr_conformer_nlu.yaml,它在实验一结构之上增加postencoder: hugging_face_transformers(bert-base-uncased,经freeze_param冻结),用 BERT 对解码器输出做文本语义后处理,适合意图类别依赖上下文语义的场景;conf/tuning/train_asr_conformer_s3prl.yaml则是实验一与 s3prl 前端的组合变体。这些变体可作为后续调优的起点。
五、意图评测脚本与指标计算
5.1 评分流程
local/score.sh 在 stage 13 被调用,默认评测目录为inference_asr_model_valid.acc.ave_10best/{devel,test},依次执行三步:
- local/score.py:逐行比对
score_wer/hyp.trn与ref.trn的第一个 token(即意图标签),计算准确率;同时把意图词剔除后写出hyp_asr.trn/ref_asr.trn供 WER 评测; - local/generate_asr_files.py:生成纯 ASR 评测文件;
- local/f1_score.py:基于
sklearn.metrics.classification_report输出逐类 Precision / Recall / F1,并额外打印限定labels=["Neutral", "Positive"]的报告(剔除样本极少的 Negative 类),最终返回 macro 平均 F1。
最后score.sh用 sclite 对剔除意图词后的*_asr.trn计算 WER,结果写入score_wer/result_asr.txt并 grep 出Avg/SPKR行。
5.2 评测口径说明
从 local/score.py 源码看,意图准确率定义为1 - (error / len(hyp_lines)),其中error是逐行首 token 不匹配的句子数,与逐行严格相等比较——这意味着意图标签词表中空格必须预先处理(数据准备时已将空格替换为下划线)。f1_score.py的 Macro F1 使用f1_score(..., average="macro"),对类别不平衡非常敏感。
六、实验结果
以下结果完整继承自 README.md,评测集为 devel(954 条)。
实验一:Conformer 编码器 + Transformer 解码器(谱增强)
| dataset | Snt | Intent Classification Accuracy (%) | Intent Classification Macro F1 (%) |
|---|---|---|---|
| inference_asr_model_valid.acc.ave_10best/devel | 954 | 80.2 | 39.7 |
逐类分类报告:
| Label | Snt | Prec | Recall | F1 |
|---|---|---|---|---|
| Neutral | 784 | 85 | 93 | 89 |
| Positive | 167 | 40 | 24 | 30 |
| Negative | 3 | 0 | 0 | 0 |
实验二:Conformer(output_size 256)+ 冻结 wav2vec 2.0 上游
| dataset | Snt | Intent Classification Accuracy (%) | Intent Classification Macro F1 (%) |
|---|---|---|---|
| inference_asr_model_valid.acc.ave_10best/devel | 954 | 79.0 | 44.0 |
逐类分类报告:
| Label | Snt | Prec | Recall | F1 |
|---|---|---|---|---|
| Neutral | 784 | 88 | 87 | 87 |
| Positive | 167 | 46 | 43 | 44 |
| Negative | 3 | 0 | 0 | 0 |
两组结果可以读出几点信息:
- 类别高度不平衡是主导因素:devel 集中 Neutral 占 784/954,Positive 仅 167,Negative 只有 3 条。两组的 Accuracy(80.2% / 79.0%)与 Macro F1(39.7% / 44.0%)之间的落差,正是 Neutral 高召回压制了宏观指标;
- 实验二在 Accuracy 上略低 1.2 个百分点,但 Positive 类的 Precision(40 → 46)与 Recall(24 → 43)均明显更高,Macro F1 提升 4.3 个百分点——冻结 wav2vec 2.0 特征 + 更小的 Conformer 反而对少数类更友好;
- Negative 类两例均为 3 条样本,从源码结构看其指标无统计意义(
f1_score.py中额外打印限定["Neutral", "Positive"]的报告也印证了这一点)。
七、复现与扩展建议
基于当前仓库的配方结构,复现路径为:
- 按 db.sh 设置
VOXCELEB指向官方数据包(含LICENSE.txt、三个 TSV 与fine-tune_raw/、dev_raw/、test_raw/音频); - 在
egs2/slue-voxceleb/asr1/下运行bash run.sh(可按--asr_config conf/tuning/train_asr_conformer.yaml切换实验配置); - 关注
exp/asr_*/inference_asr_model_valid.acc.ave_10best/{devel,test}/score_wer/下的result_asr.txt(WER)、意图准确率与 Macro F1 输出。
若要扩展该配方,可参考的方向包括:在train_asr_conformer_nlu.yaml中更换 BERT 后编码器、用--speed_perturb_factors做语速扰动(情感任务需谨慎,可能破坏韵律线索)、或在f1_score.py的逐类报告中纳入类别加权 F1 以缓解Neutral类主导指标的问题。
八、相关文件索引
| 文件 | 作用 |
|---|---|
| README.md | 实验环境与结果记录(本文主体依据) |
| run.sh | 配方入口,默认超参 |
| asr.sh | ESPnet2 标准 ASR 流水线模板 |
| db.sh | 语料路径配置(需手动填VOXCELEB) |
| local/data.sh | 数据下载与目录整理 |
| local/data_prep_slue.py | TSV → Kaldi 风格数据目录转换 |
| local/score.sh | 意图 + WER 评分入口 |
| local/score.py | 意图准确率计算 |
| local/f1_score.py | 逐类报告与 Macro F1 |
| conf/train_asr.yaml | 默认训练配置(wav2vec 2.0 冻结上游 + Conformer 256) |
| conf/tuning/train_asr_conformer.yaml | 大模型 Conformer 调优配置 |
| conf/tuning/train_asr_wav2vec2_conformer_small.yaml | 小模型 wav2vec 2.0 配置(与默认一致) |
| conf/tuning/train_asr_conformer_nlu.yaml | 附加 BERT 后编码器的 NLU 变体 |
- 人工智能
- 语音
- 音频
- 深度学习
- NLP
【免费下载链接】espnet
End-to-End Speech Processing Toolkit
相关推荐
Joplin AI Chat:为插件提供稳定 LLM 调用接口的 Provider 抽象与隐私守卫设计
Joplin AI Chat:为插件提供稳定 LLM 调用接口的 Provider 抽象与隐私守卫设计 Joplin 的核心并不内置聊天界面,而是向插件和内置功
人工智能语音音频深度学习NLP情感语音合成:SenseVoice情感识别与CosyVoice生成联动方案
情感语音合成:SenseVoice情感识别与CosyVoice生成联动方案 引言:语音交互的情感鸿沟 你是否遇到过这样的场景?智能助手用冰冷的语调播报"您的亲人
人工智能大模型语音音频微调本地部署Zap-GPT语音识别应用:语音转文本与情感分析
Zap GPT语音识别应用:语音转文本与情感分析 在数字化沟通日益频繁的今天,传统文字输入已难以满足高效交互需求。Zap GPT Free作为一款集成ChatG
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考