p2网站模板,西安有什么网站,朋友圈网络营销,沈阳做网站软件Kaldi语音识别技术(七) ----- GMM 文章目录Kaldi语音识别技术(七) ----- GMM训练GMMtrain_mono.sh 用于训练GMM训练GMM—生成文件训练GMM—final模型查看训练GMM—final.occs查看训练GMM—对齐信息查看训练GMM—fsts.*.gz查看训练GMM—tree决策树查看align_si.sh 用于对齐训练G…Kaldi语音识别技术(七) ----- GMM 文章目录Kaldi语音识别技术(七) ----- GMM训练GMMtrain_mono.sh 用于训练GMM训练GMM—生成文件训练GMM—final模型查看训练GMM—final.occs查看训练GMM—对齐信息查看训练GMM—fsts.*.gz查看训练GMM—tree决策树查看align_si.sh 用于对齐训练GMM—查看mono_ali.sh 生成内容训练GMM—比对mono和mono_ali对齐信息训练GMM
前面文章中我们讲了相比DTWGMM的优点那么我们怎么获取训练GMM呢
GMM的训练流程如下图: 整个过程分为10个环节其中有5个是与对齐相关的为了方便理解这10个环节只讲其中的2个train_mono 单因素训练模型和align_si对齐其他的基本都是进行优化大家以后涉及这一块可以自行百度。大致的流程是先训练一个高斯模型使用这个高斯模型对训练数据进行对齐然后使用对齐后的数据再训练一个高斯模型。如上面右侧的图最开始先训练一个单音素模型然后使用单音素模型对训练数据进行对齐然后基于这些对齐数据再训练一个三音素模型然后再使用三音素模型对训练数据进行对齐然后再使用lda、mllt等算法重估GMM模型然后再对训练数据进行对齐然后对模型进行说话人无关和相关操作最后再次对训练数据进行对齐。整个GMM训练模型的过程就是这样。总的来说模型训练得越好对齐就对得越准就越可以提高语音识别的准确度。
训练GMM—mono训练流程
我们来看下单音素模型是怎么训练的首先训练一个模型必须先要有一个起始模型然后在再这个起始模型上进行迭代训练。所以kaldi就调用了gmm-init-mono来初始化模型它使用了训练数据中特征来初始化模型。初始化好模型后就是制作graph这个图的输入有好几个有初始化的模型有lang文件中的L.fst还有词典及训练数据中的文本生成的结果是一个句子到音素级别的fst的压缩包gz。 我们完成前面2步后如何使用我们提取好的特征与制作的FST图对应起来这就需要对齐。第三步使用了均匀对齐图中的等对齐前面也讲过FST是把标签文件的句子细化拆分到词、到字、到音素再到HMM中的状态。
为了方便理解图中我们只细化到音素将词中国拆分为字中和国再拆分为音素zh,ong1,g,uo2,每一个字有2个音素总共4个音素上面的黄色竖条分别代表一帧特征MFCC特征这里的均匀对齐就是假设有上诉4个音素有100帧特征每个音素就均匀分到了25帧特征分别求这25帧特征的均值和方差就可以得到相应的高斯模型了。
图下部分为我们的三音素模型考虑了协同发音三音素模型的数据量很大所以在kaldi中使用了决策树聚类将一些相近发音的音素聚合在一起归为一类然后集中训练。在均匀对齐后我们就要进行模型重估了初始化模型是在部分训练数据中随机出来的现在我们已经统计了全部音频数据的特征及通过均匀对齐每帧特征对应的状态及跳转概率。基于这些信息我们对模型进行重估下一步对重估后的模型对齐数据第五步此时我们就不是使用均匀对齐的方式而是使用重估模型后的统计量并结合前面所做的fst生成新的对齐信息这个过程可以简单理解为一个模型对训练集的解码过程把每帧数据对应的特征放到每个音素或者每个状态对应的GMM中算概率概率最大的音素就是这一帧对应的音素如前面我们说的每个音素对应25帧经过这一步后每个音素对应的就变化了假设第一个音素就对应20帧了。基于这些对齐信息我们就可以统计计算每个音素的跳转次数占全部跳转次数的比列这样就可以重估HMM网络中每个状态的跳转概率然后更新这些状态转移概率和每一帧的对齐信息后又可以重估我们的GMM模型第六步跳到第四步就这样反复的重估模型生成新的对齐信息统计转移概率然后再重估模型。具体这样多少次由我们自行设置默认为40次。
train_mono.sh 用于训练GMM
我们来看下单音素模型在Kaldi中具体是怎么训练的是调用step文件夹下的train_mono.sh脚本。特别要注意如果使用多线程参数nj数不能超过说话人数spekerid它是按照说话人数来进行分线程数的。
train_mono.sh 用法
./steps/train_mono.sh
Usage: steps/train_mono.sh [options] data-dir lang-dir exp-dire.g.: steps/train_mono.sh data/train.1k data/lang exp/mono
main options (for others, see top of script file)--config config-file # config containing options--nj nj # number of parallel jobs--cmd (utils/run.pl|utils/queue.pl queue opts) # how to run jobs.参考Kaldi 入门详解 train_mono.sh 官方文档
首先准备一下kaldi环境
. ~/kaldi/utils/path.sh
mkdir H_learn
cd ~/kaldi/data然后执行脚本
./steps/train_mono.sh --nj 2 --cmd run.pl H/kaldi_file_test L/lang H/mono参数详解 第一个参数–nj 几个线程并行训练 (注如果是提取的每个说话人的特征nj数不能超过说话人数) 第二个参数run.pl 本机运行 第三个参数特征文件夹含cmvn以及原始的mfcc特征见专栏博文五 第四个参数lang文件夹L文件夹中的lang文件夹 第五个参数输出GMM训练数据单音素模型文件夹 训练GMM—生成文件
使用train_mono.sh训练单音素模型后我们生成了这些文件首先最重要的肯定是模型mdl其中0.mdl表示初始化的模型40.mdl表示迭代了40次的结果final.mdl表示最终模型其次是occs结尾的文件可以简单理解为是一个全局统计量统计每个音素或者每个音素对应几个状态的信息。ali..gz是对齐信息每迭代一次模型对齐信息就会更新一次。fst..gz是网格信息就是我们前面所讲的一些FST信息。tree是决策树是将发音类似的一些音素聚集成一类方便计算。log是训练过程中产生的日志如果训练过程中出现错误基本都能在这里面找到相应的错误信息。 *.mdl模型 0.mdl表示初始化的模型40.mdl表示迭代了40次的结果final.mdl表示最终结果。 *.occs每个pdf出现的个数 ali.*.gz对齐信息 fst.*.gz网格信息 tree决策树 log 训练过程log
训练GMM—final模型查看
将final.mdl的数据转换为文本并输出到final_mdl.txt文本中 (–binaryfalse 表示不使用二进制数据)
gmm-copy --binaryfalse final.mdl final_mdl.txtvim final_mdl.txt 打开文件如下 这里面前面23行前面我们生成G.fst时生成的topo文件中有这部分信息。我们可以画出相应的HMM状态即6-909状态共用一个HMM3状态1-5静音音素共用一个HMM5状态第24行2727表示我们决策树聚类的个数。决策树信息中第一列为音素索引phone-id第二列为HMM状态第三列为PDF索引决策树的类
我们可以看见我们的音素总共有909个那么为什么可以聚为2737个类呢可以在图中看见从25行开始到49行总共25行的第二列看出他们都属于静音音素为什么序号都是0-4,5个状态只有静音音素才有5个状态。最终我们可以得出聚类的个数公式为
决策树类的个数 静音音素数 * 5 非静音音素 * 3 由于决策树中其他信息较多大家可自行打开本机决策树信息查看LogProbs 中的信息为每个类的转移概率dimension中的数字为输入特征MFCC的3倍是因为输入的特征做了一阶差分和二阶差分再加上原来的特征就是这个数字39numpdfs就是我们的决策树类的个数每一个类都可以对应一个高斯混合模型GMM。下面的就是对图中的656个GMM的描述一个高斯模型的描述只需要均值和方差即可知道就行如果是一个混合高斯的话就需要多个高斯组合在一起就需要每个高斯的在混合高斯中的权重如上图中的权重weights中有2个权重那么就说明描述这个音素的概率的混合高斯是由2个单高斯组成的各自的权重分别是XXX,XXX均值有39列1个高斯对应1个39维的均值2个高斯就有2个均值。同样的方差也是一样的。除了权重这里还有一个超参gconsts也是一个高斯对应一个。这里不在过多的进行深度介绍。
训练GMM—final.occs查看
接下来我们看下final.occs文件可以简单把它理解为是一个全局统计量统计每个音素或者每个音素对应几个状态的信息。即对每个HMM网络的描述。前面我们讲过每个音素又可以细分为BEIS分别对应几个状态我们知道HMM静音音素有5个状态BEIS自身5个状态非静音音素BEI3个状态。occs就是将每个音素拆分后分别进行统计。Transition-state是对每个状态的描述其中count of pdf中的数字表示这个边出现的次数。
统计每个音素或者每个音素对应几个状态的信息
show-transitions phones.txt final.mdl final.occs final_occs.txtvim final_occs.txt 打开文件如下 训练GMM—对齐信息查看
# 1 解压
gzip -d ali.1.gz提特征按帧级别提的训练也是按帧级别训练的训练的结果是什么可以通过ali-to-phones 命令查看我们哪几帧对应哪一个音素图中每一个数字表示一个音素Id为方便查看我们需要将音素id转换为对应音素。
# 2 使用ali-to-phones进行查看
ali-to-phones --per-frametrue final.mdl ark:ali.1 ark,t:ali.1.txt每个phone-id对应的音素是什么使用int2sym.pl 脚本可以将音素id转换为对应的音素我们就可以看见每个音素的时间信息。
# 3 将音素id转换为对应的音素
~/kaldi/data/utils/int2sym.pl -f 2- phones.txt ali.1.txt ali.1.phones每个音素持续的时间是多久 比如这一句话“设定二十九度”大家可以通过音频查看软件查看核实由于我们现在使用的是单音素训练模型对齐的不一定完全准确所以需要多次反复对模型进行训练。
# 4 各音素的对齐时间信息
ali-to-phones --ctm-outputtrue final.mdl ark:ali.1 -| ~/kaldi/data/utils//int2sym.pl -f 5 phones.txt ali.1.time训练GMM—fsts.*.gz查看
这里面存储的是每个语句对应的fst网络结构信息这里不过多赘述
# 1、解压
gzip -d fsts.1.gz
# 2、查看
fstcopy ark:fsts.1 ark,t:fsts.1.txt
vim fsts.1.txt训练GMM—tree决策树查看
文本查看
tree-info treenum-pdfs 683 表示决策树类的个数一共分了683个类 context-width 1 单音素模型不考虑相互音素所以为1如果是3音素模型的话这里就是3 central-position 0 表示决策树的位置是0如果是3音素这里就是1central表示中间音素前面的为0后面的为2
可视化决策树
draw-tree phones.txt tree | dot -Gsize8,10.5 -Tps | ps2pdf - tree.pdf可以通过draw-tree命令把决策树可视化画出来由于决策树很大这里只截取了一部分未显示完全可在pdf中打开查看。从上图中可以看见SIL静音音素是一个子节点对应着5个节点0-4节点音素ua5对应着3个节点5-7节点就与前面所讲的对应起来了静音音素5个状态非静音音素3个状态
align_si.sh 用于对齐
用于对齐
单音素模型训练好后接下来我们就可以使用单音素模型对训练数据进行对齐。对齐命令为align_si.sh这就是GMM训练模型的第二步。
cd ~/kaldi/data
./steps/align_si.sh --nj 2 --cmd run.pl H/kaldi_file_test L/lang H/mono H/mono_ali 参数详解 第一个参数–nj 几个线程并行训练 (注如果是提取的每个说话人的特征nj数不能超过说话人数) 第二个参数run.pl 本机运行 第三个参数特征文件夹含cmvn以及原始的mfcc特征 第四个参数lang文件夹L文件夹中的lang文件夹 第五个参数单音素训练模型文件夹 第六个参数对齐后的数据文件夹 训练GMM—查看mono_ali.sh 生成内容 # 1、解压
gzip -d ali.1.gz
# 2、生成各音素的对齐时间信息
ali-to-phones --ctm-outputtrue final.mdl ark:ali.1 -|~/kaldi/data/utils/int2sym.pl -f 5 phones.txt ali.1.timeps: 同样我们也可以使用ali-to-phones命令查看对齐信息。
训练GMM—比对mono和mono_ali对齐信息 我们可以比较我们对齐后的信息与训练Mono时的对齐信息可以看出2个文件的总行数相差不大大部分对齐信息相差不大说明单音素模型的对齐能力就这样了需要换新的算法来提高模型的对齐能力。