孤立词语音识别(4)——HMM-GMM孤立词语音识别

我们以一个单词为最小的训练/识别单位,以10个数字0-9的中文发音为例。

训练

  1. 10个数字的音频(wav),分别输入;
  2. 分别提取MFCC特征向量;
  3. 分别用特征向量去训练模型;
  4. 最终得到10个模型(但是集合到一个model文件里)。

识别

  1. 一段连续音频输入;
  2. 语音切割算法,分成单个字;
    我用的是wadrtcvad库。
  3. 对每个单字,分别用10个模型测试,最终输出结果为概率最大的一个。
def gen_wavlist(wavpath):
	wavdict = {}
	for (dirpath, dirnames, filenames) in os.walk(wavpath):
		for filename in filenames:
			if filename.endswith('.wav'):
				filepath = os.sep.join([dirpath, filename])
				fileid = filename.strip('.wav')
				wavdict[fileid] = filepath
	return wavdict

def compute_mfcc(file):
	fs, audio = wavfile.read(file)
	mfcc_feat = calcMFCC_delta_delta(audio, fs, win_length=0.025, win_step=0.01, cep_num=13, filters_num=26, NFFT=512)
	return mfcc_feat

class Model():
	"""docstring for Model"""
	def __init__(self, CATEGORY=None, n_comp=3, n_mix = 3, cov_type='diag', n_iter=1000):
		super(Model, self).__init__()
		self.CATEGORY = CATEGORY
		self.category = len(CATEGORY)
		self.n_comp = n_comp
		self.n_mix = n_mix
		self.cov_type = cov_type
		self.n_iter = n_iter
		# 关键步骤,初始化models,返回特定参数的模型的列表
		self.models = []
		for k in range(self.category):
			model = hmm.GMMHMM(n_components=self.n_comp, n_mix = self.n_mix,
								covariance_type=self.cov_type, n_iter=self.n_iter)
			self.models.append(model)

	# 模型训练
	def train(self, wavdict=None):
		for k in range(12):
			subdata = []
			model = self.models[k]
			for x in wavdict:
				if x == self.CATEGORY[k]:
					mfcc_feat = compute_mfcc(wavdict[x])
					model.fit(mfcc_feat)
					model.label = self.CATEGORY[k]

	# 使用特定的测试集合进行测试
	def test(self, wavdict=None):
		result = []
		for x in wavdict:
			subre = []
			cur_result = []
			mfcc_feat = compute_mfcc(wavdict[x])
			for k in range(self.category):
				model = self.models[k]
				# 生成当前模型下,每个数据的得分情况
				re = model.score(mfcc_feat)
				subre.append(re)
			# 汇总得分情况,当前得分最高的模型就是这个数据的label
			max_score_index = subre.index(max(subre))
			cur_result = self.CATEGORY[max_score_index]
			# print('当前结果:', cur_result)
			result.append(cur_result)
		# 返回种类的类别标签
		print('识别得到结果:\n',result)
		return result

	def save(self, path="models.pkl"):
		# 利用external joblib保存生成的hmm模型
		joblib.dump(self.models, path)


	def load(self, path="models.pkl"):
		# 导入hmm模型
		self.models = joblib.load(path)

参考文献

  1. https://blog.csdn.net/chinatelecom08/article/details/82901480?utm_source=blogxgwz8
  2. https://www.pianshen.com/article/3636324839/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值