语音情感识别
语音是人类最自然的表达方式。因此,将这种交流方式扩展到计算机应用是很自然的选择。我们将语音情感识别(SER)系统定义为一系列处理和分类语音信号以检测其中包含情感的方法。
本项目探索了不同的音频特征和基于CNN的架构,以构建有效的语音情感识别(SER)系统。目标是提高检测语音信号中情感的准确性。该代码库包含代码、笔记本和实验的详细说明,包括特征提取技术、模型架构、训练程序和评估指标。欢迎对语音处理和情感识别感兴趣的贡献者探索并参与此项目。
目录
- 语音情感识别
- 数据集
- 预处理
- 数据增强
- 数据分割
- 特征提取
- 构建模型
- DummyNet
- RezoNet
- ExpoNet
- 备注
- 结果
- 贡献者
- 数据集
数据集
CREMA(众包情感多模态演员数据集)是一个包含91位演员的7,442个原始片段的数据集。对于语音情感识别来说,7442个样本可以被认为是一个相对适中的数据集规模。这些片段来自48位男性和43位女性演员,年龄在20至74岁之间,来自不同种族和民族(非裔美国人、亚裔、白人、西班牙裔和未指定)。演员们朗读了12个句子中的选择。这些句子以六种不同的情感(愤怒、厌恶、恐惧、快乐、中性和悲伤)呈现。该数据集可在Kaggle上获取。
预处理
由于音频文件长度不一,我们将通过零填充使其长度统一,以匹配数据集中最长音频文件的长度。我们还将确保所有音频文件具有相同的采样率(16 KHz),必要时进行重采样。
数据增强
我们使用以下数据增强技术:
- 噪声注入: 向音频信号添加随机噪声
- 时间移位: 在时间上移动音频信号
- 音高偏移: 改变音频信号的音高
- 时间拉伸: 在时间上拉伸或压缩音频信号
- 音量缩放: 调整音频信号的音量
特征提取
我们主要使用librosa
库处理音频文件(wav文件)。提取以下特征:
- 过零率
- 能量
- 梅尔频谱图
size (in samples) = duration (in seconds) x fs (sampling rate in Hz)
主要参数设置:
- 窗口大小:512个样本
- 跳跃大小:128个样本
- 梅尔频带数:40个频带
构建模型
本项目构建了三个模型:
DummyNet
基础CNN模型,可以接受原始音频信号、过零率、能量或梅尔频谱图作为输入。
模型结构
第一卷积层:1D 卷积层,输入通道为 1,输出通道为 512,卷积核大小为 5,步长为 1。
第一池化层:最大池化层,池化核大小为 5,步长为 2。
第二卷积层:1D 卷积层,输入通道为 512,输出通道为 512,卷积核大小为 5,步长为 1。
第二池化层:最大池化层,池化核大小为 5,步长为 2。
第三卷积层:1D 卷积层,输入通道为 512,输出通道为 128,卷积核大小为 5,步长为 1。
第三池化层:最大池化层,池化核大小为 5,步长为 2。
展平层:将输入张量展平成一维向量。
第一全连接层:全连接(线性)层,输入大小为 输入形状 * 128,输出大小为 256。
第二全连接层:全连接(线性)层,输入大小为 256,输出大小为 6。
Softmax 激活:应用于最后一层以生成输出概率。
除了最后一层以外,每个卷积层和全连接层的输出均应用 RELU 激活函数。
- Using Zero Crossing Rate:使用过零率
- Using Energy:使用能量
- Using Zero Crossing Rate and Energy:使用过零率和能量
Using Mel Spectrogram:使用梅尔频谱图
RezoNet
RezoNet 是一种基于深度神经网络的轻量级 CNN(卷积神经网络)语音情感识别模型。该模型在卷积层和池化层中使用了一组不同矩形形状的卷积核。它的设计灵感来源于研究论文《Deep-Net: A Lightweight CNN-Based Speech Emotion Recognition System Using Deep Frequency Features》。该模型基于从音频文件中提取的二维梅尔频谱图特征进行训练。
看起来你正在训练一个音频分类模型,并且已经发现了过拟合的问题。你通过使用数据增强技术来解决这个问题,并且在第5个epoch保存了最佳的模型检查点。以下是分类报告的一般概述:
分类报告:
分类报告通常包括以下几个指标,用于评估每个类别的表现:
-
精确率(Precision):正预测结果(真阳性,TP)占所有预测为正的样本数(包括假阳性,FP)。精确率高意味着模型较少将负样本误判为正样本。
[
\text{Precision} = \frac{\text{TP}}{\text{TP + FP}}
] -
召回率(Recall):正预测结果(真阳性,TP)占所有真实为正的样本数(包括假阴性,FN)。召回率高意味着模型能够识别大部分的正样本。
[
\text{Recall} = \frac{\text{TP}}{\text{TP + FN}}
] -
F1-score:精确率和召回率的调和均值,提供一个综合性的指标,尤其适用于类别不平衡的情况。
[
F1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}
] -
支持度(Support):每个类别在数据集中的真实实例数,反映类别的分布情况。
此外,还可以报告 整体准确率(Accuracy):
[
\text{Accuracy} = \frac{\text{TP + TN}}{\text{总实例数}}
]
示例分类报告:
如果你有多个类别,以下是一个示例分类报告的格式:
类别 | 精确率 | 召回率 | F1-Score | 支持度 |
---|---|---|---|---|
类别1 | 0.85 | 0.90 | 0.87 | 100 |
类别2 | 0.78 | 0.74 | 0.76 | 150 |
类别3 | 0.92 | 0.93 | 0.92 | 120 |
类别4 | 0.79 | 0.81 | 0.80 | 130 |
总体 | 0.83 | 0.84 | 0.83 | 500 |
对于你的情况,保存了第5个epoch的最佳模型检查点,你可以基于上述指标评估分类模型的表现。这将帮助你判断数据增强技术是否有效地减轻了过拟合,并且改善了模型的泛化能力。
ExpoNet
将过零率、能量和梅尔频谱图作为1D输入的CNN模型,使用方形核进行特征提取。
以下是你提供的 模型架构 和 训练 部分的中文翻译:
模型架构
网络的输入预期为一维,表示语音信号,其中包含零交叉率(Zero Crossing Rate),并将其附加到能量(Energy)上,再附加到一维展平的梅尔频谱图(Mel Spectrogram)上。
网络架构从一个卷积层开始,具有1个输入通道、512个输出通道,卷积核大小为5,步幅为1,采用相同填充(same padding)。接着是ReLU激活函数、批量归一化(Batch Normalization)和最大池化层(Max Pooling),池化层的卷积核大小为5,步幅为2,采用相同填充。每次池化后,输入的形状会相应更新。
接下来,重复四个卷积层,配置与前一个卷积层类似,但输入和输出通道数量有所不同。每个卷积层之后都会跟着ReLU激活、批量归一化和最大池化层,每次池化后输入形状会更新。
卷积层之后,使用nn.Flatten()
模块将特征展平。然后,展平的特征会通过两个全连接层,分别有512个和6个输出单元。第一个全连接层后面跟着ReLU激活函数和批量归一化。最后,输出通过softmax函数得到每个情感类别的预测概率。
为了加速计算和提高实用性,模型可以修改为使用Log Softmax
代替Softmax。然而,由于我们使用GPU运行模型,因此使用Softmax在此情况并不会成为问题。
训练
在音频处理方面,我们使用了以下参数:
- 窗口大小(Window size):512
- 步长(Hop size):160
- 梅尔频率带数(Number of mel):40
优化器使用Adam,学习率为0.00001,批大小为8。我们训练了10个epoch,并根据验证准确度保存了最佳模型。使用了L2正则化,权重衰减(weight decay)为0.001。此外,为了防止过拟合,我们还使用了数据增强技术,如噪声注入、时间偏移、音调偏移、时间拉伸和音量缩放。
分类报告
你提到的分类报告部分是模型评估的标准输出,通常包括每个类别的精确率、召回率、F1得分以及支持度等指标,用于评估模型在不同情感分类上的表现。如果你有分类报告的详细数据,或者希望进一步分析,请分享详细信息!
备注
- ExpoNet是表现最好的模型。使用更大的数据集可能会进一步改善结果。
- 下一步可以构建两层或三层神经网络,集成前述模型,将每个模型的输出作为神经网络的输入。
#完整代码 模型以及数据集 链接
https://mbd.pub/o/bread/mbd-Z52Vkp1s