背景
NLP和图像比较普遍,语音识别文字做的很多,今天尝试下做语音情感识别。
语音情感识别系统图
wav格式的语音包
特征提取方法-mfcc
在这里我选用了mfcc算法来提取语音基于谱的特征
算法如下
mfcc算法
主函数调用
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@File : main.py
@Author: Piepis
@Date : 2021/3/11 12:53
@Desc :
'''
from calcmfcc import *
import scipy.io.wavfile as wav
import numpy
import os
import scipy.io as io
file_path = '../标准语音测试包/中文/'
mat_path="mfcc_mat_save_path.mat"
pathnames = []
for (dirpath, dirnames, filenames) in os.walk(file_path):
for filename in filenames:
if os.path.splitext(filename)[-1] ==".wav":
pathnames += [os.path.join(dirpath, filename)]
mat= numpy.zeros((len(pathnames),39*5)) #生成一个3行4列全部元素为0的矩阵
N = 0
for file in pathnames:
(rate,sig) = wav.read(file)
mfcc_feat = calcMFCC_delta_delta(sig,rate)
# axis=0,计算每一列的均值
c1=numpy.mean(mfcc_feat,axis=0) #平均值
c2=numpy.min(mfcc_feat,axis=0) # 最小值
c3=numpy.max(mfcc_feat,axis=0) # 最大值
c4=numpy.median(mfcc_feat,axis=0) # 中值
c5=numpy.std(mfcc_feat,axis=0) # 标准偏差
tt=numpy.concatenate((c1,c2 ,c3,c4,c5),axis=0)
mat[N,:]=tt
N+=1
io.savemat(mat_path, {'mfcc_name': mat})
print(mfcc_feat.shape)
print(mat.shape)
分类算法 svm
因为用来train的语音样本数据比较少,大概有一千条左右(数据来自CCPR),选用了常用于小样本的SVM算法来做情感分类。
核心代码
def svm_cross_validation(train_x, train_y):
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
model = SVC(kernel='rbf', probability=True,random_state=seed)
param_grid = {'C': [1e-3, 1e-2, 1e-1,2,0.4, 1, 10, 100, 1000], 'gamma': [0.001, 0.0001]}
grid_search = GridSearchCV(model, param_grid, n_jobs = 8, verbose=1)
grid_search.fit(train_x, train_y)
best_parameters = grid_search.best_estimator_.get_params()
for para, val in list(best_parameters.items()):
print(para, val)
model = SVC(kernel='rbf', C=best_parameters['C'], gamma=best_parameters['gamma'], probability=True)
model.fit(train_x, train_y)
return model
预测结果 与实际结果对比
没有咋找最参数,只是简单的找了下。效果不太好,40%的识别率。(也有可能是语音是从电视剧里截出来的,有很多背景杂音。我用德国语音库测了下,能达到65%以上)
混淆矩阵(Confusion Matrix)
参考文献
基于听觉特性的Mel频率倒谱分析
MFCC算法的实现过程(原理篇)
语音识别的第一步MFCC特征提取代码(Python)