Skip to content

Speech Emotion Recognition

speech-emotion-recognition是使用Emo-db数据集来进行机器学习来实现对语音情感进行识别的语音分析库。

安装

首先 clone 项目:

Bash
git clone https://github.com/hkveeranki/speech-emotion-recognition.git

项目中包含了一个 requirements.txt 即依赖我们直接安装:

Bash
# sklearn 需要修改为 skikit-learn
pip install -r requirements.txt

之后就可以直接使用了。

目录架构

  • speechemotionrecognition/: 包文件夹
    • dnn.py: 训练深度学习(Deep Learning)模型的代码,支持 CNN 和 LSTM
    • mlmodel.py: 训练非深度学习模型的代码,支持 SVM、Random Forest 和 Neural Network
    • utilities.py: 包含读取文件、提取特征以及创建测试和训练数据的代码
  • dataset/: 数据集,它包含了四个分类对应高兴、难过、中立和伤心,也就是我们最终需要四个领域的音频判断,每个分类下面包含对应的 wav 文件(监督)
  • models/: 包含在测试数据上获取的最佳模型
  • examples/: 包含使用该包的示例(仅仅包含如何训练,而不包含使用)

加载已有模型

该项目模型是由 keras 生成的 .h5 文件,可以通过 CNN/LSTM.restore_model(load_path) 来导入,因此其中的重点变为构建 CNN 和 LSTM 对象:

Python
from speechemotionrecognition.dnn import LSTM

# input_shape 即输入音频被提取特征值的形状
# num_classes 类型数量对应 _CLASS_LABELS = ("Neutral", "Angry", "Happy", "Sad") 即 4 个
lstm_model = LSTM(input_shape=(198, 39), num_classes=4)
lstm_model.trained # False

# 导入模型
lstm_model.restore_model('./models/best_model_LSTM_39.h5')
lstm_model.trained # True

要想获取特征值的形状:

Python
from speechemotionrecognition.utilities import get_feature_vector_from_mfcc

# 第二个参数表示是否归一,目前都是否
vector = get_feature_vector_from_mfcc('./dataset/Angry/03a01Wa.wav', False)
vector.shape # (198, 39)

模型如果已经训练完毕,我们就可以来对非监督的单一语音进行识别:

Python
# 2 对应了 _CLASS_LABELS 中的 Happy
lstm_model.predict_one(get_feature_vector_from_mfcc('./123.wav', False)) #  2

Note

需要注意音频被特征化后的形状必须统一为 (198, 39),它是由采样频率、声道等声音的各种属性决定的。因此两个声音的这些属性必须相等

Tips

训练模型实际上就是对监督好的数据进行训练,然后通过调节其中的参数来让对应类别各自分布到自己的取值范围内来实现的。因此机器学习的重点就是如果调节各个参数来获取特征值