特别提一下安装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)
识别率很低只有50%左右,只适合入门
参考资源: