语音识别之Kaldi:神经网络实战

news2024/10/7 10:22:50

ASR神经网络实战

kaldi语音识别理论与实践课程学习。

之前学习了基于GMM-HMM的传统语音识别:GMM-HMM
其中也包含Kaldi架构的简介,语音数据的预处理,特征提取等过程。
今天学习基于神经网络的语音识别。

神经网络训练脚本

以TDNN为例。

Kaldi中大部分的例子egs里,都提供了训练thnn的recipe。
在这里插入图片描述

不同recipes的内容可能有所差异,但大体都能分为3个部分。

在这里插入图片描述
神经网络config可以简单理解为一张图,Kaldi网络就是从这张图初始化得到的。

参数设置

在这里插入图片描述
stage:控制脚本运行起始位置的参数。
nnet3_affix:训练好的神经网络存放名字后缀
train_stage:如果训到第50轮断了,就把该值设置成50,就可以从第50轮开始,而不需要从头开始

common_egs_dir和remove_egs后续会再说。

再下来 . ./的是配置环境变量。其中:
utils/parse_options.sh 实现了基于shell脚本的“ --key value”的传参方式, 例如:

./run_tdnn.sh --stage 0 --gmm tri4b \
--nnet3_affix data_aug

注意: 只有定义在utils/parse_options.sh之前的参数允许以该方式传参, 图中的[dir, gmm_dir, ali_dir, graph_dir]等不能以此方式传参。

神经网络config

num_target:神经网络维度,tree的叶子节点数。
下面是个TDNN的网络结构。tdnn1,2,3只是名字,不代表是第一层、第二层等,你也可以写成a,b,c。(-1,0,2)代表context的左一右二。
在这里插入图片描述
configs是一组配置。可以理解为就是神经网络的画像,整体结构和内部节点之间的关系。网络初始化的时候就要按config里的定义初始化。
为了便于理解config,Kaldi提供了一个config解析器,即xconfig_to_configs。

生成以下文件:
{ final.config; init.config; init.raw; network.config; ref.config;
ref.raw; vars; xconfig; xconfig.expanded.1; xconfig.expanded.2 }

可分为四类:
在这里插入图片描述

xconfig:
比原始的config增加了一些定义。expend2是对1的进一步解析。
在这里插入图片描述

init:
注意:是只和输入相关的节点,不是初始化后的整个网络。

init.config
只包含两个节点,input node和output node
在这里插入图片描述

init.raw
从init.config初始化得到的,
在这里插入图片描述
需要init.config的目的是得到输入数据的维度相关的信息,以便于训练后面的LDA,这是一个训练的小技巧。

ref
是reference的简称。顾名思义是个参考的config。
lda矩阵是”假“的(随机初始化的):还没有对输入数据进行遍历,还没有统计
在这里插入图片描述
ref.raw就是从ref.config得到的完整模型,为了给kaldi提供一个参考,供kaldi遍历,能够计算出整个模型的context。

final
var,全程variable,存储模型上下文信息
在这里插入图片描述
这个左右context是根据左右context是根据ref.raw计算出来的。

final.config
训练的神经网咯就是由它初始化得到的。
被解析成更小的单元 component node
在这里插入图片描述

那component和component node之间是什么关系?
就是面向对象里的 类 component和 对象 component node的关系。
在这里插入图片描述

比如下面,

在这里插入图片描述

处了刚才例子中的TDNN模型中的relu-batchnorm组件,kaldi还有哪些组件呢?
xconfig_parser支持的组件都在这个文件里: kaldi/egs/steps/libs/nnet3/xconfig/parser.py

这些组件可以分为以下几类:
在这里插入图片描述

  • Basic layer
    在这里插入图片描述
  • Activation & Normalization
    在这里插入图片描述
  • Recurrent layer
    在这里插入图片描述
  • Convolution layer
    在这里插入图片描述
  • Attention layer
    在这里插入图片描述

这些组件按情况组在一起,可以DIY自己的网络。

下面介绍常见的网络模型。

Kaldi中的常见的神经网络

TDNN

一个简单的TDNN
在这里插入图片描述
看一下它的final.config
在这里插入图片描述
Append:拼接
offset:相对于当前位置的偏移,-3向历史时刻偏移3时刻,+3向未来。

一个稍微复杂的TDNN
在这里插入图片描述
在这里插入图片描述

除了拼接,实现加的操作sum
直接把tdnn3的0时刻接到tdnn5
scale对某个层的输出放大、缩小

CNN

一个简单的CNN

在这里插入图片描述
用了conv-relu-batchnorm的组件
height就是FBank的维数,time-offset就是卷积核kernel的大小
代码里描述的就是一个3 *3 的卷积核
在这里插入图片描述
这样的组件解析出的final.config:
在这里插入图片描述
大多数参数和之前的一样,多了个height-subsample-out,指高度上的降采样率,因为输入高度height-in和输出高度height-out都是40,所以没有降采样,所以这里等于1。
另一个要注意的,num_filters_out=64,所以后面跟的component要有 block-dim=64,不然初始化模型时候会报错。

注:这里为了方面给大家看,里面有 /的换行符号,实际中kaldi是不允许有的。

LSTM

一个简单的LSTM
就多了个lstm-layer 和 cell,delay=3就是三次循环
在这里插入图片描述

先回归一下LSTM的网络结构:
输入xt,,历史信息rt ,输出yt。细胞核Ct
在这里插入图片描述

看下final-config:
因为比较复杂,下图删除了DNN的部分
在这里插入图片描述
下面看看component和LSTM的公式是怎么联系起来的?
在这里插入图片描述
比如,以输入门为例
it 可以从图中看到有三个输入箭头,
Wix和Wir对应上面代码的第一部分(前三行)
Wic对应第二部分(中间三行),向后偏移3个时刻
第三部分就是激活函数

在这里插入图片描述

再看个细胞核Ct的计算过程:
在这里插入图片描述
在这里插入图片描述
ElementwiseProduct就是点乘。

总结以下:

上面学习了如何使用Xconfig提供的组件搭建TDNN等这些网络,从component中看和公式的对应关系。等熟练了这些,就可以自己DIY网络结构。
在这里插入图片描述

神经网络训练流程

如何使用定义好的神经网络进行训练?
先看一个标准DNN训练的脚本:
feat-cmvn-opts:是否对参数归一化
训练前后期的jobs数,和学习率lrate,还可以用以前的egs,需不需要删掉,每多少步保存,是否用GPU,需要的文件地址,训练结束后模型存储位置
在这里插入图片描述
stage:描述控制训练流程
那标准的训练流程包含哪些步骤呢?
init初始化stage不控制
在这里插入图片描述

  • egs:表示examples,训练使用的样例。把输入数据和标签换了一种方便读取的格式,整合在一起生成的文件。
  • LDA:一般放在神经网络第一层
    计算LDA变换矩阵与pre softmax矩阵就是训练的小技巧,一般数据集小的时候用到,数据量大的时候不用(此时对数据规整起不到太大作用,甚至有反作用)
  • stage=50,从50轮开始继续训练

一个重要的步骤egs:
stage=-4
这个目录下会生成四组文件

exp/$dir/egs

在这里插入图片描述

  • egs相关文件
    egs.{n}.ark:训练数据易于读写的,有利于训练的形式
    {t,v}_diagnostic.egs:计算模型在训练集t上的loss和验证集v上的loss
    combine.egs:训练结束后,用来合并多个模型的egs
  • 辅助文件
    tree:输出节点的个数,从而确定egs的标签的上限
    ali_special.scp和{t,v}_uttlist用来辅助生成{t,v}_diagnostic.egs
  • info
    总共有多少egs,多少帧等信息

egs内部的具体信息:

参数信息:
左右context,每个egs中有8帧语音,每个大的egs里有383176个egs,特征维度feat_num,num_frames用来训练的羽音帧数,num_archives最后生成的egs个数
在这里插入图片描述
egs内部:
每个大的egs里有383176个小的egs,下面看小的egs,是kaldi读取输入输出数据的最小单元。从上面的参数知,这个小的egs里有8帧有效帧,但下图中的input是40,是包含了context的(19+13+8)
在这里插入图片描述
整个训练的结果
final.raw只有神经网络的参数
final.mdl是在.raw的基础上增加了些信息
在这里插入图片描述
Priors:先验向量
单纯的神经网络只是计算出来后验概率,再结合TransitionModel和priors计算似然分数,才能得到声学模型
final.mdl是声学模型,final.raw只是神经网络模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python IDE之 pycharm的十大奇技淫巧

说到Python的IDE,可能大家都会想到一个非常有名的工具,就是pycharm,他是最受欢迎的一个Python开发工具,其原因就是因为功能强大,适合构建大型项目,当然啦,功能强大同时也就意味着操作复杂&#…

语音学发音语音学笔记

词汇表 articulators 咬合架发音器 cochlea 耳蜗 consonants 元音 dialect 方言 eardrum 鼓膜 endolymph 内淋巴 Epiglottis 喉头盖 formants 共振峰 fricative 摩擦音 Larynx 喉 meatus 耳道 monosyllabic 单音节 pinna 耳廊 pitch 音调 pitch harmonics 音高泛音 phonation …

【云原生 | Kubernetes 实战】09、K8s 控制器 Replicaset 入门到企业实战应用

目录 K8s 控制器 Replicaset 一、Replicaset 控制器:概念、原理解读 1.1 Replicaset 概述 1.2 Replicaset 工作原理:如何管理 Pod ? 二、Replicaset 资源清单文件编写技巧 三、Replicaset 使用案例:部署 Guestbook 留言板 …

第16章 母函数

第16章 母函数 母函数是离散数学领域最意外、最有用的发明之一。粗略来讲,母函数将序列问题转化为代数问题。 组合数学中常常出现普通型母函数、指数型母函数、狄利克雷型母函数 16.1 无穷级数 通俗地说,母函数F(x)就是无穷级数 符号[xnx^nxn]F(x)表示母函数F(x…

策略模式学习

0.引言 最近想整理一下代码。我的想法是使用继承的方案,使用多态写一个interface,然后不同的方法来继承它。最近ChatGPT比较火,顺便问了一下它: 在C代码设计中,我对同一算法设计了不同的实现,例如计算平均…

使用 Web 应用程序示例在 Java 中进行安全编码

使用 Web 应用程序示例在 Java 中进行安全编码 使用 Java 中的 Online Shop Web 应用程序示例了解最常见的漏洞以及如何避免它们 课程英文名:Secure coding Dive into Injections with Java & Spring boot 此视频教程共36.0小时,中英双语字幕&…

1x9 Dual SC Optical Transceivers

1、Pin Assignment & Description TD, TD-: DC coupled LVPECL inputs for the transmitter. 50Ω differential lines. RD, RD-: Open-emitter out circuits. DC coupled LVPECL outputs for the receiver. 50Ω differential lines. SD: Signal Detect. Normal opti…

【工业控制】多变量动态矩阵预测控制(DMC)【含Matlab源码 1499期】

⛄一、简介(附课程报告) 1引言 众所周知,上世纪 60 年代初形成的现代控制理论在航空、航天等领域取得了辉煌的成果。 然而人们不久就发现在完美的理论与控制之间还存在着巨大的鸿沟。主要表现在以下几个方面: 1.现代控制理论的基点是对象精确…

OneHotEncoder独热编码

首先了解机器学习中的特征类别:连续型特征和离散型特征。 拿到获取的原始特征,必须对每一特征分别进行归一化,比如,特征A的取值范围是[-1000,1000],特征B的取值范围是[-1,1].如果使用logistic回归,w1*x1w2…

Docker-compose编排

一、Docker Compose前言 Docker Compose的前身是Fig,Fig被Docker收购之后正式更名为Compose,Compose向下兼容Fig Docker Compose是一个用于定义和运行多容器Docker应用的工具,只需要一个Compose的配置文件和一个简单的命令就可以创建并运行应…

STC 51单片机61——呼吸灯

#include "reg52.h" sbit LedHuxi1P1^0; #define time (65536-1000) // 单次定时1ms unsigned char T_High, T, ti, dir; void InitTimer0(void) { TMOD0x01; TL0 time; //initial timer1 low byte TH0 time >> 8; …

从来没有一家互联网公司不问【设计模式+SSM框架底层源码】

结构型模式 创建型模式 行为型模式 六大原则 免费分享学习设计模式整理的学习笔记文档 Spring5源码解读 **其实,学习编程不是学习配置东西,然后写编程套路。写程序最重要的是你能心中有自己的一套架构思路,比如我现在就没有写Java的项目…

还在公域流量里面投入大量广告费而无法变现,不如试试私域流量吧

大家好,我是林工,不知道大家听说过私域流量这个词没有,听起来是一个听起来很模糊的概念。很多人都知道它大概的意思,但具体要落实到“私域流量怎么做”这件事情上,大都都是一问三不知,不知道该如何入手。 其…

艾美捷魔力红组织蛋白酶B活性分析试剂盒研究手册

艾美捷ICT魔力红组织蛋白酶B活性分析试剂盒包含: 套件937:25测试 魔红基质(MR-RR2),1 25测试小瓶,#6133 Hoechst 33342,1毫升,#639 吖啶橙,0.5 mL,#6130 工具包手册…

低版本docker cp报错Error: Path not specified未指定路径解决办法

大概就是版本过低。此时我们可以通过另外得途径解决 1:查找启动容器得id docker inspect -f ‘{{.Id}}’ 40e8c27c975f 例如我这里找es得 2:进入到docker容器挂在到本地得共享盘地址 一般就事 以我得乌班图为例 /var/lib/docker rootubuntu:/var/lib/do…

Android动画 补间动画

目录 1.什么是补间动画 2.XML实现方式 3.代码实现方式 4.展现形式 1.什么是补间动画 补间动画:属于Android中View动画的一种,就是涵盖了 平移、缩放、旋转 和 透明度四种变化的动画。实现方式有两种:xml文件 和 java代码。 四种补间动…

[附源码]计算机毕业设计大学生志愿者服务管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

擎创技术流 | ClickHouse实用工具—ckman教程(6)

哈喽~小伙伴们,今天依旧是每一周一期的技术分享~ 关于“ckman”的技术分享已经第6期了,大家是不是跟小编一样收获颇丰?新知识虽然新鲜有趣,但也别忘了回顾旧知识巩固基础噢~↓↓↓ 擎创技术流 | ClickHouse实用工具—ckman教程&…

10万字208道Java经典面试题总结(附答案)

前言 最近有很多粉丝问我,有什么方法能够快速提升自己,通过阿里、腾讯、字节跳动、京东等互联网大厂的面试,我觉得短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都…

[附源码]Python计算机毕业设计SSM基于微信平台的车险投保系统设计与实现(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…