练习基础代码(包括音频文件、音频文件读取代码、预加重代码、分帧加窗代码、快速傅里叶变换代码)可从Github中获取,链接如下:https://github.com/nwpuaslp/ASR_Course.git。

本节理论笔记见:https://blog.csdn.net/u010207220/article/details/125697793

核心代码如下:

EM更新参数:

    def em_estimator(self, X):"""Update paramters of GMMparam: X: A matrix including data samples, num_samples * Dreturn: log likelihood of updated model """pdfs = np.zeros((X.shape[0], self.K))gamma = np.zeros((X.shape[0], self.K))for k in range(self.K):for i in range(X.shape[0]):pdfs[i, k] = self.gaussian(X[i], self.mu[k], self.sigma[k])gamma = pdfs / np.sum(pdfs, axis=1).reshape(-1, 1)pi = np.sum(gamma, axis=0) / np.sum(gamma)mu = np.zeros((self.K, self.dim))sigma = np.zeros((self.K, self.dim, self.dim))for k in range(self.K):mu[k] = np.average(X, axis=0, weights=gamma[:, k])cov = np.zeros((self.dim, self.dim))for i in range(X.shape[0]):tmp = (X[i] - mu[k]).reshape(-1, 1)cov += gamma[i, k] * np.dot(tmp, tmp.T)sigma[k, :, :] = cov / np.sum(gamma[:, k])self.pi = piself.mu = muself.sigma = sigmalog_llh = self.calc_log_likelihood(X)return log_llh

计算对数似然:

    def calc_log_likelihood(self, X):"""Calculate log likelihood of GMMparam: X: A matrix including data samples, num_samples * Dreturn: log likelihood of current model """m = X.shape[0]pdfs = np.zeros((m, self.K))for k in range(self.K):for i in range(X.shape[0]):pdfs[i, k] = self.gaussian(X[i], self.mu[k], self.sigma[k])"""FINISH by YOUSELF"""return np.sum(np.log(np.sum(pdfs, axis=1)))

gmm_estimator.py完整代码如下:

# Author: Sining Sun , Zhanheng Yangimport numpy as np
from utils import *
import scipy.cluster.vq as vqnum_gaussian = 5
num_iterations = 5
targets = ['Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'O']class GMM:def __init__(self, D, K=5):assert(D>0)self.dim = Dself.K = K#Kmeans Initialself.mu , self.sigma , self.pi = self.kmeans_initial()def kmeans_initial(self):mu = []sigma = []data = read_all_data('train/feats.scp')(centroids, labels) = vq.kmeans2(data, self.K, minit="points", iter=100)# which class does each point belong toclusters = [[] for i in range(self.K)]for (l, d) in zip(labels, data):clusters[l].append(d)for cluster in clusters:mu.append(np.mean(cluster, axis=0))sigma.append(np.cov(cluster, rowvar=0))pi = np.array([len(c)*1.0 / len(data) for c in clusters])return mu, sigma, pidef gaussian(self, x, mu, sigma):"""Calculate gaussion probability.:param x: The observed data, dim*1.:param mu: The mean vector of gaussian, dim*1:param sigma: The covariance matrix, dim*dim:return: the gaussion probability, scalor"""D = x.shape[0]det_sigma = np.linalg.det(sigma)inv_sigma = np.linalg.inv(sigma + 0.0001)mahalanobis = np.dot(np.transpose(x-mu), inv_sigma)mahalanobis = np.dot(mahalanobis, (x-mu))const = 1/((2*np.pi)**(D/2))return const * (det_sigma)**(-0.5) * np.exp(-0.5 * mahalanobis)def calc_log_likelihood(self, X):"""Calculate log likelihood of GMMparam: X: A matrix including data samples, num_samples * Dreturn: log likelihood of current model """m = X.shape[0]pdfs = np.zeros((m, self.K))for k in range(self.K):for i in range(X.shape[0]):pdfs[i, k] = self.gaussian(X[i], self.mu[k], self.sigma[k])"""FINISH by YOUSELF"""return np.sum(np.log(np.sum(pdfs, axis=1)))def em_estimator(self, X):"""Update paramters of GMMparam: X: A matrix including data samples, num_samples * Dreturn: log likelihood of updated model """pdfs = np.zeros((X.shape[0], self.K))gamma = np.zeros((X.shape[0], self.K))for k in range(self.K):for i in range(X.shape[0]):pdfs[i, k] = self.gaussian(X[i], self.mu[k], self.sigma[k])gamma = pdfs / np.sum(pdfs, axis=1).reshape(-1, 1)pi = np.sum(gamma, axis=0) / np.sum(gamma)mu = np.zeros((self.K, self.dim))sigma = np.zeros((self.K, self.dim, self.dim))for k in range(self.K):mu[k] = np.average(X, axis=0, weights=gamma[:, k])cov = np.zeros((self.dim, self.dim))for i in range(X.shape[0]):tmp = (X[i] - mu[k]).reshape(-1, 1)cov += gamma[i, k] * np.dot(tmp, tmp.T)sigma[k, :, :] = cov / np.sum(gamma[:, k])self.pi = piself.mu = muself.sigma = sigmalog_llh = self.calc_log_likelihood(X)return log_llhdef train(gmms, num_iterations = num_iterations):dict_utt2feat, dict_target2utt = read_feats_and_targets('train/feats.scp', 'train/text')for target in targets:feats = get_feats(target, dict_utt2feat, dict_target2utt)   ## print("feats", feats.shape)for i in range(num_iterations):log_llh = gmms[target].em_estimator(feats)return gmmsdef test(gmms):correction_num = 0error_num = 0acc = 0.0dict_utt2feat, dict_target2utt = read_feats_and_targets('test/feats.scp', 'test/text')dict_utt2target = {}for target in targets:utts = dict_target2utt[target]for utt in utts:dict_utt2target[utt] = targetfor utt in dict_utt2feat.keys():feats = kaldi_io.read_mat(dict_utt2feat[utt])scores = []for target in targets:scores.append(gmms[target].calc_log_likelihood(feats))predict_target = targets[scores.index(max(scores))]if predict_target == dict_utt2target[utt]:correction_num += 1else:error_num += 1acc = correction_num * 1.0 / (correction_num + error_num)return accdef main():gmms = {}for target in targets:gmms[target] = GMM(39, K=num_gaussian) #Initial modelgmms = train(gmms)acc = test(gmms)print('Recognition accuracy: %f' % acc)fid = open('acc.txt', 'w')fid.write(str(acc))fid.close()if __name__ == '__main__':main()

其余非核心代码及相关文件见顶部Github项目

语音识别入门第三节:GMM以及EM算法(实战篇)相关推荐

  1. 语音识别入门第七节:语言模型(实战篇)

    Ngrams计数: witten_bell平滑:

  2. 语音识别入门第五节:基于GMM-HMM的语音识别系统

    目录 基于孤立词的GMM-HMM语音识别系统 训练 解码 基于单音素的GMM-HMM语音识别系统 音素/词典 训练 解码 基于三音素的GMM-HMM语音识别系统 三音素 决策树 基于孤立词的GMM-H ...

  3. 从生成模型到GDA再到GMM和EM算法

    在学习生成模型之前,先学习了解下密度估计和高斯混合模型.为什么呢?因为后面的VAE\GANs模型都需要把训练样本,也就是输入的图像样本看作是一个复杂的.多维的分布. 1. 知乎上关于图像频率的解释 作 ...

  4. 语音识别入门第七节:语言模型

    统计语言模型 N-gram语言模型与评价方法 平滑算法 拉普拉斯平滑 古德图灵平滑 插值与回退 卡茨平滑 克奈瑟-内平滑 语言模型的存储格式--APRA Format及工具包 RNN语言模型 其他语言 ...

  5. 从 GMM 到 EM 算法

    首先需要声明的是,GMM是Gaussian Mixture Model,混合高斯模型,是一个模型.EM算法,Expection Maximization期望最大是一套计算框架(framework),一 ...

  6. GMM的EM算法实现

    在 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut一文中我们给出了GMM算法的基本模型与似然函数,在EM算法原理中对EM算法的实现与收敛性证 ...

  7. svm手写数字识别_KNN 算法实战篇如何识别手写数字

    上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数据集是一个用于图像处理的数据集,这些数据描绘了 [0, 9] 的数字,我们可以用KNN 算 ...

  8. 3.GMM模型-EM算法

    项目模板和描述:链接地址 本次实验所用的数据为0-9(其中0的标签为Z(Zero))和o这11个字符的英文录音,每个录音的原始录音文件和39维的MFCC特征都已经提供, 实验中,每个字符用一个GMM来 ...

  9. 【算法实战篇】时序多分类赛题-2020数字中国创新大赛-智慧海洋建设top5方案(含源码)

        Hi,大家好!这里是AILIGHT!AI light the world!这次给大家带来的是2020数字中国创新大赛-数字政府赛道-智能算法赛:智慧海洋建设的算法赛复赛赛道B top5的方案以 ...

最新文章

  1. 深入理解XGBoost,优缺点分析,原理推导及工程实现
  2. 使用Python批量修改数据库执行Sql文件
  3. OpenGL学习笔记(2) 画一个正方形
  4. 使用Spring Boot搭建你的第一个应用程序
  5. 为什么从1970年1月1日开始
  6. 面试经验分享|精华版
  7. 数据库事务ACID详解(转载)
  8. Dropping tests
  9. 国货如此畸形,改革30年无国际品牌
  10. 字节跳动基于Flink的MQ-Hive实时数据集成
  11. 【COM范例】WM上获取短信内容,AcitiveX控件调用页面JS方法
  12. 全面理解ThreadLocal
  13. gitbook 插件 图片查看
  14. Java2022面试题集锦
  15. 基于vue的html编辑器,基于vue富文本编辑器的慢慢人生路
  16. 老鹰教小鹰飞翔的故事
  17. 如何使用苹果官方文档
  18. HTML5——监听手机的一些事件:手机加速度devicemotion、设备方向变化deviceorientation、手机摇一摇、指南针
  19. 数据可视化平台 vue+node+webpack+echarts+d3
  20. 我在Github上找到开源的《植物大战僵尸》

热门文章

  1. Spring Cloud Alibaba微服务架构实战教程—06让你躺平的敏捷开发
  2. win7下设置gvim的字体及配色方案改正
  3. Spring boot 启动图片
  4. 第134篇,赚钱笔记(扶摇生财思维)
  5. android 使用jks文件为apk签名
  6. UI设计面试要考察你哪些能力!
  7. 当分答停摆,从垂直领域切入的联想「知了」会有机会吗?
  8. atan(正切函数)
  9. 使用idea配置Android开发环境
  10. springcloud之负载均衡