ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

基于 SpeechBrain 与 IEMOCAP 的语音情感识别实战指南(ECAPA-TDNN / wav2vec 2.0 / HuBERT)

2026/9/15 13:39:42 拓冰建站 浏览量
基于 SpeechBrain 与 IEMOCAP 的语音情感识别实战指南(ECAPA-TDNN / wav2vec 2.0 / HuBERT) 基于 SpeechBrain 与 IEMOCAP 的语音情感识别实战指南ECAPA-TDNN / wav2vec 2.0 / HuBERT【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain本文以 SpeechBrain 仓库中的 IEMOCAP 语音情感识别 Recipe 为骨架系统讲解如何使用该 Recipe 完成基于纯语音信号的四分类情感识别愤怒、开心、悲伤、中性覆盖从数据准备、随机切分与说话人无关切分、ECAPA-TDNN 与 wav2vec 2.0 两套训练流程到超参数配置、结果复现与预训练模型推理的完整链路。读完本文你将掌握 IEMOCAP Recipe 的目录结构与执行方式能够读懂并修改 train.yaml 与 train_with_wav2vec2.yaml 中的关键配置理解数据标注变换与两种评测切分策略的实现细节并知道如何复现文档报告的分类准确率、如何用 Hugging Face 上的预训练模型做快速推理以及如何引用 IEMOCAP 与 SpeechBrain 论文。Recipe 总览目录结构与两种训练路线IEMOCAPInteractive Emotional Dyadic Motion Capture DatabaseBusso 等人 2008 年发布是一个包含约 12 小时、10 位说话人5 男 5 女双人即兴对话录音的情感数据库。SpeechBrain 的 recipes/IEMOCAP 目录为其提供了仅使用语音speech only的情感识别实验脚本其结构如下recipes/IEMOCAP/ ├── README.md # 实验说明、结果与引用信息 ├── iemocap_prepare.py # 顶层数据准备入口复导出 └── emotion_recognition/ ├── hparams/ │ ├── train.yaml # ECAPA-TDNN 训练超参数 │ └── train_with_wav2vec2.yaml # wav2vec 2.0/HuBERT 训练超参数 ├── iemocap_prepare.py # 数据准备核心实现 ├── train.py # ECAPA-TDNN 训练脚本 └── train_with_wav2vec2.py # wav2vec 2.0/HuBERT 训练脚本Recipe 提供两条可选的训练路线ECAPA-TDNN 路线从 Fbank 特征出发用 ECAPA-TDNN 说话人嵌入网络 分类头完成情感分类训练脚本为 train.py配置文件为 hparams/train.yamlwav2vec 2.0 / HuBERT 路线以 Hugging Face 上的自监督预训练语音模型作为编码器冻结其卷积特征提取器后接统计池化与线性分类头训练脚本为 train_with_wav2vec2.py配置文件为 hparams/train_with_wav2vec2.yaml。两套脚本都基于 SpeechBrain 的sb.Brain框架组织训练、验证与测试流程共享同一个数据准备模块iemocap_prepare.py。快速开始两条训练命令在下载好 IEMOCAP 数据集即IEMOCAP_full_release目录内含Session1~Session5五个会话后分别运行# 路线一ECAPA-TDNN python train.py hparams/train.yaml --data_folder /path/to/IEMOCAP_full_release # 路线二wav2vec 2.0 编码器 python train_with_wav2vec2.py hparams/train_with_wav2vec2.yaml --data_folder /path/to/IEMOCAP_full_release其中--data_folder对应配置文件中的data_folder: !PLACEHOLDER占位符需要在命令行覆盖为你的本地数据路径。训练过程中脚本会自动完成数据准备生成 train/valid/test 三个 JSON 清单、创建实验目录、初始化模型与优化器、执行 30 个 epoch 的训练并在验证集上按错误率挑选最优检查点checkpoint用于测试集评估。dataio_prep通过sb.dataio.dataset.DynamicItemDataset.from_json加载这三个 JSON并挂载两条动态流水线audio_pipeline用sb.dataio.dataio.read_audio读取波形label_pipeline用sb.dataio.encoder.CategoricalEncoder把情感标签编码为索引。标签编码器会保存在save_folder/label_encoder.txt方便查看标签到索引的映射。数据准备标签变换与两种切分策略iemocap_prepare.py是整个 Recipe 的数据基石它只使用数据集的音频部分不做任何视频/动作捕捉模态的处理。其核心流程如下1. 标签变换到四分类IEMOCAP 原始标注包含多种情感标签。脚本通过load_session遍历每个会话的dialog/EmoEvaluation/下的标注文件只保留neu中性、hap开心、sad悲伤、ang愤怒以及exc兴奋五类并且把exc合并到hapif label exc: label hap最终形成[neural, happy, sad, anger]四分类与配置文件中out_n_neurons: 4一一对应。这是复现文档中Labelling transformation to 4 emotions的关键步骤。2. 说话人分组与切分transform_data把 5 个会话每个会话 2 位说话人共 10 位按说话人整理成speaker_dict每个会话中性别为F的说话人编为奇数号、M编为偶数号得到 1~10 号说话人。脚本内置NUMBER_UTT 5531校验——若整理出的总样本数不是 5531会抛出 ValueError 提示检查 IEMOCAP 目录完整性。随后根据different_speakers参数选择切分方式different_speakers: False随机切分调用split_sets把所有样本随机打乱后按split_ratio默认[80, 10, 10]依次切出训练、验证、测试集。README 特别提醒随机切分下做 benchmark 需要跑 5 折交叉验证seed 不同。different_speakers: True说话人无关切分调用split_different_speakers按test_spk_id1~10挑选 1 位说话人作为测试集并自动把同会话的另一位说话人作为验证集leave-two-speaker-out 策略其余 8 位说话人全部进入训练集。README 提醒此设置下 benchmark 需要跑 10 折即把test_spk_id从 1 依次设到 10 各跑一次。这两个参数在配置文件中均有体现different_speakers: False、test_spk_id: 1并且prepare_data会把seed传入random.seed(seed)以保证切分可复现。JSON 清单中的每条记录包含wav绝对路径、length秒、emo标签三个字段。ECAPA-TDNN 训练路线详解模型与训练脚本train.py 中的EmoIdBrain(sb.Brain)定义了前向计算链feats self.modules.compute_features(wavs) # Fbank 特征 feats self.modules.mean_var_norm(feats, lens) # 句子级归一化 embeddings self.modules.embedding_model(feats, lens) # ECAPA-TDNN 嵌入 outputs self.modules.classifier(embeddings) # 分类头compute_features使用speechbrain.lobes.features.Fbank提取 80 维 Fbankn_mels: 80不启用增量特征与上下文帧deltas: False、left_frames/right_frames: 0mean_var_norm使用speechbrain.processing.features.InputNormalizationnorm_type: sentence、std_norm: Falseembedding_model是speechbrain.lobes.models.ECAPA_TDNN.ECAPA_TDNN位于 speechbrain/lobes/models/ECAPA_TDNN.py其中包含 TDNNBlock、Res2NetBlock、SEBlock、AttentiveStatisticsPooling 等模块本 Recipe 用的是通道数与注意力头数均减半的小型版channels: [512, 512, 512, 512, 1536]、kernel_sizes: [5, 3, 3, 3, 1]、dilations: [1, 2, 3, 4, 1]、attention_channels: 64、lin_neurons: 96classifier是同文件中的Classifier输入 96 维、输出out_n_neurons: 4。损失采用 AAM-Softmax 变体LogSoftmaxWrapper包装AdditiveAngularMarginmargin: 0.2、scale: 30这一组合源自说话人识别实践被迁移到情感分类任务。优化与调度优化器为torch.optim.Adamlr: 0.0001、weight_decay: 0.00002学习率调度使用CyclicLRSchedulermode: exp_range、base_lr: 0.000001、max_lr: 0.0001、step_size: 1088、gamma: 0.9998README 注释说明该设置约在 20 个 epoch 内把学习率降为原来的约 1/3训练 30 个 epochbatch_size: 16grad_accumulation_factor: 2ckpt_interval_minutes: 15每 15 分钟保存一次检查点以防中断验证阶段按min_keys[error]用save_and_keep_only保留错误率最低的检查点测试阶段加载该最优检查点进行评估并把每个样本的预测结果写入output_folder/predictions.csv字段为id, prediction, true_value由脚本中的output_predictions_test_set方法生成。wav2vec 2.0 / HuBERT 训练路线详解train_with_wav2vec2.yaml 与对应的 train_with_wav2vec2.py 展示了如何把 Hugging Face 的自监督语音模型无缝接入 SpeechBrain 训练管线编码器配置wav2vec2_hub: facebook/wav2vec2-base wav2vec2: !new:speechbrain.integrations.huggingface.wav2vec2.Wav2Vec2 source: !ref wav2vec2_hub output_norm: True freeze: !ref freeze_wav2vec2 freeze_feature_extractor: !ref freeze_wav2vec2_conv save_path: !ref wav2vec2_folderwav2vec2_hub用于指定 Hugging Face 模型名可替换为facebook/wav2vec2-base、voxpopuli base、HuBERT base 等不同编码器做 benchmarkREADME 结果表即来自这三种编码器底层封装是 speechbrain/integrations/huggingface/wav2vec2.py 中的Wav2Vec2类它继承自HFTransformersInterface自动从 Hugging Face 下载模型到save_path按需对输入波形做 layer normnormalize_wav并用make_padding_masks生成 attention maskfreeze: False不整体冻结freeze_feature_extractor: True冻结 CNN 卷积特征提取器是 README 标注为有约 2% 提升的设置训练脚本中hparams[wav2vec2].model.feature_extractor._freeze_parameters()会冻结卷积部分而 Transformer 编码器部分继续参与微调配置文件中的注释还提到应使用未经过 ASR 微调的 wav2vec2 base而非facebook/wav2vec2-base-960h这类带 ASR 任务的版本这样可带来约 4% 的提升。分类头与前向流程前向流程与 ECAPA 路线不同——不再提取 Fbank而是把原始波形直接送入 wav2vec2输出经过StatisticsPoolingspeechbrain.nnet.pooling.StatisticsPooling仅取均值、return_std: False得到 768 维句子级表示encoder_dim: 768再经过output_mlpspeechbrain.nnet.linear.Linearbias: False768→4与Softmax(apply_log: True)得到 log 概率outputs self.modules.wav2vec2(wavs, lens) outputs self.hparams.avg_pool(outputs, lens) outputs outputs.view(outputs.shape[0], -1) outputs self.modules.output_mlp(outputs) outputs self.hparams.log_softmax(outputs)损失直接使用speechbrain.nnet.losses.nll_loss。优化上采用双优化器init_optimizers分别用opt_classlr1e-4更新model即 output_mlp 组成的torch.nn.ModuleList、用wav2vec2_opt_classlr1e-5更新 wav2vec2 编码器两者都挂载到 Checkpointer 以便断点续训学习率调度使用两个独立的NewBobSchedulerimprovement_threshold: 0.0025、annealing_factor: 0.9验证错误率不再改善即衰减学习率。注意该配置下batch_size: 4比 ECAPA 路线的 16 小得多这是因为 wav2vec2 编码器显存占用大README 显示单卡 V100 32GB 即可支撑。已报告结果与训练耗时README 报告的结果采用随机切分即different_speakers: False汇总如下准确性以文档原表为准发布版本超参数文件验证集准确率测试集准确率硬件2021-07-04train.yamlECAPA-TDNN65.365.71×V100 16GB2021-10-17train_with_wav2vec2.yamlwav2vec2 basebest 78.1best 78.7平均 77.01×V100 32GB2021-10-17train_with_wav2vec2.yamlvoxpopuli basebest 73.3best 73.3平均 70.51×V100 32GB2021-10-17train_with_wav2vec2.yamlHuBERT basebest 74.9best 79.1平均 76.61×V100 32GB训练耗时TESLA V100 上ECAPA-TDNN 路线每个 epoch 约 40 秒wav2vec2 BASE 编码器路线每个 epoch 约 3 分 14 秒。从结果可明显看出自监督预训练编码器wav2vec2/HuBERT相对从头训练的 ECAPA-TDNN 带来了约 12~13 个百分点的测试集准确率提升代价是约 5 倍的单 epoch 训练时间与更大的显存需求。README 同时说明这些结果的切分与实验配置benchmark 时需按前文所述跑多折取平均这也是结果表中同时给出 best 与 avg 的原因。预训练模型与快速推理README 提供了 wav2vec2 路线的预训练模型托管在 Hugging Face 的speechbrain/emotion-recognition-wav2vec2-IEMOCAP仓库配有 easy-inference 函数可直接对任意语音文件输出四分类情感结果无需重新训练。结合 SpeechBrain 的预训练接口speechbrain/utils/pretrained.py 中的Pretrained基类使用方式大致为指定 source 为该 HF 仓库加载后调用classify_file(wav_path)即可获得情感类别。该预训练模型对应上文结果表中 wav2vec2 base 那一行的配置。引用信息使用本 Recipe 或 IEMOCAP 数据集进行研究时请按 README 给出的 BibTeX 引用IEMOCAP 数据集Busso 等人 2008 年发表于Language Resources and Evaluation第 42 卷335-359 页的 IEMOCAP: interactive emotional dyadic motion capture databaseSpeechBrain优先引用Open-Source Conversational AI with SpeechBrain 1.0Ravanelli 等2024arXiv:2407.00463或原始 SpeechBrain 论文Ravanelli 等2021arXiv:2106.04624。wav2vec 2.0 与 HuBERT 的更多对比实验结果可参阅 train_with_wav2vec2 脚本文档字符串中提到的研究论文arXiv:2111.02735。小结本 Recipe 是理解语音情感识别如何从数据到模型落地的完整范例iemocap_prepare.py负责标签规整与两种切分策略train.py/train_with_wav2vec2.py展示了两代特征范式手工 FbankECAPA-TDNN 与自监督 wav2vec2/HuBERT 微调在同一个sb.Brain框架下的实现差异。若想深入底层可以继续阅读 speechbrain/lobes/models/ECAPA_TDNN.pyECAPA-TDNN 与 Classifier 实现、speechbrain/integrations/huggingface/wav2vec2.pyHF 模型封装、speechbrain/nnet/pooling.py统计池化以及 speechbrain/dataio/dataset.pyDynamicItemDataset 机制。在此基础上更换wav2vec2_hub即可在任意 HF 语音编码器上复现同样的情感分类实验。【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考