语音情感识别python代码实现

こ雲淡風輕ζ 提交于 2019-11-28 10:10:06

特别提一下安装hmmlearn库不能直接pip install hmmlearn

安装过程如下:

1. 进入 https://www.lfd.uci.edu/~gohlke/pythonlibs/ ,找到hmmlearn***.whl类型的文件下载(要和自己的python版本相对应)如果你用的是anaconda可以在命令窗口输入conda -activate 进入你的anaconda环境,再输入python -V查看和anaconda对应的版本。如图所示安装自己对应的版本

 

2 然后将下载的文件放在C:\Anaconda3\pkgs\python-3.6.4-h6538335_1\Lib目录(此路径为自己当时安装anaconda的路径,如果找不到可以下载一个everything输入anaconda查找自己当时的安装路径,everything的链接就不附上了),并在此目录下进行安装。然后在命令窗口输入cd +自己anaconda的路径切换到该路径,在该路径下输入

pip install hmmlearn-0.2.1-cp36-cp36m-win_amd64.whl

进行安装,名字需要改成自己下载的文件的名字。至此,安装成功。

import os
import numpy as np
import scipy.io.wavfile as wf
import python_speech_features as sf
import hmmlearn.hmm as hl
def search_file(directory):
    """
    :param directory: 训练音频的路径
    :return: 字典{'apple':[url, url, url ... ], 'banana':[...]}
    """
    # 使传过来的directory匹配当前操作系统
    directory = os.path.normpath(directory)
    objects = {}
    # curdir:当前目录
    # subdirs: 当前目录下的所有子目录
    # files: 当前目录下的所有文件名
    for curdir, subdirs, files in os.walk(directory):
        for file in files:
            if file.endswith('.wav'):
                label = curdir.split(os.path.sep)[-1]   # os.path.sep为路径分隔符
                if label not in objects:
                    objects[label] = []
                # 把路径添加到label对应的列表中
                path = os.path.join(curdir, file)
                objects[label].append(path)
    return objects
train_samples = search_file('G:/Google download/CASIA database/liuchanhg')
#print(train_samples)
train_x, train_y = [], []
# 遍历字典
for label, filenames in train_samples.items():
    # [('apple', ['url1,,url2...'])
    # [("banana"),("url1,url2,url3...")]...
    mfccs = np.array([])
    for filename in filenames:
        sample_rate, sigs = wf.read(filename)
        mfcc = sf.mfcc(sigs, sample_rate)
        if len(mfccs) == 0:
            mfccs = mfcc
        else:
            mfccs = np.append(mfccs, mfcc, axis=0)
    train_x.append(mfccs)
    train_y.append(label)
    models = {}
for mfccs, label in zip(train_x, train_y):
    model = hl.GaussianHMM(n_components=4, covariance_type='diag', n_iter=1000)
    models[label] = model.fit(mfccs)  # # {'apple':object, 'banana':object ...}
    # 读取测试集数据
test_samples = search_file('G:/Google download/CASIA database/wangzhe')
test_x, test_y = [], []
for label, filenames in test_samples.items():
    mfccs = np.array([])
    for filename in filenames:
        sample_rate, sigs = wf.read(filename)
        mfcc = sf.mfcc(sigs, sample_rate)
        if len(mfccs) == 0:
            mfccs = mfcc
        else:
            mfccs = np.append(mfccs, mfcc, axis=0)
    test_x.append(mfccs)
    test_y.append(label)
    pred_test_y = []
for mfccs in test_x:
    # 判断mfccs与哪一个HMM模型更加匹配
    best_score, best_label = None, None
    # 遍历7个模型
    for label, model in models.items():
        score = model.score(mfccs)
        if (best_score is None) or (best_score < score):
            best_score = score
            best_label = label
    pred_test_y.append(best_label)

print(test_y)   
print(pred_test_y)
------- ----------------------------------------
import os
import pandas as pd
mylist= os.listdir('G:/Google download/CASIA database/liuyong')
type(mylist)
#print(mylist[150])
#print(mylist[52][0:-8])
feeling_list=[]
for item in mylist:
    if item[0:-8]=='angray':
        feeling_list.append('angray')
    elif item[0:-8]=='fear' :
        feeling_list.append('fear')
    elif item[0:-8]=='happy' :
        feeling_list.append('happy')
    elif item[6:-16]=='netural' :
        feeling_list.append('netural')
    elif item[6:-16]=='sad':
        feeling_list.append('sad')
    elif item[6:-16]=='surprise':
        feeling_list.append('surprise')
labels = pd.DataFrame(feeling_list)
labels[:10]

---------------------------------------------------------------------
import os
import pandas as pd
import librosa
import librosa.display
import numpy as np
import scipy.io.wavfile as wf
import python_speech_features as sf
mylist= os.listdir('G:/Google download/CASIA database/liuyong')
type(mylist)
#print(mylist[150])
#print(mylist[52][0:-8])
feeling_list=[]
for item in mylist:
    if item[0:-8]=='angray':
        feeling_list.append('angray')
    elif item[0:-8]=='fear' :
        feeling_list.append('fear')
    elif item[0:-8]=='happy' :
        feeling_list.append('happy')
    elif item[6:-16]=='netural' :
        feeling_list.append('netural')
    elif item[6:-16]=='sad':
        feeling_list.append('sad')
    elif item[6:-16]=='surprise':
        feeling_list.append('surprise')
labels = pd.DataFrame(feeling_list)
labels[:10]
def search_file(directory):
    """
    :param directory: 训练音频的路径
    :return: 字典{'apple':[url, url, url ... ], 'banana':[...]}
    """
    # 使传过来的directory匹配当前操作系统
    directory = os.path.normpath(directory)
    objects = {}
    # curdir:当前目录
    # subdirs: 当前目录下的所有子目录
    # files: 当前目录下的所有文件名
    for curdir, subdirs, files in os.walk(directory):
        for file in files:
            if file.endswith('.wav'):
                label = curdir.split(os.path.sep)[-1]   # os.path.sep为路径分隔符
                if label not in objects:
                    objects[label] = []
                # 把路径添加到label对应的列表中
                path = os.path.join(curdir, file)
                objects[label].append(path)
    return objects
train_samples = search_file('G:/Google download/CASIA database/liuchanhg')
#print(train_samples)
train_x, train_y = [], []
# 遍历字典
df = pd.DataFrame(columns=['feature'])
bookmark=0
for label, filenames in train_samples.items():
    # [('apple', ['url1,,url2...'])
    # [("banana"),("url1,url2,url3...")]...
    mfccs = np.array([])
    for filename in filenames:
        sample_rate, sigs = wf.read(filename)
        mfcc = sf.mfcc(sigs, sample_rate)
        if len(mfccs) == 0:
            mfccs = mfcc
        else:
            mfccs = np.append(mfccs, mfcc, axis=0)
        df.loc[bookmark] = [mfccs]
        bookmark=bookmark+1  
df3 = pd.DataFrame(df['feature'].values.tolist())
newdf = pd.concat([df3,labels], axis=1)
rnewdf = newdf.rename(index=str, columns={"0": "label"})
from sklearn.utils import shuffle
rnewdf = shuffle(newdf)
rnewdf=rnewdf.fillna(0)
newdf1 = np.random.rand(len(rnewdf)) < 0.8
train = rnewdf[newdf1]
test = rnewdf[~newdf1]
trainfeatures = train.iloc[:, :-1]
trainlabel = train.iloc[:, -1:]
testfeatures = test.iloc[:, :-1]
testlabel = test.iloc[:, -1:]

参考资源:

 https://www.cnblogs.com/LXP-Never/p/11415110.html#声音合成

https://blog.csdn.net/qq_33598125/article/details/85124778

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!