当前位置: 代码网 > it编程>游戏开发>ar > 语音识别--基于MFCC和多层感知机的语音情感识别

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

2024年08月06日 ar 我要评论
本实验学习使用库 librosa、soundfile 和 sklearn(以及其他) MLPClassifier 构建模型。通过本实验我们学习到了多层感知机实现语音分类的相关知识,需要掌握以下知识点:- 使用MFCC提取声音特征- 使用sklearn创建多层感知机- 模型的性能评价方法

基于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
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com