行业动态
 
首页 > 智慧校园 > 行业动态
 
智慧教育语音识别开源工具

杰出的科学家和工程师们一直在努力地给机器赋予自然交流的能力, 语音 识别就是其中的一个重要环节。人类对语音识别技术的研究从上世纪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。相关的论文已经在ICASSP2019上发表了,论文标题如图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系统的所有阶段,包括特征和标签提取、训练、验证、解码和打分。目前版本的PyTorch-Kaldi实现了混合DNN-HMM的语音识别器。



图4.PyTorch-Kaldi项目结构


2.1配置文件


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


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


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


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


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


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


2.2语音特征


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


model_proto=proto/model.protomodel=out_dnn1=computeout_dnn2=computeout_dnn3=computeloss_mono=cost_nllloss_mono_w=mult_constantloss_cd=cost_nllloss_final=sumerr_final=cost_errforward_out=out_dnn2normalize_posteriors=Truenormalize_with_counts_from=lab_cdsave_out_file=Falserequire_decoding=True


:这部分定义了解码参数,下面是一个例子:


decoding_script_folder=kaldi_decoding_scripts/decoding_script=decode_dnn.shdecoding_proto=proto/decoding.protomin_active=200max_active=7000max_mem=50000000beam=13.0latbeam=8.0acwt=0.2max_arcs=-1skip_scoring=falsescoring_script=local/score.shscoring_opts="--min-lmwt1--max-lmwt10"norm_vars=False


2.2语音特征和标签


语音特征是使用Kaldi中的原生C++库进行提取的。PyTorch-Kaldi的一个特点就是可以管理多个语音特征流,用户在实际开发的过程中可以定义使用多个 特征参数 组合的模型。


用于训练声学模型的主要特征来自于语音特征和上下文无关的音素序列,这是通过Kaldi的音素决策树生成的。


2.3chunk和minibatch的组成


PyTorch-Kaldi将数据集分成了多个块,每个块中的样本都是从整个语料库中随机抽样得到的。然后再训练的过程中每次迭代只使用一个小批量的数据,这也是神经网络优化的常用方法。


不过,小批量数据的聚集方式是由神经网络的结构决定的,对于普通的前馈模型而言,随机选择数据就行。但是对于RNN这类网络而言,minibatch则必须由完整的句子组成。


2.4DNN声学模型、解码和打分


PyTorch-Kaldi已经定义好了一些先进的神经网络模型,目前支持标准的MLP、CNN、RNN、LSTM、GRU、LightGRU等。实际上这部分就是神经网络模型的训练和优化。


在进行基于HMM的解码之前,声学模型产生的声学后验概率与其先验概率进行归一化之后便和语言模型生成的语言概率,常用的语言模型就是n-gram模型。然后使用波束搜索算法得到语音信号中的单词序列。最后使用NISTSCTK工具计算字错率。


原论文的实验部分展示了使用PyTorch-Kaldi进行的多组语音识别相关的实验,在一些数据集和任务上面还达到了目前最高的水平。


3总结


就其整体架构和MircoRavanelli等人表现出来的「野心」来看,PyTorch-Kaldi的潜力是比较大的。项目文档中关于下一个版本的描述是这样写的:「Thearchitectureofthetoolkitwillbemoremodularandflexible.Beyondspeechrecognition,thenewtoolkitwillbesuitableforotherapplicationssuchasspeakerrecognition,speechenhancement,speechseparation,etc.」。当然,这只是一个工具而已,如果没有对语音识别技术的深刻理解,肯定是做不出更好东西的。许愿:有更多的人力和资源积极地投入到这个领域,帮助让PyTorch-Kaldi变得更好,或者打造出全新的比PyTorch-Kaldi更好的工具。


下一篇: 没有下篇了
徐州凯博智能科技有限公司
江苏省邳州市长江路6号东方国贸506室
0516-86995001
友情链接
徐州网站建设 智慧教育 人脸识别 互动课堂 答题器 智慧 教育 闸机 校园 安全
关于凯博
凯博概况
企业文化
企业荣誉
董事长寄语
联系方式
智慧校园
平安校园
太阳能光伏系列
太阳能发电
光伏发电
太阳能光伏路灯
联系方式
技术支持:徐州慧网 徐州凯博智能科技有限公司 电话:0516-86995001 地址:江苏省邳州市长江路6号东方国贸506室