语音识别是一门交叉学科。近二十年来,语音识别技术取得显著进步,开始从实验室走向市场。人们预计,未来10年内,语音识别技术将进入工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。 语音识别听写机在一些领域的应用被美国新闻界评为1997年计算机发展十件大事之一。很多专家都认为语音识别技术是2000年至2010年间信息技术领域十大重要的科技发展技术之一。 语音识别技术所涉及的领域包括:信号处理、模式识别、概率论和信息论、发声机理和听觉机理、人工智能等等。
此次用的是python3.6的版本实现的,安装一些相关模块sklearn:
pip install sklearn
会自动下载相关的包,好像一般来说,是下载最新的(不敢确认)。
中间也可能会存在一定的错误,导致失败,但可以重新,继续下载,反正我是这样的。
知道成功安装。
gParam的代码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
u'''
Created on 2019年4月27日
@author: wuluo
'''
__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2019-04-27'
TRAIN_DATA_PATH = 'G:/2018and2019two/duomeitijishu/data/train/'
TEST_DATA_PATH = 'G:/2018and2019two/duomeitijishu/data/test/'
NSTATE = 4
NPDF = 3
MAX_ITER_CNT = 100
NUM = 10
if __name__ == "__main__":
pass
对于读入的路径,我用的是绝对路径,也就是写死。
test的代码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
u'''
Created on 2019年4月27日
@author: wuluo
'''
__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2019-04-27'
import numpy as np
from numpy import *
from duomeiti import gParam
from duomeiti import my_hmm
from my_hmm import gmm_hmm #可会出现报错,但实际运行起来,没有问题
my_gmm_hmm = gmm_hmm()
my_gmm_hmm.loadWav(gParam.TRAIN_DATA_PATH)
my_gmm_hmm.hmm_start_train()
my_gmm_hmm.recog(gParam.TEST_DATA_PATH)
if __name__ == "__main__":
pass
在编译与修改代码的边缘,疯狂试探;
主要还是python版本的原因,版本的不同,有些函数的用法也不同。具体详细请见这个网址:https://www.runoob.com/python3/python3-att-list-extend.html
my_hmm的代码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
u'''
Created on 2019年4月27日
@author: wuluo
'''
__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2019-04-27'
import numpy as np
from numpy import *
from sklearn.cluster import KMeans
from scipy import sparse
import scipy.io as sio
from scipy import signal
import wave
import math
from duomeiti import gParam
import copy
def pdf(m, v, x):
est_v = np.prod(v, axis=0)
test_x = np.dot((x - m) / v, x - m)
p = (2 * math.pi * np.prod(v, axis=0))**-0.5 * \
np.exp(-0.5 * np.dot((x - m) / v, x - m))
return p
class sampleInfo:
def __init__(self):
self.smpl_wav = []
self.smpl_data = []
self.seg = []
def set_smpl_wav(self, wav):
self.smpl_wav.append(wav)
def set_smpl_data(self, data):
self.smpl_data.append(data)
def set_segment(self, seg_list):
self.seg = seg_list
class mixInfo:
def __init__(self):
self.Cmean = []
self.Cvar = []
self.Cweight = []
self.CM = []
class hmmInfo:
def __init__(self):
self.init = [] # 初始矩阵
self.trans = [] # 转移概率矩阵
self.mix = [] # 高斯混合模型参数
self.N = 0 # 状态数
class gmm_hmm:
def __init__(self):
self.hmm = [] # 单个hmm序列,
self.gmm_hmm_model = [] # 把所有的训练好的gmm-hmm写入到这个队列
self.samples = [] # 0-9 所有的音频数据
self.smplInfo = [] # 这里面主要是单个数字的音频数据和对应mfcc数据
# 每一个HMM对应len(stateInfo)个状态,每个状态指定高斯个数(3)
self.stateInfo = [gParam.NPDF, gParam.NPDF, gParam.NPDF, gParam.NPDF]
def loadWav(self, pathTop):
for i in range(gParam.NUM):
tmp_data = []
for j in range(gParam.NUM):
wavPath = pathTop + str(i) + str(j) + '.wav'
f = wave.open(wavPath, 'rb')
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
str_data = f.readframes(nframes)
# print shape(str_data)
f.close()
wave_data = np.fromstring(str_data, dtype=short) / 32767.0
#wave_data.shape = -1,2
#wave_data = wave_data.T
#wave_data = wave_data.reshape(1,wave_data.shape[0]*wave_data.shape[1])
# print shape(wave_data),type(wave_data)
tmp_data.append(wave_data)
self.samples.append(tmp_data)
# 循环读数据,然后进行训练
def hmm_start_train(self):
Nsmpls = len(self.samples)
for i in range(Nsmpls):
tmpSmplInfo0 = []
n = len(self.samples[i])
for j in range(n):
tmpSmplInfo1 = sampleInfo()
tmpSmplInfo1.set_smpl_wav(self.samples[i][j])
tmpSmplInfo0.append(t