上下文无关的GMM-HMM声学模型
一、语音识别基本介绍
(一)统计语音识别的基本等式
X------声学特征向量序列,观测值
W------单词序列
W*------给定观测值下,概率最大的单词序列
应用贝叶斯理论等价于
进而得出统计语音识别的框架
(二)统计语音识别的框架
运用声学模型、语言模型、词典得出给定观测值下概率最大的单词序列
(三)评价指标
运用单词错误率评价语音识别的好坏
单词错误率=(替换错+删除错+插入错)/单词总数
识别准确率=1-单词错误率
二、基于HMM的孤立词识别
(一)整体流程
假设所有单词出现的先验概率相同
训练阶段:
为每个单词收集训练记录集合
为每个单词的每条训练记录计算特征向量序列,形成HMM的观测序列集合
为每个单词训练HMM模型
识别阶段:
为测试记录计算特征向量序列
应用前向算法/维特比近似,根据每一个单词的HMM模型计算该特征向量序列的概率
选出概率最大的HMM模型对应的单词
(二)细节问题
1、HMM拓扑结构
对于SR,
the Bakis topology
states may be skipped
2、状态数
常3到5个
3、高斯分量数
通常不少于4个
4、状态输出密度函数的参数的初始化
开始时,假设每个状态对应于一个单高斯(后会通过高斯分裂获得GMM),
对于Bakis拓扑结构的HMM,一个很好的初始化方式是"flat"初始化:
计算每个单词的训练记录的所有特征向量的均值及协方差,
用这个均值和协方差初始化这个单词所有状态对应的高斯,
通过迭代进行参数更新至收敛;
*高斯分裂计算GMM,
通过迭代进行参数更新至收敛,
若未达到需要的高斯分量数,转至*.
三、基于HMM的连续词识别
(一)non-emitting states/null states
单词的最后一个状态只能自转,无法转移到下一个单词
为简化连接,引入non-emitting states/null states无发射状态概念
无发射状态不生成观测值---无需对其状态输出分布进行高斯建模
无发射状态不允许自转
(二)包含无发射状态的HMM
不允许在词内转入或转出无发射状态
在时刻t转入无发射状态的概率等于该词的观测序列在时刻t结束的概率
(三)用无发射状态连接词级HMM
离开词1的概率等于进入词2的概率
一些情况下,会保留无发射状态作为连接单词的状态
这时,从这个无发射状态进入词2的概率为1.0---唯一被允许的转出概率
(四)带有无发射状态的HMM的3个问题
1、前向后向概率的计算
前向概率:
任何时刻的任何状态的前向概率收到了前一时刻的发射状态和当前时刻的无发射状态的贡献
注:
无发射状态没有时间的概念,因为没有观测值与其对齐
为了计算简便,这儿将无发射状态与当前时刻相联系
后向概率:
2、维特比解码
无发射状态影响了维特比解码,
这在词序列的实际识别算法中至关重要
3、参数估计
Sijk---第j个单词HMM的第k个状态的第i个实例
(五)词间停顿
silence
optional silence
(六)剪枝
为降低计算复杂度
前向剪枝
后向剪枝
四、子词单元
(一)基于单词建模的识别
需要为每个要识别的单词训练模型---不灵活,单词量大时,参数量巨大
只能为能获得训练数据的单词来训练模型---无法识别声学模型训练数据中未出现过的单词
Zipf定律:在自然语言的语料库里,一个单词出现的次数与它在频率表里的排名成反比。
因此,常见的单词的数量少,少见的单词的数量多---少见词更重要,常携带的信息更多
(二)最常见的子词单元---音素
相较于单词来说,稀有音素数量少得多,保证了所有音素模型都能有足够的数据用于训练
只要知道其发音,可以为未在声学模型训练数据中出现过的单词进行建模
每个模型的平均训练数据量:
词级<音素级
随着训练数据和词汇量的增加,音素级会比词级大得越来越多
(三)音素集的选择
经验:
除单音外,若复合音频繁出现且可以从单音平滑过渡到另一个单音,可将其认为是一个子词单元
常diphthongs双连音,triphthongs三连音
(四)基于音素的识别
音素的使用只是为了更好地训练模型,识别仍然使用的是单词
单词建模由子词建模组成,单个单词的HMM建模连接起来形成词序列/语法HMM
单词多发音问题
最好使一个单词的备用发音尽可能地少,不要包含非常稀有的发音,它们只会引发困惑
上下文无关的GMM-HMM声学模型的更多相关文章
- 语音识别传统方法(GMM+HMM+NGRAM)概述
春节后到现在近两个月了,没有更新博客,主要是因为工作的关注点正从传统语音(语音通信)转向智能语音(语音识别).部门起了个新项目,要用到语音识别(准备基于Kaldi来做).我们之前做的传统音频已基本成熟 ...
- 04(2) 基于上下文相关的GMM-HMM声学模型2之参数共享
1.三音素建模存在的问题 问题一:很多三音素在训练数据中没有出现(尤其跨词三音素) 问题二:在训练数据中出现过的三音素有相当一部分出现的频次较少 因此,三音素模型训练时存在较严重的数据不足问题 2.参 ...
- 上下文相关的GMM-HMM声学模型续:参数共享
一.三音素建模存在的问题 问题一:很多三音素在训练数据中没有出现(尤其跨词三音素) 问题二:在训练数据中出现过的三音素有相当一部分出现的频次较少 因此,三音素模型训练时存在较严重的数据不足问题 二.参 ...
- kaldi基于GMM的单音素模型 训练部分
目录 1. gmm-init-mono 模型初始化 2. compile-train-graghs 训练图初始化 3. align-equal-compiled 特征文件均匀分割 4. gmm-acc ...
- 理解和使用NT驱动程序的执行上下文
理解Windows NT驱动程序最重要的概念之一就是驱动程序运行时所处的“执行上下文”.理解并小心地应用这个概念可以帮助你构建更快.更高效的驱动程序. NT标准内核模式驱动程序编程的一个重要观念是某个 ...
- HMM模型学习笔记(维特比算法)
维特比算法(Viterbi) 维特比算法 编辑 维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中.术语“维特比 ...
- ABP Framework:移除 EF Core Migrations 项目,统一数据上下文
原文:Unifying DbContexts for EF Core / Removing the EF Core Migrations Project 目录 导读:软件开发的一切都需要平衡 动机 警 ...
- Kaldi阅读并更改代码
Common utilities base/kaldi-common.h 几乎所有Kaldi程序都会include该头文件. 该头文件include了一些其他位于base/目录的头文件,主要提供: 错 ...
- Kaldi的BaseLine训练过程
steps/train_mono.sh --nj "$train_nj" --cmd "$train_cmd" data/train data/lang exp ...
随机推荐
- python入门 -- 学习笔记2
习题11:提问 -- 接受键盘的输入 raw_input input() 和 raw_input() 有何不同? input() 函数会把你输入的东西当做 Python 代码进行处理,这么做会有安 ...
- 8-13、Python 散列复习
1.{} 输入是花括号 myCat = { 'size':'fat', 'color':'gray', 'disposition':'loud'} 键:值 myCat['size'] = fat ...
- 168. Excel Sheet Column Title (Math)
Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...
- WebApi上传文件
上网搜了下Web Api上传文件的功能,发现都写的好麻烦,就自己写了一个,比较简单,直接上传文件就可以,可以用Postman测试. 简单的举例 /// <summary> /// 超级简单 ...
- 3H - 进制转换
输入一个十进制数N,将它转换成R进制数输出. Input 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10). Outpu ...
- RIDE 接口自动化请求体参数中文时报错:“UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 9......”
在进行robotframework 接口自动化,在请求体参数中输入中文会报以下错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 ...
- 为什么说Redis是单线程的以及Redis为什么这么快!
参考文章:https://blog.csdn.net/xlgen157387/article/details/79470556 redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用 ...
- 1.2 eigen中矩阵和向量的运算
1.2 矩阵和向量的运算 1.介绍 eigen给矩阵和向量的算术运算提供重载的c++算术运算符例如+,-,*或这一些点乘dot(),叉乘cross()等等.对于矩阵类(矩阵和向量,之后统称为矩阵 类) ...
- memmove、memcpy和memccpy简介
memmove.memcpy和memccpy三个函数都是内存的拷贝,从一个缓冲区拷贝到另一个缓冲区.memmove(void *dest,void*src,int count)memcpy(void ...
- Git+Github入门
1.安装Git git 返回上一级文件命令 cd ..(cd 和..之间有空格) 2.安装完成后需进一步设置,在命令行输入 3.选择一个合适的地方创建一个空目录 pwd命令用于显示当前目录 4.通过g ...