毕业论文
您现在的位置: 语言识别 >> 语言识别前景 >> 正文 >> 正文

语音识别开源工具PyTorchKald

来源:语言识别 时间:2022/9/19

机器之心原创

作者:NurhachuNull

本文主要介绍用于语音识别的开源工具——PyTorch-Kaldi。

1背景

杰出的科学家和工程师们一直在努力地给机器赋予自然交流的能力,语音识别就是其中的一个重要环节。人类对语音识别技术的研究从上世纪50年代开始就未曾停止。在长期的探索中,一次次重大的技术突破逐渐让语音识别技术进入我们的日常生活。今天的ASR技术水平是前所未有的。高性能的语音识别给我们带来了更多的生活体验,我们拥有了可以对话的智能数字助手;它也在逐步改善相关领域的生产力水平。

和很多伟大技术的应用一样,语音识别技术的背后也是很多模块的组合。对其实现流程的改进往往会从一定程度上节省开发成本,并且加快技术迭代的速度。Pytorch-Kaldi的出现就是基于这样的动力。

1.1语音识别系统的组成

图1.语音识别系统的结构

一个典型的语音识别系统如图1所示。它包含4个组成部分:信号处理和特征提取、声学模型、语言模型和解码搜索。声学模型是其中的核心部分,我们可以把它理解为说话声音和语言发音之间的映射。而信号处理和特征提取就是用于构建声学模型的材料了,它主要依靠数字信号处理相关的技术。语言模型则可以被看作是语言先验知识。语音识别的最终结果就是在声学模型得分和语言模型得分上进行搜索得到的。具体的内容这里不做展开。

在语音识别技术的发展史上,深度学习绝对是极具影响力的。可以说,没有对深度学习的引入,就不会有今天如此先进的语音识别引擎。

1.2业界的基本现状

一个成功的语音识别系统真的是很难离开一众优秀开源框架的支撑,比如:HTK,Julius,CMU-Sphinx,PWTH-ASR,LIA-ASR以及Kaldi。后来居上的Kaldi独领风骚,拥有活跃的技术社区,被广泛的应用在语音识别技术的研究和系统开发中。据笔者了解,很多国内语音公司的语音识别系统也有着对Kaldi或多或少的依赖。图2是在本文写作的时,GitHub上Kaldi项目的「盛景」。

图2.kaldi-asr

但是,Kaldi也有不尽如人意的地方,它依赖大量的脚本语言,而且核心算法使用C++编写的,对声学模型的更新就不是一件容易的事情了,尤其是在需要改变各种神经网络的结构时。即便是拥有丰富经验的工程师,在调试的时候也会经历巨大的痛苦。当然,尽管如此,Kaldi还是一项伟大的工作。

有问题存在,便有了改进的需要。YoshuaBengio团队成员MircoRavanelli等人开发了一个试图继承Kaldi的效率和PyTorch的灵活性的开源框架——PyTorch-Kaldi。相关的论文已经在ICASSP上发表了,论文标题如图3所示。

图3.PyTorch-Kaldi论文首页

1.3Whypytorch-kaldi?

正如论文提到的一句话,「ThePyTorch-KaldiprojectaimstobridgethegapbetweenKaldiandPyTorch」,PyTorch-Kaldi就是为了弥补PyTorch和Kaldi之间的鸿沟。在PyTorch中实现声学模型,在Kaldi中执行特征提取、标签/对齐计算和解码。这也再次从侧面证明了PyTorch作为一个深度学习框架所具有的的卓越的灵活性和便利性。事实上,很多人都认为PyTorch比TensorFlow更加适合做研究工作。本文的第二部分将会重点介绍一下PyTorch-Kaldi开源工具。

2PyTorch-Kaldi简介

PyTorch-Kaldi项目的结构如图4所示。正如前面所提到的,在这个项目中,PyTorch和Kaldi在项目中的分工是比较明确的。主脚本run_exp.py(后面称其为主脚本)是用Python写的,它负责管理ASR系统的所有阶段,包括特征和标签提取、训练、验证、解码和打分。目前版本(v0.2)的PyTorch-Kaldi实现了混合DNN-HMM的语音识别器。

图4.PyTorch-Kaldi项目结构

2.1配置文件

主脚本以INI格式的配置文件为输入,这个配置文件在项目文档中有着很详细的描述。配置文件主要由以下5部分内容组成。

[exp]:这部分指定了一些高级信息,例如用于实验的文件夹、训练迭代次数、随机数种子,它也允许用户指定实验是在CPU/GPU或者多GPU上进行,下面是一个例子:

[exp]cmd=run_nn_script=run_nnout_folder=exp/TIMIT_liGRU_fmllrseed=use_cuda=Truemulti_gpu=Falsesave_gpumem=Falsen_epochs_tr=24

[dataset]:这部分指定了特征和标签。包括它们的存储路径、窗口的特征以及数据集被分割成块的数量。下面是一个例子:

[dataset1]data_name=TIMIT_trfea=fea_name=mfccfea_lst=quick_test/data/train/feats_mfcc.scpfea_opts=apply-cmvn--utt2spk=ark:quick_test/data/train/utt2spkark:quick_test/mfcc/train_cmvn_speaker.arkark:-ark:-

add-deltas--delta-order=2ark:-ark:-

cw_left=0cw_right=0fea_name=fbankfea_lst=quick_test/data/train/feats_fbank.scpfea_opts=apply-cmvn--utt2spk=ark:quick_test/data/train/utt2spkark:quick_test/fbank/cmvn_train.arkark:-ark:-

add-deltas--delta-order=0ark:-ark:-

cw_left=0cw_right=0fea_name=fmllrfea_lst=quick_test/data/train/feats_fmllr.scpfea_opts=apply-cmvn--utt2spk=ark:quick_test/data/train/utt2spkark:quick_test/data-fmllr-tri3/train/train_cmvn.arkark:-ark:-

add-deltas--delta-order=0ark:-ark:-

cw_left=0cw_right=0lab=lab_name=lab_cdlab_folder=quick_test/dnn4_pretrain-dbn_dnn_alilab_opts=ali-to-pdflab_count_file=autolab_data_folder=quick_test/data/train/lab_graph=quick_test/graphlab_name=lab_monolab_folder=quick_test/dnn4_pretrain-dbn_dnn_alilab_opts=ali-to-phones--per-frame=truelab_count_file=nonelab_data_folder=quick_test/data/train/lab_graph=quick_test/graphn_chunks=5

[architecture]这部分描述神经网络模型,下面是一个例子:

2.2语音特征

[model]:这部分定义了神经网络的结合方式,下面是一个例子:

[model]model_proto=proto/model.protomodel=out_dnn1=

转载请注明:http://www.0431gb208.com/sjsbszl/1620.html