‘‘‘ 语音识别:声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移。 通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布, 建立音频内容和文本的对应关系,以此作为模型训练的基础。 梅尔频率倒谱系数(MFCC)通过与声音内容密切相关的13个特殊频率所对应的能量分布,可以使用梅尔频率倒谱系数矩阵作为语音识别的特征。 基于隐形马尔科夫模型进行模式识别,找到测试样本最匹配的声音模型,从而识别语音内容。 梅尔频率倒谱系数相关API: import scipy.io.wavfile as wf import python_speech_features as sf sample_rate, sigs = wf.read(‘../data/freq.wav‘) mfcc = sf.mfcc(sigs, sample_rate) ‘‘‘ import scipy.io.wavfile as wf # 读取 音频文件 import python_speech_features as sf # 提取MFCC import numpy as np import matplotlib.pyplot as mp sample_rate, sigs = wf.read(‘./ml_data/speeches/training/apple/apple01.wav‘) print(sample_rate, sigs.shape) # 获取MFCC矩阵 mfcc = sf.mfcc(sigs, sample_rate) print(mfcc.shape) mp.matshow(mfcc.T, cmap=‘gist_rainbow‘) mp.show() 输出结果: 8000 (2694,) (33, 13)
‘‘‘
隐马尔科夫模型相关API:----音频识别
import hmmlearn.hmm as hl
# n_components: 用几个高斯分布函数拟合样本数据
# covariance_type: 相关矩阵的辅对角线进行相关性比较
# n_iter: 最大迭代上限
model = hl.GaussianHMM(n_components=4, covariance_type=‘diag‘, n_iter=1000)
model.fit(mfccs)
# 使用模型匹配测试mfcc矩阵的分值
score = model.score(test_mfccs)
案例:对speeches文件夹下的七个单词文件进行语音识别
步骤:
1.读取每个音频类别的文件夹,加载每个类别的音频文件数据
2.得到每个音频的mfcc,训练HMM模型
3.每个类别将会训练得到一个HMM模型,并保存模型
4.读取测试数据,得到测试音频的mfcc
5.使用每个HMM模型对该mfcc进行得分预测,取其大者作为音频类别
‘‘‘
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_files(directory):
# 读取目录的内容,返回一个字典:{‘apple‘:[url1,url2...],‘banana‘:[url1,url2...],}
# 把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]
if label not in objects:
objects[label] = []
path = os.path.join(curdir, file)
objects[label].append(path)
return objects
print(search_files(‘../ml_data/speeches/training/‘))
# 整理训练集
train_samples = search_files(‘../ml_data/speeches/training/‘)
train_x, train_y = [], []
for label, filenames in train_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)
train_x.append(mfccs)
train_y.append(label)
# 基于HMM模型,训练样本
# models: {‘apple‘:<model object>, ...}
models = {}
for mfccs, label in zip(train_x, train_y):
model = hl.GaussianHMMz(n_components=4, covariance_type=‘diag‘, n_iter=1000)
models[label] = model.fit(mfccs)
# 针对测试集样本进行测试
# 整理测试集
test_samples = search_files(‘../ml_data/speeches/testing/‘)
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)
# test_x与test_y有7组数据
# 遍历test_x,使用每个HMM模型对同一个样本进行得分判比
pred_test_y = []
for mfccs in test_x:
best_score, best_label = None, None
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)
原文:https://www.cnblogs.com/yuxiangyang/p/11241257.html