语音识别--基于MFCC和多层感知机的语音情感识别

2024-05-07 20:36

本文主要是介绍语音识别--基于MFCC和多层感知机的语音情感识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/

❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

语音识别--基于MFCC和多层感知机的语音情感识别

  • 基于MFCC和多层感知机的语音情感识别
    • 一、任务需求
    • 二、任务目标
          • 1、掌握神经网络的构建
          • 2、掌握神经网络的编译
          • 3、掌握神经网络的训练
          • 4、掌握神经网络的概要输出
          • 5、掌握神经网络的模型封装
    • 三、任务环境
          • 1、jupyter开发环境
          • 2、python3.6
          • 3、tensorflow2.4
    • 四、任务实施过程
      • 1、读取数据
      • 2、提取声音特征
      • 3、处理数据
      • 4、训练多层感知机
      • 5、预测验证
    • 五、任务小结
  • 说明

基于MFCC和多层感知机的语音情感识别


一、任务需求

语音情感识别是一个非常有趣的项目。例如呼叫中心可能会很愿意了解话务员和客户之间的聊天气氛。在本节实验中,我们将使用MFCC和多层感知机来做一个简单的语音情感识别模型。

Speech Emotion Recognition,缩写为SER,是试图从语音中识别人类情绪和情感状态的行为。这是利用这样一个事实,即声音通常通过语调和音调反映潜在的情感。这也是像狗和马这样的动物用来理解人类情感的现象。

SER 很难,因为情绪是主观的,注释音频具有挑战性。

要求:利用Sequential模型神经网络使用Tensorflow模型构建与输出SER

二、任务目标

1、掌握神经网络的构建
2、掌握神经网络的编译
3、掌握神经网络的训练
4、掌握神经网络的概要输出
5、掌握神经网络的模型封装

三、任务环境

1、jupyter开发环境
2、python3.6
3、tensorflow2.4

四、任务实施过程

1、读取数据

本实验中,我们将使用 RAVDESS 数据集;这是情绪言语和歌曲数据集的瑞尔森视听数据库,可免费下载。

该数据集包含 7356 个文件,原始数据集是来自 24 个演员的 24.8GB 数据,但本实验并不需要那么大的数据集,因此降低了所有音频的采样率,以降低样本数据的大小。

import librosa
import soundfile
import os, glob, pickle
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score
from IPython.display import clear_output as clear

2、提取声音特征

首先我们定义一个函数extract_feature 来从声音文件中提取mfcc、chroma 和mel 特征。

这个函数有 4 个参数——文件名和三个用于三个特征的布尔参数:

  • mfcc: Mel Frequency Cepstral Coefficient,代表声音的短期功率谱
  • chroma:属于 12 个不同的音级
  • mel:梅尔频谱图频率

在该函数中,我们使用 with-as 方法打开 soundfile声音文件,这样一旦我们完成相关操作就会自动关闭文件。

读取到的数据,被存放在变量 X 中,同时获取该文件的采样率。如果chroma为 True,则先计算 X 的短时傅立叶变换,然后再计算chroma特征。

相应的,如果mfcc或mel为true,则直接计算音频的mfcc或mel。

# 从声音文件中提取特征(mfcc, chroma, mel)
def extract_feature(file_name, mfcc, chroma, mel):with soundfile.SoundFile(file_name) as sound_file:X = sound_file.read(dtype="float32")sample_rate=sound_file.samplerateresult=np.array([])if mfcc:mfccs=np.mean(librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=40).T, axis=0)result=np.hstack((result, mfccs))if chroma:stft=np.abs(librosa.stft(X))chroma=np.mean(librosa.feature.chroma_stft(S=stft, sr=sample_rate).T,axis=0)result=np.hstack((result, chroma))if mel:mel=np.mean(librosa.feature.melspectrogram(X, sr=sample_rate).T,axis=0)result=np.hstack((result, mel))return result

3、处理数据

接下来,我们可以定义一个字典来保存 RAVDESS 数据集中的数字和数字代表的情绪,然后创建一个列表来保存实验需要的情绪——冷静、快乐、恐惧、厌恶。

# RAVDESS 数据集中的情绪
emotions={'01':'neutral', # 中性'02':'calm', # 冷静'03':'happy', # 快乐'04':'sad', # 悲伤'05':'angry', # 愤怒'06':'fearful', # 恐惧'07':'disgust', # 厌恶'08':'surprised' # 惊讶
}# 选取待判断的情绪
observed_emotions=['calm', 'happy', 'fearful', 'disgust']

现在,让我们定义一个函数 load_data() 加载数据。该函数参数为测试集的相对大小,例如0.2(20%)。

在该函数中,我们首先定义x 和 y 两个空列表,接下来使用 glob 模块中的 glob() 函数来获取数据集中声音文件的所有路径名。

首先观察文件夹及命名方式:

ls /home/jovyan/datas/speech-emotion-recognition-ravdess-data/
Actor_01/  Actor_05/  Actor_09/  Actor_13/  Actor_17/  Actor_21/
Actor_02/  Actor_06/  Actor_10/  Actor_14/  Actor_18/  Actor_22/
Actor_03/  Actor_07/  Actor_11/  Actor_15/  Actor_19/  Actor_23/
Actor_04/  Actor_08/  Actor_12/  Actor_16/  Actor_20/  Actor_24/
ls /home/jovyan/datas/speech-emotion-recognition-ravdess-data/Actor_01/
03-01-01-01-01-01-01.wav  03-01-04-01-01-01-01.wav  03-01-06-02-01-01-01.wav
03-01-01-01-01-02-01.wav  03-01-04-01-01-02-01.wav  03-01-06-02-01-02-01.wav
03-01-01-01-02-01-01.wav  03-01-04-01-02-01-01.wav  03-01-06-02-02-01-01.wav
03-01-01-01-02-02-01.wav  03-01-04-01-02-02-01.wav  03-01-06-02-02-02-01.wav
03-01-02-01-01-01-01.wav  03-01-04-02-01-01-01.wav  03-01-07-01-01-01-01.wav
03-01-02-01-01-02-01.wav  03-01-04-02-01-02-01.wav  03-01-07-01-01-02-01.wav
03-01-02-01-02-01-01.wav  03-01-04-02-02-01-01.wav  03-01-07-01-02-01-01.wav
03-01-02-01-02-02-01.wav  03-01-04-02-02-02-01.wav  03-01-07-01-02-02-01.wav
03-01-02-02-01-01-01.wav  03-01-05-01-01-01-01.wav  03-01-07-02-01-01-01.wav
03-01-02-02-01-02-01.wav  03-01-05-01-01-02-01.wav  03-01-07-02-01-02-01.wav
03-01-02-02-02-01-01.wav  03-01-05-01-02-01-01.wav  03-01-07-02-02-01-01.wav
03-01-02-02-02-02-01.wav  03-01-05-01-02-02-01.wav  03-01-07-02-02-02-01.wav
03-01-03-01-01-01-01.wav  03-01-05-02-01-01-01.wav  03-01-08-01-01-01-01.wav
03-01-03-01-01-02-01.wav  03-01-05-02-01-02-01.wav  03-01-08-01-01-02-01.wav
03-01-03-01-02-01-01.wav  03-01-05-02-02-01-01.wav  03-01-08-01-02-01-01.wav
03-01-03-01-02-02-01.wav  03-01-05-02-02-02-01.wav  03-01-08-01-02-02-01.wav
03-01-03-02-01-01-01.wav  03-01-06-01-01-01-01.wav  03-01-08-02-01-01-01.wav
03-01-03-02-01-02-01.wav  03-01-06-01-01-02-01.wav  03-01-08-02-01-02-01.wav
03-01-03-02-02-01-01.wav  03-01-06-01-02-01-01.wav  03-01-08-02-02-01-01.wav
03-01-03-02-02-02-01.wav  03-01-06-01-02-02-01.wav  03-01-08-02-02-02-01.wav
文件的名字(例如:02-01-06-01-02-01-12)的解释如下:
- 模态(01 =全音视频,02 =视频,03 =音频)- 声道(01 =演讲,02 =歌曲)- 情绪(01 =中性,02 =冷静,03 =快乐,04 =悲伤,05 =愤怒,06 =恐惧,07 =厌恶,08 =惊讶)
- 情绪强度(01 =正常,02 =强烈)。注意:中性情绪没有强度。
- 语句(01 =“孩子们在门旁边说话”,02 =“狗坐在门旁边”)- 重复(01 =第一次重复,02 =第二次重复)- 演员(01 - 24个人的编号)。奇数演员是男性,偶数演员是女性)。文件名的例子:02 - 01 - 06 - 01 - 02 - 01 - 12.mp4 视频(02)演讲(01)恐惧(06)正常(01)狗坐在门旁边(02)第一次重复(01)演员编号(12)女,因为演员的身份证号码是偶数。

音频文件所在文件夹存在一定规律,它们都是Actor_开头,并加上编号组成,因此我们可以使用Actor_*来表示这些文件夹。

由于文件名都是用.wav做为结尾,因此我们可以使用*.wav来表示所有wav格式文件。我们为此使用的路径模式是"/home/jovyan/datas/speech-emotion-recognition-ravdess-data/Actor_*/*.wav"

在文件名中的第三个数字,就是该音频所表示的情绪。然后使用我们刚刚制定的情绪字典,将数字转换成对应的情绪。然后检查这个情绪是否在我们的observed_emotions列表中。如果不是,就跳过,继续下一个文件。如果是,就调用extract_feature函数, 并将返回的内容存储在feature 中。然后使用append方式将特征附加到 x 并将情感附加到 y。

# 加载每个声音文件的数据和提取特性
def load_data(test_size=0.2):x,y=[],[]files = glob.glob("/home/jovyan/datas/speech-emotion-recognition-ravdess-data/Actor_*/*.wav")file_nums = len(files)for i,file in enumerate(files):file_name=os.path.basename(file)emotion=emotions[file_name.split("-")[2]]if emotion not in observed_emotions:continuefeature=extract_feature(file, mfcc=True, chroma=True, mel=True)x.append(feature)y.append(emotion)if i+1 < file_nums:print(' '*100,end='')print('\r %s, %.2f%%.'%(file_name,i*100/file_nums),end='')print()return train_test_split(np.array(x), y, test_size=test_size, random_state=9)

将数据集拆分为训练集和测试集,测试集保留 25%。由于涉及到读取文件并提取特征,因此下面这段程序可能执行的比较慢,所以我将这段程序转换为markdown中的代码格式,如果你想执行的话,把它们复制到代码框运行就可以了。

[Input]

%%time
#DataFlair - Split the dataset
x_train,x_test,y_train,y_test=load_data(test_size=0.25)

[Output]

CPU times: user 6min 4s, sys: 26min 43s, total: 32min 47s
Wall time: 16min 36s

如你所见,在我现在使用的平台上(性能不怎么样),一共花费了超过16分钟的时间来处理数据。

如果你不想等待这么长时间,我把x_train,x_test,y_train,y_test这四个变量保存起来了,保存代码如下:

np.save('06_arr_save.npy',np.array([x_train,x_test,y_train,y_test],dtype=object))

这会把变量保存到当前文件夹的06_arr_save.npy中,你可以直接加载,就像下边这样做的。

x_train,x_test,y_train,y_test = np.load('06_arr_save.npy',allow_pickle=True)

观察训练和测试数据集的形状

# 获取训练集和测试集的shape
print((x_train.shape[0], x_test.shape[0]))

(576, 192)

得到提取的特征数

# 获取提取到的特征数
print(f'Features extracted: {x_train.shape[1]}')

Features extracted: 180

4、训练多层感知机

接下来我们初始化一个 MLPClassifier。这是一个多层感知器分类器:它使用 LBFGS 或随机梯度下降优化对数损失函数。

与 SVM 或朴素贝叶斯不同,MLPClassifier 具有用于分类目的的内部神经网络。这是一个简单的前馈神经网络模型。

# 初始化多层感知机
model=MLPClassifier(alpha=0.01, batch_size=256, epsilon=1e-08, hidden_layer_sizes=(300,), learning_rate='adaptive', max_iter=500)

设置完模型以后,就可以使用我们划分的训练集对模型进行训练。

%%time
# 训练模型
model.fit(x_train,y_train)

CPU times: user 1min 16s, sys: 6min 20s, total: 7min 37s
Wall time: 3min 50s

MLPClassifier(alpha=0.01, batch_size=256, hidden_layer_sizes=(300,),
learning_rate=‘adaptive’, max_iter=500)

5、预测验证

接下来我们预测测试集的值。并存放在y_pred中(这实际就是测试集的预测情绪)

# 使用测试集进行预测
y_pred=model.predict(x_test)

计算模型的准确性,我们将调用从sklearn导入的accuracy_score() 函数。最后将精度四舍五入到小数点后两位并打印出来。

# 计算模型准确率
accuracy=accuracy_score(y_true=y_test, y_pred=y_pred)# 打印准确率
print("Accuracy: {:.2f}%".format(accuracy*100))

Accuracy: 71.35%

五、任务小结

本实验学习使用库 librosa、soundfile 和 sklearn(以及其他) MLPClassifier 构建模型。通过本实验我们学习到了多层感知机实现语音分类的相关知识,需要掌握以下知识点:

  • 使用MFCC提取声音特征
  • 使用sklearn创建多层感知机
  • 模型的性能评价方法

–end–

说明

本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我

这篇关于语音识别--基于MFCC和多层感知机的语音情感识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968320

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网(IoT)和人工智能技术的发展,智能家居语音控制系统已经成为现代家庭的一部分。通过语音控制设备,用户可以轻松实现对灯光、空调、门锁等家电的控制,提升生活的便捷性和舒适性。本文将介绍如何构建一个基于人工智能的智能家居语音控制系统,包括环境准备

【2.1 深度学习中的感知机是什么】

2.1 深度学习中的感知机是什么 深度学习是机器学习的一个分支,它模拟人脑的工作方式来处理数据,尤其是通过神经网络的结构来自动提取数据的特征并进行分类、回归或其他复杂的任务。在深度学习的早期发展中,许多基础概念和模型为后续的复杂网络奠定了基础。其中,**感知机(Perceptron)**是一个非常重要的基础模型,它实际上是神经网络和深度学习的前身之一。 感知机的基本概念 感知机是一种二分

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互

Clion不识别C代码或者无法跳转C语言项目怎么办?

如果是中文会显示: 此时只需要右击项目,或者你的源代码目录,将这个项目或者源码目录标记为项目源和头文件即可。 英文如下:

【阅读文献】一个使用大语言模型的端到端语音概要

摘要 ssum框架(Speech Summarization)为了 从说话人的语音提出对应的文本二题出。 ssum面临的挑战: 控制长语音的输入捕捉 the intricate cross-mdoel mapping 在长语音输入和短文本之间。 ssum端到端模型框架 使用 Q-Former 作为 语音和文本的中介连接 ,并且使用LLMs去从语音特征正确地产生文本。 采取 multi-st

深度剖析AI情感陪伴类产品及典型应用 Character.ai

前段时间AI圈内C.AI的受够风波可谓是让大家都丈二摸不着头脑,连C.AI这种行业top应用都要找谋生方法了!投资人摸不着头脑,用户们更摸不着头脑。在这之前断断续续玩了一下这款产品,这次也是乘着这个风波,除了了解一下为什么这么厉害的创始人 Noam Shazeer 也要另寻他路,以及产品本身的发展阶段和情况! 什么是Character.ai? Character.ai官网:https://

BERN2(生物医学领域)命名实体识别与命名规范化工具

BERN2: an advanced neural biomedical named entity recognition and normalization tool 《Bioinformatics》2022 1 摘要 NER和NEN:在生物医学自然语言处理中,NER和NEN是关键任务,它们使得从生物医学文献中自动提取实体(如疾病和药物)成为可能。 BERN2:BERN2是一个工具,