【ResNet18】on IEMOCAP—语音情感识别(数据均衡与特征工程篇)

张开发
2026/4/17 20:22:08 15 分钟阅读

分享文章

【ResNet18】on IEMOCAP—语音情感识别(数据均衡与特征工程篇)
1. 数据不均衡的挑战与应对策略IEMOCAP数据集作为语音情感识别领域的标杆数据集其原始数据分布呈现出明显的类别不均衡现象。从实际统计来看中性neu情感样本多达1708条而高兴hap仅有595条这种不均衡会导致模型训练时偏向多数类。我在实际项目中遇到过这样的场景模型对多数类的识别准确率能达到80%但对少数类仅有30%左右。解决这个问题通常有三大方向数据层面、算法层面和损失函数层面。我们先聚焦最实用的数据层面方法类别合并将语义相近的exc兴奋与hap合并为同一类别这是论文中常见的做法。实测下来这样能将四分类的样本数调整为ang(1103)、hap(1636)、neu(1708)、sad(1084)均衡性显著改善过采样技术对hap这类少数类可以用SMOTE算法生成合成样本。具体操作时需要注意语音数据需要先在特征空间进行过采样再反向生成波形分段采样策略在数据加载时我习惯用WeightedRandomSampler为每个batch动态分配采样权重。这里有个坑要注意权重计算时建议取样本数的倒数平方根直接取倒数会导致训练震荡# 加权采样的PyTorch实现示例 class_counts torch.tensor([1103, 1636, 1708, 1084]) weights 1. / torch.sqrt(class_counts.float()) sampler WeightedRandomSampler(weights, num_sampleslen(dataset))2. 语音特征工程实战2.1 梅尔频谱图生成细节梅尔频谱图之所以成为语音情感识别的主流特征是因为它模拟了人耳对频率的非线性感知特性。在具体实现时这些参数设置会显著影响效果采样率IEMOCAP原始为16kHz这个采样率足够捕捉情感相关的频段通常8kHz帧长与帧移1024点FFT64ms配合512点hop length是平衡时频分辨率的稳妥选择梅尔滤波器组40个滤波器在计算效率和特征丰富度间取得平衡。我曾对比过80个滤波器的情况发现提升有限但计算量翻倍实际处理时有个容易忽略的细节静音片段处理。建议先进行VAD语音活动检测过滤静音段否则生成的频谱图会包含大量无效信息。librosa.effects.trim()是个简单好用的选择y, _ librosa.effects.trim(y, top_db20) # 去除首尾静音2.2 时频增强技巧单纯的梅尔频谱图有时不足以捕捉情感特征这些增强方法值得尝试Delta特征计算一阶和二阶差分将3个通道(stacked)一起输入网络。这能让模型捕捉到情感变化的动态特征SpecAugment在频谱图上随机mask时间帧和频率带不仅增强数据多样性还能防止模型过拟合局部特征PCEN归一化替代传统的log压缩对动态范围大的语音更友好。公式为PCEN (E / (ε M)^α δ)^r - δ^r实测发现当α0.98δ2r0.5时对情感识别任务效果最佳。这个组合能更好保留情感相关的频谱细节。3. 数据划分策略剖析3.1 说话人独立(SI)验证IEMOCAP包含10位说话人5男5女采用speaker independent划分才能验证模型的泛化能力。具体实施时要注意会话划分每个session包含两位说话人的对话数据按session划分能更好模拟真实场景性别平衡确保每个fold的训练/测试集都包含男女说话人情感分布检查每个split中各类情感的占比与总体分布一致我推荐使用scikit-learn的GroupShuffleSplit实现from sklearn.model_selection import GroupShuffleSplit gss GroupShuffleSplit(n_splits5, test_size0.2) for train_idx, test_idx in gss.split(X, y, groupsspeaker_ids): # 划分逻辑3.2 数据泄露预防处理时序数据时容易犯的错误就是数据泄露这几个要点需要特别注意禁止跨fold标准化每个fold应该独立计算均值和方差增强一致性同一条语音的不同增强版本必须出现在同一个fold中会话边界同一个对话session的数据不能分散在不同fold曾经有个项目因为忽略了第三点导致模型通过对话上下文作弊在测试集取得了虚高的准确率。4. ResNet18适配优化4.1 输入通道设计原始ResNet18是为ImageNet的三通道设计的而梅尔频谱图是单通道的。我实验过三种改编方案单通道直接输入最简单但效果一般准确率约58%三通道复制浪费参数但稳定准确率62%多特征堆叠将MFCC、chroma等作为额外通道最佳方案可达65%推荐第三种方案的实现方式def extract_multi_feature(y, sr): melspec librosa.feature.melspectrogram(yy, srsr) mfcc librosa.feature.mfcc(yy, srsr, n_mfcc13) chroma librosa.feature.chroma_stft(yy, srsr) return np.stack([melspec, mfcc, chroma], axis0)4.2 网络结构调整针对语音特性这些修改能提升ResNet18的表现初始层调整将第一个7x7卷积改为3个3x3卷积保留细节信息池化策略使用adaptive avg pooling替代固定池化适应不同长度语音注意力机制在残差块后添加CBAM模块让网络聚焦情感相关频段训练时有个小技巧先用全部数据训练最后一层再微调整个网络。这样既能加速收敛又能防止小数据量下的过拟合。

更多文章