语音识别--基于mfcc和多层感知机的语音情感识别
基于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.samplerate
result=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
发表评论