Giter Site home page Giter Site logo

renovamen / speech-emotion-recognition Goto Github PK

View Code? Open in Web Editor NEW
869.0 15.0 206.0 151.9 MB

Speech emotion recognition implemented in Keras (LSTM, CNN, SVM, MLP) | 语音情感识别

License: MIT License

Python 100.00%
speech-emotion-recognition lstm svm mlp opensmile cnn

speech-emotion-recognition's Introduction

Speech Emotion Recognition

用 LSTM、CNN、SVM、MLP 进行语音情感识别,Keras 实现。

改进了特征提取方式,识别准确率提高到了 80% 左右。原来的版本的存档在 First-Version 分支

English Document | 中文文档

 

Environments

  • Python 3.8
  • Keras & TensorFlow 2

 

Structure

├── models/                // 模型实现
│   ├── common.py          // 所有模型的基类
│   ├── dnn                // 神经网络模型
│   │   ├── dnn.py         // 所有神经网络模型的基类
│   │   ├── cnn.py         // CNN
│   │   └── lstm.py        // LSTM
│   └── ml.py              // SVM & MLP
├── extract_feats/         // 特征提取
│   ├── librosa.py         // librosa 提取特征
│   └── opensmile.py       // Opensmile 提取特征
├── utils/
│   ├── files.py           // 用于整理数据集(分类、批量重命名)
│   ├── opts.py            // 使用 argparse 从命令行读入参数
│   └── plot.py            // 绘图(雷达图、频谱图、波形图)
├── config/                // 配置参数(.yaml)
├── features/              // 存储提取好的特征
├── checkpoints/           // 存储训练好的模型权重
├── train.py               // 训练模型
├── predict.py             // 用训练好的模型预测指定音频的情感
└── preprocess.py          // 数据预处理(提取数据集中音频的特征并保存)

 

Requirments

Python

Tools

 

Datasets

  1. RAVDESS

    英文,24 个人(12 名男性,12 名女性)的大约 1500 个音频,表达了 8 种不同的情绪(第三位数字表示情绪类别):01 = neutral,02 = calm,03 = happy,04 = sad,05 = angry,06 = fearful,07 = disgust,08 = surprised。

  2. SAVEE

    英文,4 个人(男性)的大约 500 个音频,表达了 7 种不同的情绪(第一个字母表示情绪类别):a = anger,d = disgust,f = fear,h = happiness,n = neutral,sa = sadness,su = surprise。

  3. EMO-DB

    德语,10 个人(5 名男性,5 名女性)的大约 500 个音频,表达了 7 种不同的情绪(倒数第二个字母表示情绪类别):N = neutral,W = angry,A = fear,F = happy,T = sad,E = disgust,L = boredom。

  4. CASIA

    汉语,4 个人(2 名男性,2 名女性)的大约 1200 个音频,表达了 6 种不同的情绪:neutral,happy,sad,angry,fearful,surprised。

 

Usage

Prepare

安装依赖:

pip install -r requirements.txt

(可选)安装 Opensmile

 

Configuration

configs/ 文件夹中的配置文件(YAML)里配置参数。

其中 Opensmile 标准特征集目前只支持:

如果需要用其他特征集,可以自行修改 extract_feats/opensmile.py 中的 FEATURE_NUM 项。

 

Preprocess

首先需要提取数据集中音频的特征并保存到本地。Opensmile 提取的特征会被保存在 .csv 文件中,librosa 提取的特征会被保存在 .p 文件中。

python preprocess.py --config configs/example.yaml

其中,configs/example.yaml 是你的配置文件路径。

 

Train

数据集路径可以在 configs/ 中配置,相同情感的音频放在同一个文件夹里(可以参考 utils/files.py 整理数据),如:

└── datasets
    ├── angry
    ├── happy
    ├── sad
    ...

然后:

python train.py --config configs/example.yaml

 

Predict

用训练好的模型来预测指定音频的情感。checkpoints/里有一些已经训练好的模型。

python predict.py --config configs/example.yaml

 

Functions

Radar Chart

画出预测概率的雷达图。

来源:Radar

import utils

"""
Args:
    data_prob (np.ndarray): 概率数组
    class_labels (list): 情感标签
"""
utils.radar(data_prob, class_labels)

 

Play Audio

播放一段音频

import utils

utils.play_audio(file_path)

 

Plot Curve

画训练过程的准确率曲线和损失曲线。

import utils

"""
Args:
    train (list): 训练集损失值或准确率数组
    val (list): 测试集损失值或准确率数组
    title (str): 图像标题
    y_label (str): y 轴标题
"""
utils.curve(train, val, title, y_label)

 

Waveform

画出音频的波形图。

import utils

utils.waveform(file_path)

 

Spectrogram

画出音频的频谱图。

import utils

utils.spectrogram(file_path)

 

Other Contributors

speech-emotion-recognition's People

Contributors

renovamen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

speech-emotion-recognition's Issues

学习曲线绘制

你好,请问下里面的SVM和MLP的学习曲线图绘制没有实现代码,请问该如何绘制?谢谢啦!
Hello, there is no implementation code for drawing the learning curve graphs of SVM and MLP. How to draw it? Thank you!

关于模型搭建中的一些问题

最近在学习语音情感分析的相关知识,前段时间一直在配置这个模型,目前已完成语音特征提取。
遇到的问题:
(1)在运行train.py时,发现20的epochs数,每次运行的时间居然只有3ms/step。
(2)在cnn.py中,
from tensorflow.python.keras.layers import Dense, Dropout, Flatten, Conv1D, Activation, BatchNormalization, MaxPooling1D
这句有报错:cannot import name 'BatchNormalization' from 'tensorflow.python.keras.layers'

关于问题(1):
我只能认为数据完全没有跑,一般来说即使用1200句的casia,也至少应该跑4个小时以上才对。所有我去对models里的py文件逐行debug,
于是有了问题(2):
没有BatchNormalization的接口。
我自己去读了tensorflow.python.keras.layers下的__init__.py文件,发现根本没有BatchNormalization的接口,只有tensorflow\python\layers(不在Keras中)中有normalization.py文件。
我自己是在豆瓣源上下载的TensorFlow2.8,其各个版本和其他源上的我都试过,都没有BatchNormalization。不知道TensorFlow2.8中BatchNormalization的位置,或者是否已删除或用其他接口代替。

个人看了一下,估计目前最大的问题就在模型的搭建上,希望了解一下大致训练多长时间,accuracy和loss在哪个范围内是正常的。还有就是您用的TensorFlow属于哪个版本,获取途径是什么。被这个折磨了快有两天多了,希望能解答一下疑惑,非常感谢。

EMO-DB数据集训练问题

请问在训练EMO-DB数据集时,除了在config里面的路径修改,特征集位置修改,在lstm.py里面的class_lables修改为7之外,请问还要修改其他地方吗,我这里显示这样的报错ValueError: Shapes (32, 6) and (32, 7) are incompatible,感觉是哪里的代码还需要修改,求指正,非常非常感谢!

关于文件路径问题

请问在您给出的代码的opensimle_feature.py文件中的第32行代码reader = csv.reader(open(Config.FEATURE_PATH + 'single_feature.csv', 'r'))指向的是什么

数据处理问题

在调用files函数整理数据时候,只有remove函数起了作用,其余两个函数调用不起来,请问下是什么原因。

关于模型训练的问题

您好,看了您的代码受益很多,但是在模型训练的时候我遇到了一些问题。好像模型训练还没有开始就结束了。
刚一开始出现-----------start---------------之后出现一些数字,紧接着出现------------end---------------
然后就结束了。。。
另外我在Models里发现一些.m文件不知道,这是训练好的模型?

期待您的回复。

谢谢
祝好

数据标准化模型保存

您好,
我在执行preprocess.py和train.py时,在 joblib.dump(scaler, scaler_path)这一行都会报错:
File "F:\GitHub\SER\Speech-Emotion-Recognition\extract_feats\opensmile.py", line 86, in load_feature
joblib.dump(scaler, scaler_path)
File "E:\install\Anacode3-5.3.1\lib\site-packages\joblib\numpy_pickle.py", line 479, in dump
with open(filename, 'wb') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'checkpoints\SCALER_OPENSMILE.m'
SCALER_OPENSMILE.m这个文件生成不了,查阅很多资料,没有找到解决的办法,请问您有遇到过吗?或者您知道是什么原因吗?非常感谢您的回复!

关于LSTM预训练模型准确率的问题

非常感谢您公布的代码,极具参考价值。
关于LSTM预训练模型识别准确率的问题,我下载了CASIA的1200条数据,参照SER.py中模型的predict方法,对所有数据进行了测试,发现其中错误识别音频为9个,请问我是哪里测试错误了吗?因为这个准确率似乎超出其他算法效果很多。期待您的回复。

过拟合问题

你好,我用Mosi数据集跑了贵程序,但是出现了过拟合问题,而且是从一开始训练就过拟合,调整参数后还是过拟合严重。请问您有出现类似问题吗?谢谢

使用其他测试音频报错

使用其他测试音频,修改了路径,但是预测出来的还是原来作者给的预测结果,音频波形图更新了,请问作者是哪一步固定了吗

Opensmile提取特征

Opensmile提取特征的时候建议加上

' -appendarff 0'
即变成cmd = 'cd ' + config.opensmile_path+' && SMILExtract -C ' + opensmile_config_path + ' -I ' + filepath + ' -O ' + single_feat_path + ' -appendarff 0'

否则,按照原来的写法,single_feature文件会不断堆积,使得特征提取非常非常慢

关于预处理的问题,opensmile

您好,想请教一下在运行python preprocess.py --config configs/lstm.yaml时,出现以下错误:
(MSG) [2] SMILExtract: openSMILE starting!
(MSG) [2] SMILExtract: config file is: D:\Pycharm\code\Speech-Emotion\Speech-Emotion-Recognition-master\opensmile-3.0-win-x64\config\IS10_paraling.conf
(MSG) [2] cComponentManager: successfully registered 103 component types.
(ERR) [1] configManager: cFileConfigReader::openInput : cannot find input file '../shared/standard_wave_input.conf.inc'!
Ended reading folder angry
这个err我在百度上查找了许多方法,都没能解决,请问您知道这是什么原因吗? 我在cmd里可以运行opensmile并且没有报错。
期待您的回复!

运行出现的问题

有没有大佬可以帮忙解决一下问题,运行train时报错
Traceback (most recent call last):
File "D:\pythonProject\work\Speech-Emotion-Recognition-master\train.py", line 55, in
train(config)
File "D:\pythonProject\work\Speech-Emotion-Recognition-master\train.py", line 22, in train
x_train, x_test, y_train, y_test = of.load_feature(config, config.train_feature_path_opensmile, train=True)
File "D:\pythonProject\work\Speech-Emotion-Recognition-master\extract_feats\opensmile.py", line 79, in load_feature
scaler = StandardScaler().fit(X)
File "D:\pythonProject\venv\lib\site-packages\sklearn\preprocessing_data.py", line 837, in fit
return self.partial_fit(X, y, sample_weight)
File "D:\pythonProject\venv\lib\site-packages\sklearn\base.py", line 1151, in wrapper
return fit_method(estimator, *args, **kwargs)
File "D:\pythonProject\venv\lib\site-packages\sklearn\preprocessing_data.py", line 873, in partial_fit
X = self._validate_data(
File "D:\pythonProject\venv\lib\site-packages\sklearn\base.py", line 604, in _validate_data
out = check_array(X, input_name="X", **check_params)
File "D:\pythonProject\venv\lib\site-packages\sklearn\utils\validation.py", line 969, in check_array
raise ValueError(
ValueError: Found array with 0 sample(s) (shape=(0, 1582)) while a minimum of 1 is required by StandardScaler.
求求了

preprocess运行时的问题

请问有没有大佬可以解决一下这个问题呀
Opensmile cmd: cd D:\pythonProject\work\opensmile && ./SMILExtract_Release -C D:\pythonProject\work\opensmile\config\IS10_paraling.conf -I D:\pythonProject\work\Speech-Emotion-Recognition-master\datasets\CASIA\surprise\249.wav -O D:\pythonProject\work\Speech-Emotion-Recognition-master\features\6-category\single_feature.csv
'.' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'.' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
Opensmile cmd: cd D:\pythonProject\work\opensmile && ./SMILExtract_Release -C D:\pythonProject\work\opensmile\config\IS10_paraling.conf -I D:\pythonProject\work\Speech-Emotion-Recognition-master\datasets\CASIA\surprise\250.wav -O D:\pythonProject\work\Speech-Emotion-Recognition-master\features\6-category\single_feature.csv
Ended reading folder surprise
在运行preprocess.py文件时出现这个问题,但是想改也改不出来

pretrained的模型

请问发布的pretrained的模型是在casia上训练的吗,有在英文数据集上训练的模型吗

预处理问题

为什么我路径设置好了,预处理也跑完了,最后打开csv文件是空的。
我用cmd单独处理一个音频是可以提取出csv文件的但是放在程序里跑完了一条语音特征都没提取出来

运行 predict.py 时报错 “No module named 'sklearn.preprocessing.data'”

环境中的版本为 scikit-learn==1.0.2,和 requirement 保持一致
在配置完 opensmile 路径后,也能够成功生成 predict.csv(虽然有一些错误提示)
但最后报错误 No module named 'sklearn.preprocessing.data'

进一步研究发现错误来源是:
joblib.load('./checkpoints/SCALER_OPENSMILE.m')
核查版本 joblib==1.1.0 和文件路径也没有错误

实在找不到解决方案了,请指点
感谢!

Opensmile extracting...
Opensmile cmd: cd C:/Users/aidi/Desktop/opensmile/opensmile-3.0-win-x64//bin && SMILExtract -C C:/Users/aidi/Desktop/opensmile/opensmile-3.0-win-x64/config/is09-13/IS09_emotion.conf -I C:\Users\aidi\Desktop\Speech-Emotion-Recognition\samples\201_angry.wav -O C:\Users\aidi\Desktop\Speech-Emotion-Recognition\features/6-category/opensmile_casia/single_feature.csv -appendarff 0
(MSG) [2] SMILExtract: openSMILE starting!
(MSG) [2] SMILExtract: config file is: C:/Users/aidi/Desktop/opensmile/opensmile-3.0-win-x64/config/is09-13/IS09_emotion.conf
(MSG) [2] cComponentManager: successfully registered 103 component types.
(MSG) [2] instance 'lldsink': No filename given, disabling this sink component.
(MSG) [2] instance 'lldhtksink': No filename given, disabling this sink component.
(MSG) [2] instance 'lldarffsink': No filename given, disabling this sink component.
(MSG) [2] instance 'csvsink': No filename given, disabling this sink component.
(MSG) [2] instance 'htksink': No filename given, disabling this sink component.
(MSG) [2] instance 'arffsink': writing ARFF header (384 features)...
(MSG) [2] cComponentManager: successfully finished createInstances (25 component instances were finalised, 1 data memories were finalised)
(MSG) [2] cComponentManager: starting single thread processing loop
(MSG) [2] cComponentManager: Processing finished! System ran for 147 ticks.
Opensmile extract done.
Traceback (most recent call last):
File "C:\Users\aidi\anaconda3\envs\SER\lib\site-packages\joblib\numpy_pickle.py", line 587, in load
obj = _unpickle(fobj, filename, mmap_mode)
File "C:\Users\aidi\anaconda3\envs\SER\lib\site-packages\joblib\numpy_pickle.py", line 506, in _unpickle
obj = unpickler.load()
File "C:\Users\aidi\anaconda3\envs\SER\lib\pickle.py", line 1212, in load
dispatchkey[0]
File "C:\Users\aidi\anaconda3\envs\SER\lib\pickle.py", line 1528, in load_global
klass = self.find_class(module, name)
File "C:\Users\aidi\anaconda3\envs\SER\lib\pickle.py", line 1579, in find_class
import(module, level=0)
ModuleNotFoundError: No module named 'sklearn.preprocessing.data'

有关数据集

作者您好:
能否提供一下CASIA的数据集,万分感谢!

predict.py not working with librosa feature extraction

When I try to use librosa for feature extraction I am met with the following error:

Traceback (most recent call last):
  File "C:\Users\91983\Documents\Speech-Emotion-Analyzer\Speech-Emotion-Recognition\predict.py", line 41, in <module>
    predict(config, audio_path, model)
  File "C:\Users\91983\Documents\Speech-Emotion-Analyzer\Speech-Emotion-Recognition\predict.py", line 29, in predict
    result = model.predict(test_feature)
  File "C:\Users\91983\Documents\Speech-Emotion-Analyzer\Speech-Emotion-Recognition\models\ml.py", line 62, in predict
    return self.model.predict(samples)
  File "C:\Users\91983\anaconda3\envs\face\lib\site-packages\sklearn\svm\_base.py", line 810, in predict
    y = super().predict(X)
  File "C:\Users\91983\anaconda3\envs\face\lib\site-packages\sklearn\svm\_base.py", line 433, in predict
    X = self._validate_for_predict(X)
  File "C:\Users\91983\anaconda3\envs\face\lib\site-packages\sklearn\svm\_base.py", line 611, in _validate_for_predict
    X = self._validate_data(
  File "C:\Users\91983\anaconda3\envs\face\lib\site-packages\sklearn\base.py", line 600, in _validate_data
    self._check_n_features(X, reset=reset)
  File "C:\Users\91983\anaconda3\envs\face\lib\site-packages\sklearn\base.py", line 400, in _check_n_features
    raise ValueError(
ValueError: X has 312 features, but SVC is expecting 1582 features as input.

关于测试问题

您好,我是语音情感识别的学习新手,我想请教您几个问题:
(1)您里面的feauture中分为只有训练集,请问测试集在哪,还是您所写的播放一段音频(那这段音频是随机采集的还是数据库里的)
(2)我在运行的过程中一直出现ImportError: cannot import name 'Train' from 'SER'错误,请问这种出错原因在哪?
期待您的回复,谢谢

single_feature.csv

single_feature.csv这个文件可以传一个类似的文件吗?我想知道格式是什么样的

为什么LSTM只有一个time step

In file 'lstm.py':
model.add(KERAS_LSTM(rnn_size, input_shape=(1, input_shape))) # (time_steps = 1, n_feats)

LSTM的输入不应该包含有多个time step吗?

请教模型和数据集的相关问题

作者大大您好,我在学习您的代码过程中遇到了一点问题想跟您请教,
1、请问您的模型是基于哪个数据集进行训练的呢?
2、另外关于file.py文件里面的处理数据集的三个函数只有remove可以成功调用运行,另外两个改名和移动没有运行不知道是什么原因?
3、请问方便的话可以提供你file处理之后的数据集吗,谢谢您!
期待您的回复!提前祝您新年快乐!!!

识别时数据的问题

我运行代码什么都没问题,然后自己截取了一个小的语音数据集,时长都是1s,但是识别测试的时候就会报错,语音无法识别,我该怎么办

特征提取问题

您好,想请问提取特征时使用IS10_paraling可以训练和测试,但是使用ComParE_2016提取特征后训练会报错。还有就是特征越多效果越好吗?之前只用过默认的IS10_paraling

使用其他音频运行predict.py时会报错

使用其他音频测试时,会出现:
Opensmile extracting...
Opensmile cmd: cd D:\project\Speech-Emotion-Recognition-master3\opensmile-3.0\bin && SMILExtract -C D:\project\Speech-Emotion-Recognition-master3\opensmile-3.0\config\is09-13\IS10_parali
ng.conf -I D:/project/Speech-Emotion-Recognition-master1/datasets/CASIA/angry/202-angry-zhaoquanyin.wav -O D:\project\Speech-Emotion-Recognition-master3\features\6-category\opensmile_casi
a\single_feature.csv -appendarff 0
(MSG) [2] SMILExtract: openSMILE starting!
(MSG) [2] SMILExtract: config file is: D:\project\Speech-Emotion-Recognition-master3\opensmile-3.0\config\is09-13\IS10_paraling.conf
(MSG) [2] cComponentManager: successfully registered 103 component types.
(MSG) [2] instance 'lldsink': No filename given, disabling this sink component.
(MSG) [2] instance 'lldhtksink': No filename given, disabling this sink component.
(MSG) [2] instance 'lldarffsink': No filename given, disabling this sink component.
(MSG) [2] instance 'csvsink': No filename given, disabling this sink component.
(MSG) [2] instance 'htksink': No filename given, disabling this sink component.
(ERR) [1] cWaveSource: failed to open input file 'D:/project/Speech-Emotion-Recognition-master1/datasets/CASIA/angry.wav'
Opensmile extract done.
格式用的是wav,但还是会报错。使用训练集的音频不会报错。
想不到问题所在,请教一下问题出在哪?

关于语音情感识别项目预测准确率的问题

作者您好,非常荣幸可以在GitHub上面看到您的语音情感识别的项目,我在运行起来您的项目之后,对于CASIA给出的样本音频进行预测,都是准确的,但是使用我在视频中截取的音频进行预测,识别结果不太理想,我想问一下您,就是这个是音频的问题,还是您的项目需要我自己先训练出来一个模型再做预测,然后麻烦问一下您,就是你项目给出的模型准确率大概是多少呀,您说的准确率到80%是怎么实现的呀,可以告诉我一下嘛,如果可以的话,您可以提供一份效果比较好的预训练好的模型供我学习嘛。如有打扰,十分抱歉。非常感谢您的项目对我的帮助,祝您生活愉快!

CASIA dataset access

Hi,

Is it possible to get the CASIA dataset?
Is this one closed-door dataset? Is there any way to buy it?

Best,
Lance

ValueError: 'Recognition' is not in list

mfcc_data.append([file, features, config.class_labels.index(label)]) 

配置文件修改为二分类,标签名字改了,运行preprocess.py文件,出现这个错误。
请问这个怎么解决

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.