孤立词语音识别(4)——HMM-GMM孤立词语音识别
标题
·
我们以一个单词为最小的训练/识别单位,以10个数字0-9的中文发音为例。
训练
- 10个数字的音频(wav),分别输入;
- 分别提取MFCC特征向量;
- 分别用特征向量去训练模型;
- 最终得到10个模型(但是集合到一个model文件里)。
识别
- 一段连续音频输入;
- 语音切割算法,分成单个字;
我用的是wadrtcvad库。 - 对每个单字,分别用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)
参考文献
- https://blog.csdn.net/chinatelecom08/article/details/82901480?utm_source=blogxgwz8
- https://www.pianshen.com/article/3636324839/
点击阅读全文
更多推荐
目录
所有评论(0)