MATLAB用CNN-LSTM神经网络的语音情感分类深度学习研究

在语音处理领域,对语音情感的分类是一个重要的研究方向。

由Kaizong Ye,Liao Bao撰写

本文将介绍如何通过结合二维卷积神经网络(2 – D CNN)和长短期记忆网络(LSTM)构建一个用于语音分类任务的网络,特别是针对语音情感识别这一应用场景。

文中将展示相关代码和实验结果,包括数据处理、模型架构定义、训练以及测试等环节,并对重要步骤和结果进行详细阐述和分析。

方法

(一)数据准备

  1. 数据下载
    本文使用柏林情感语音数据库(Emo – DB)来训练模型。这个数据集包含了由10个演员说出的535个语句,这些语句被标记为愤怒、无聊、厌恶、焦虑/恐惧、快乐、悲伤或中性这七种情感之一。

  1. 提取情感标签
    文件名编码了说话者ID、所说文本、情感和版本信息。情感标签的编码如下:“W—愤怒”、“L—无聊”、“E—厌恶”、“A—焦虑/恐惧”、“F—快乐”、“T—悲伤”、“N—中性”。
filepaths = ads.Files;
[~,filenames] = fileparts(filepaths);
emotionLabels = extractBetween(filenames,6,6);

这段代码首先获取audioDatastore对象中所有音频文件的路径,然后提取文件名,并从文件名的第六个字符获取情感标签。

  1. 标签转换
    将单字母代码形式的标签替换为描述性标签,并将标签转换为分类数组。
  1. 设置标签属性并查看分布

首先将提取并转换后的情感标签设置为audioDatastore对象的Labels属性。然后,通过绘制直方图来查看不同情感类别的数据分布情况。

​编辑

  1. 读取样本、查看波形和试听
[audio,info] = read(ads);
fs = info.SampleRate;
sound(audio,fs)


视频

LSTM神经网络架构和原理及其在Python中的预测应用

探索见解

去bilibili观看

探索更多视频


视频

LSTM模型原理及其进行股票收盘价的时间序列预测讲解

探索见解

去bilibili观看

探索更多视频


视频

【讲解】ARIMA、XGBOOST、PROPHET和LSTM预测比特币价格

探索见解

去bilibili观看

探索更多视频


视频

【视频讲解】LSTM模型在中文文本评论情感分析预测应用附代码数据

探索见解

去bilibili观看

探索更多视频


视频

【视频讲解】Python深度学习股价预测、量化交易策略:LSTM、GRU深度门控循环神经网络附代码数据

探索见解

去bilibili观看

探索更多视频

 上述代码从数据存储中读取一个音频样本,获取其采样率,播放该音频。同时,绘制音频的波形图,标题显示其情感类别

Figure contains an axes object. The axes object with title Class: Happiness contains an object of type line.编辑

  1. 数据划分与增强
    将数据划分为训练集、验证集和测试集,其中训练集占70%,验证集和测试集各占15%。
[adsTrain,adsValidation,adsTest] = splitEachLabel(ads,0.70,0.15,0.15);

为了提高模型的拟合能力,在训练数据有限的情况下,可以通过数据增强的方式增加训练数据量。创建一个audioDataAugmenter对象,指定每个文件的增强次数、音高偏移概率、时间偏移概率和范围、添加噪声概率和信噪比范围等参数。

创建一个新文件夹来存储增强后的数据,然后通过循环遍历数据存储和使用音频数据增强器来增强训练数据。对于每个增强样本,进行归一化处理,并将其保存为WAV文件。

最后,创建增强数据的音频数据存储对象,并将其标签设置为原始训练数据标签的重复元素。

augadsTrain = audioDatastore(agumentedDataFolder);
augadsTrain.Labels = repelem(adsTrain.Labels,augmenter.NumAugmentations,1);

  1. 特征提取
    使用audioFeatureExtractor对象从音频数据中提取特征,指定窗口长度、跳跃长度、窗口类型和要提取的频谱类型等参数。

设置特征提取器的参数,包括梅尔频带数量和是否禁用窗口归一化。

使用preprocessAudioData函数从训练集、验证集和测试集中提取特征和标签。

绘制一些训练样本的波形和听觉频谱图,如下代码所示:

numPlots = 3;
idx = randperm(numel(augadsTrain.Files),numPlots);
f = figure;
f.Position(3) = 2*f.Position(3);

tiledlayout(2,numPlots,TileIndexing = "columnmajor")

结果如![训练样本的波形和频谱图所示。同时查看前几个观测值的大小,以确保网络能够支持训练数据,并计算输入层最短序列的长度。

​编辑 ​

(二)模型架构定义

定义二维CNN – LSTM网络,用于预测序列的类别标签,网络结构如下代码所示:

编辑

对于序列输入,指定一个序列输入层,其输入大小与输入数据匹配,并设置MinLength选项为训练数据中最短序列的长度。使用二维CNN架构来学习一维图像序列中的空间关系,包括四个重复的卷积、批量归一化、ReLU和最大池化层块,并逐渐增加第三和第四卷积层的滤波器数量。通过包含一个具有256个隐藏单元的LSTM层来学习一维图像序列中的长期依赖关系,并将OutputMode选项设置为"last",仅输出最后一个时间步。对于分类任务,包含一个全连接层和一个softmax层,最后添加一个分类层。

 (三)训练选项指定

使用trainingOptions函数指定训练选项,包括使用Adam优化器、小批量大小、训练轮数、初始学习率、学习率调整策略、L2正则化项、序列填充方向、是否打乱数据、验证频率、是否显示训练进度以及是否在GPU上训练等参数,代码如下:

miniBatchSize = 32;

options = trainingOptions("adam",...
    MaxEpochs = 3,...
    MiniBatchSize = miniBatchSize,...

模型训练与测试

(一)训练网络

使用trainNetwork函数训练网络,如果没有GPU,训练可能会花费较长时间


Python用CNN – LSTM、ARIMA、Prophet股票价格预测的研究与分析

阅读文章


训练过程的进度图如![训练进度图所示。

{"String":"Figure Training Progress (05-May-2022 17:02:32) contains 2 axes objects and another object of type uigridlayout. Axes object 1 contains 10 objects of type patch, text, line. Axes object 2 contains 10 objects of type patch, text, line.","Tex":[],"LaTex":[]}编辑

(二)测试网络

使用训练好的网络对测试数据进行分类,并通过比较预测结果和真实标签来评估模型的分类准确率。首先,对测试数据进行分类。 ​


随时关注您喜欢的主题


然后,通过绘制混淆矩阵来可视化预测结果,代码如下:

figure
confusionchart(labelsTest,labelsPred)

​编辑

结果如混淆矩阵图所示。

最后,通过计算预测结果和测试标签相同的比例来评估分类准确率,本次实验得到的准确率为0.6329。 ​

结论

本文详细介绍了基于二维CNN – LSTM网络的语音情感分类模型的构建、训练和测试过程。通过对柏林情感语音数据库的实验,展示了模型在语音情感分类任务上的性能。虽然取得了一定的准确率,但仍有改进的空间,例如进一步优化数据增强策略、调整模型架构或训练参数等,未来的研究可以在此基础上继续深入。同时,本文中的方法和代码也可以为相关领域的研究人员提供参考和借鉴。

参考文献

[1] Burkhardt, Felix, A. Paeschke, M. Rolfes, Walter F. Sendlmeier, and Benjamin Weiss. “A Database of German Emotional Speech.” In Interspeech 2005, 1517–20. ISCA, 2005. https://doi.org/10.21437/Interspeech.2005 – 446.

[2] Zhao, Jianfeng, Xia Mao, and Lijiang Chen. “Speech Emotion Recognition Using Deep 1D & 2D CNN LSTM Networks.” Biomedical Signal Processing and Control 47 (January 2019): 312–23. https://doi.org/10.1016/j.bspc.2018.08.035.


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds