语音识别

'''
    语音识别:声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.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)

 

posted @ 2019-07-24 22:16  一如年少模样  阅读(416)  评论(0编辑  收藏  举报