语音情感识别,最好的例子可以在呼叫中心看到。如果您注意到了,呼叫中心的员工永远不会以相同的方式交谈,他们与客户的推销/交谈方式会随客户而改变。现在,普通民众也确实会发生这种情况,但这与呼叫中心有何关系?员工可以从语音中识别出客户的情绪,从而可以改善服务质量并吸引更多人。通过这种方式,他们正在使用语音情感识别。因此,让我们详细讨论这个项目。
什么是语音情感识别?
语音情感识别(缩写为SER
)是试图从语音中识别人的情绪和情感状态的行为。这是利用了语音通常通过语调和音调反映潜在情感
的事实。这也是动物(如:狗和马)用来理解人类情感的现象。
SER
之所以艰难,是因为情感是主观的,而注释音频则具有挑战性。
什么是librosa?
librosa是用于分析音频和音乐的Python库。它具有更扁平化的布局,标准化的接口和名称,向后兼容,模块化功能和可读代码。(在本项目中我们将演示如何使用pip安装它(以及一些其他软件包))。
语音情感识别–目标
使用librosa
和sklearn
库以及RAVDESS
数据集构建一个模型来识别语音情感。
语音情感识别–关于Python项目
在这个项目中,我们将使用librosa,soundfile
和sklearn
库(以及其他)来使用MLPClassifier
构建模型。这将能够识别声音文件中的情绪。我们将加载数据,从中提取特征,然后将数据集分为训练和测试集。然后,我们将初始化MLPClassifier
并训练模型。最后,我们将计算模型的准确性。
数据集
对于这个项目,我们将使用RAVDESS
数据集;这是Ryerson
情绪语音和歌曲数据集的视听数据库,可以免费下载。该数据集包含7356
个文件,被247
个个体在情感有效性,强度和真实性方面进行了10次评估。整个数据集来自24个演员,为24.8GB,但是我们降低了所有文件的采样率,您可以在此处下载。
先决条件
您需要使用pip安装以下库:
pip install librosa soundfile numpy sklearn pyaudio
如果您在使用pip安装librosa时遇到问题,则可以使用conda进行尝试。或者在此处下载对应的whl文件,
语音情感识别Python项目的步骤
1.进行必要的导入:
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
2.定义一个函数extract_feature从声音文件中提取mfcc,chroma和mel特征。此函数采用4个参数-文件名和3个布尔参数用于这三个特征:
- mfcc:梅尔频率倒谱系数,表示声音的短期功率谱
- chroma:属于12种不同的音高等级
- mel:梅尔频谱图频率
使用with-as通过soundfile.SoundFile打开声音文件,这样一旦完成,将会自动关闭。从中读取并命名为X。同时得到采样率。如果chroma为True,则获取X的Short-Time傅立叶变换。
让结果为一个空的numpy数组。现在,对于这三个特征中的每个特征(如果存在),从librosa.feature
(例如,对于mfcc为librosa.feature.mfcc
)调用相应的函数,并获取平均值。从numpy
中调用带有结果和特征值的函数hstack()
,并将其存储在结果中。hstack()
按水平顺序(以柱状方式)堆叠数组。然后,返回结果。
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
if chroma:
stft=np.abs(librosa.stft(X))
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:
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
数据集中可用的数字和情感,并定义一个列表,以容纳我们想要的冷静、快乐、恐惧、厌恶的情感。
emotions={
'01':'neutral',
'02':'calm',
'03':'happy',
'04':'sad',
'05':'angry',
'06':'fearful',
'07':'disgust',
'08':'surprised'
}
observed_emotions=['calm', 'happy', 'fearful', 'disgust']
4.现在,让我们使用函数load_data()
加载数据–这将测试集的相对大小作为参数。x和y是空列表;我们将使用glob
模块中的glob()
函数来获取数据集中声音文件的所有路径名。为此,我们使用的模式是:“E:\\Jupyter\\ speech-emotion-recognition-ravdess-data\\Actor_*\\*.wav”
。这是因为我们的数据集如下所示:
因此,对于每个这样的路径,请通过在“-”附近拆分名称并提取第三个值来获取文件的基本名称和情感:
使用我们的字典,这个数字变成一种情绪,并且我们的函数检查这种情绪是否在我们的observed_emotions列表中;如果不是,它将继续到下一个文件。它调用extract_feature并将返回的内容存储在’feature’中。然后,将特征附加到x,将情感附加到y。因此,列表x包含特征,而y包含情感。我们使用这些,测试大小和随机状态值调用函数train_test_split,并返回该值。
def load_data(test_size=0.2):
x,y=[],[]
for file in glob.glob("E:\\Jupyter\\speech-emotion-recognition-ravdess-data\\Actor_*\\*.wav"):
file_name=os.path.basename(file)
emotion=emotions[file_name.split("-")[2]]
if emotion not in observed_emotions:
continue
feature=extract_feature(file, mfcc=True, chroma=True, mel=True)
x.append(feature)
y.append(emotion)
return train_test_split(np.array(x), y, test_size=test_size, random_state=9)
5.是时候将数据集分为训练和测试集了!让我们将测试集保留所有内容的25%,并为此使用load_data函数。
x_train,x_test,y_train,y_test=load_data(test_size=0.25)
6.观察训练和测试数据集的形状:
print((x_train.shape[0], x_test.shape[0]))
7.获取提取的特征数量。
print(f'Features extracted: {x_train.shape[1]}')
8.现在,让我们初始化一个MLPClassifier
。这是一个多层感知器分类器;它使用LBFGS
或随机梯度下降法对对数损失函数进行了优化。与SVM
或朴素贝叶斯不同,MLPClassifier
具有用于分类目的的内部神经网络。这是前馈ANN
模型。
model=MLPClassifier(alpha=0.01, batch_size=256, epsilon=1e-08, hidden_layer_sizes=(300,), learning_rate='adaptive', max_iter=500)
9.拟合/训练模型
model.fit(x_train,y_train)
10.让我们预测测试集的值。这给了我们y_pred(测试集中特征的预测情感)。
y_pred=model.predict(x_test)
11.为了计算模型的准确性,我们将调用从sklearn导入的precision_score()函数。最后,我们将精度四舍五入到小数点后两位并输出出来。
accuracy=accuracy_score(y_true=y_test, y_pred=y_pred)
print("Accuracy: {:.2f}%".format(accuracy*100))
摘要
在这个Python项目中,我们学会了从语音中识别情感。为此,我们使用了MLPClassifier,并使用了soundfile库来读取声音文件,并使用librosa库来从中提取特征。如您所见,该模型的准确性为74.79%。这对我们来说已经足够了