语音识别--基于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
                
                    
                
            
                                            
                                            
                                            
                                            
发表评论