news 2026/9/25 5:15:33

ESPnet2 SLUE-VoxCeleb 情感语音识别配方实战:Conformer 联合预测转写文本与意图标签

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ESPnet2 SLUE-VoxCeleb 情感语音识别配方实战:Conformer 联合预测转写文本与意图标签
  • 人工智能
  • 语音
  • 音频
  • 深度学习
  • NLP

【免费下载链接】espnet

End-to-End Speech Processing Toolkit

项目地址:https://gitcode.com/gh_mirrors/es/espnet
点击查看免费下载

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
Python3.9.5
ESPnet0.10.3a2
PyTorch1.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 文件音频目录前缀
trainslue-voxceleb_fine-tune.tsvfine-tune_raw/
develslue-voxceleb_dev.tsvdev_raw/
testslue-voxceleb_test_blind.tsvtest_raw/

脚本中有两个值得注意的细节:

  1. 意图标签与转写拼接:非盲测集的text文件内容格式为<intent> <speaker>,即:

    words = ( row[4].replace(" ", "_") + " " + row[1].encode("ascii", "ignore").decode() )

    意图词(第 4 列)中的空格被替换为下划线以保证单 token 匹配,后面跟随说话人字段。<mixed>意图的样本会被直接跳过。

  2. 盲测集处理: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 wordword使用词级词表(data/en_token_list/word/tokens.txt),不训练 BPE;意图标签作为一个独立词进入词表
--feats_type rawraw直接消费 16 kHz 原始波形,前端在训练时在线提取(dump/raw)
--feats_normalize utterance_mvn逐句 MVN该配方不使用全局 MVN 统计,而是逐句均值方差归一化,跳过 stage 10 的 global_mvn 汇总
--max_wav_duration 3030 秒stage 4 中过滤时长超出范围的句子(VoxCeleb 音频普遍较短,此处放宽上限)
--inference_asr_model valid.acc.ave_10best.pth10 best 平均解码时使用验证集准确率前 10 名 epoch 的平均权重模型,与 README 中实验名valid.acc.ave_10best对应
--use_lm false关闭 LM跳过 stage 6~8 的语言模型训练,只训练 ASR 模型
--gpu_inference trueGPU 解码配合--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

与实验一的结构性差异:

  1. SSL 前端:frontend: s3prl加载wav2vec2_large_ll60k上游模型提取帧级特征(multilayer_feature: True聚合多层输出),再经线性 preencoder 从 1024 维投影到 80 维,作为 Conformer 的输入;freeze_param: ["frontend.upstream"]冻结 wav2vec 2.0 全部参数,只训练 preencoder 与下游 ASR 模型——这是一种"自监督特征 + 轻量判别头"的半微调方案;
  2. 更小的编码器:output_size: 256、4 头注意力、linear_units: 1024,input_layer: conv2d2(2 步下采样);
  3. 批处理与优化:batch_type: numel+batch_bins: 6000000(按 600 万个样本点动态攒批)、accum_grad: 2梯度累积、lr=2e-3 配 5000 步 warmup、最多 100 epoch——比实验一更长的训练预算以弥补冻结特征的表达上限;
  4. 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},依次执行三步:

  1. local/score.py:逐行比对score_wer/hyp.trn与ref.trn的第一个 token(即意图标签),计算准确率;同时把意图词剔除后写出hyp_asr.trn/ref_asr.trn供 WER 评测;
  2. local/generate_asr_files.py:生成纯 ASR 评测文件;
  3. 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 解码器(谱增强)

datasetSntIntent Classification Accuracy (%)Intent Classification Macro F1 (%)
inference_asr_model_valid.acc.ave_10best/devel95480.239.7

逐类分类报告:

LabelSntPrecRecallF1
Neutral784859389
Positive167402430
Negative3000

实验二:Conformer(output_size 256)+ 冻结 wav2vec 2.0 上游

datasetSntIntent Classification Accuracy (%)Intent Classification Macro F1 (%)
inference_asr_model_valid.acc.ave_10best/devel95479.044.0

逐类分类报告:

LabelSntPrecRecallF1
Neutral784888787
Positive167464344
Negative3000

两组结果可以读出几点信息:

  • 类别高度不平衡是主导因素: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"]的报告也印证了这一点)。

七、复现与扩展建议

基于当前仓库的配方结构,复现路径为:

  1. 按 db.sh 设置VOXCELEB指向官方数据包(含LICENSE.txt、三个 TSV 与fine-tune_raw/、dev_raw/、test_raw/音频);
  2. 在egs2/slue-voxceleb/asr1/下运行bash run.sh(可按--asr_config conf/tuning/train_asr_conformer.yaml切换实验配置);
  3. 关注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.shESPnet2 标准 ASR 流水线模板
db.sh语料路径配置(需手动填VOXCELEB)
local/data.sh数据下载与目录整理
local/data_prep_slue.pyTSV → 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

项目地址:https://gitcode.com/gh_mirrors/es/espnet
点击查看免费下载

相关推荐

上一篇:终极养肝神器:FGO-py全自动助手让你的Fate/Grand Order游戏体验焕然一新
下一篇:5分钟快速上手lightline.vim:让Vim界面更美观的终极指南 🚀

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 5:13:47

小米非澎湃OS机型BL锁解除原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/25 5:13:36

新能源汽车运力管理系统开发实践与优化

1. 项目背景与核心需求在新能源汽车行业快速发展的当下&#xff0c;传统的人工运力管理方式已经暴露出诸多痛点。我曾参与过某物流公司的新能源车队管理项目&#xff0c;亲眼目睹调度员每天要手动核对几十张Excel表格&#xff0c;不仅耗时费力&#xff0c;还经常出现车辆调度冲…

作者头像 李华
网站建设 2026/9/25 5:10:59

DOM核心知识全解:从文档对象模型到虚拟DOM与事件机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华