自动语音识别技术基本指南
对语音识别技术感兴趣?报名参加NVIDIA语音AI通讯.
在过去十年中,人工智能支持的语音识别系统逐渐成为我们日常生活的一部分,从语音搜索到联络中心、汽车、医院和餐馆的虚拟助手。这些语音识别的发展得益于深度学习的进步。
许多行业的开发人员现在使用自动语音识别(ASR)来提高业务生产率、应用程序效率,甚至数字访问能力。继续阅读,了解更多关于ASR的信息,它是如何工作的,用例,进步等等。
什么是自动语音识别语音识别技术能够将口语(音频信号)转换为通常用作命令的书面文本。
当今最先进的软件可以准确地处理各种语言方言和口音。例如,ASR通常出现在面向用户的应用程序中,如虚拟代理、实时字幕和临床笔记。准确的语音转录对于这些用例至关重要。
语音AI领域的开发者也使用替代术语描述语音识别,如ASR、语音到文本(STT)和语音识别。
ASR是系统的关键组成部分语音AI,这是一套旨在帮助人类通过语音与计算机对话的技术。
为什么在语音识别中使用自然语言处理开发人员通常不清楚自然语言处理(NLP)模型在ASR管道中的作用。除了应用于语言模型之外,NLP还用于在ASR管道的末尾添加标点和大写字母来增强生成的转录本。
在用NLP对转录本进行后处理后,文本用于下游语言建模任务,包括:
情绪分析文本分析文本摘要问答语音识别算法语音识别算法可以通过使用统计算法的传统方式实现,或者通过使用深度学习技术(如神经网络)将语音转换为文本。
传统的ASR算法隐马尔可夫模型(HMM)和动态时间扭曲(DTW)是用于执行语音识别的传统统计技术的两个示例。
使用一组转录的音频样本,通过改变模型参数来训练HMM以预测单词序列,从而最大化观察到的音频序列的可能性。
DTW是一种动态规划算法,通过计算时间序列之间的距离来寻找最佳可能的单词序列:一个代表未知语音,另一个代表已知单词。
深度学习ASR算法在过去几年中,开发人员一直对语音识别的深度学习感兴趣,因为统计算法不太准确。事实上,深度学习算法能更好地理解方言、口音、上下文和多种语言,即使在嘈杂的环境中也能准确地转录。
一些最流行的最先进的语音识别声学模型有: Quartznet, Citrinet和Conformer在典型的语音识别管道中,您可以根据您的用例和性能选择和切换任何声学模型。
深度学习模型的实现工具有几种工具可用于开发深度学习语音识别模型和管道,包括: KaldiMozillaDeepSpeech,NVIDIANeMo, Riva, TAOToolkit ,以及来自谷歌、亚马逊和微软的服务。
Kaldi、DeepSpeech和NeMo是帮助您构建语音识别模型的开源工具包。TAO工具包和Riva是封闭源代码SDK,可帮助您开发可在生产中部署的可定制管道。
谷歌、AWS和微软等云服务提供商提供通用服务,您可以轻松地即插即用。
深度学习语音识别流水线如图1所示,ASR管道由以下组件组成:将原始音频转换为频谱图的频谱图生成器、将频谱图作为输入并输出随时间变化的字符概率矩阵的声学模型、从概率矩阵生成可能句子的解码器(可选地与语言模型耦合),最后,一种标点符号和大写模式,用于格式化生成的文本,以便于人类使用。
用于语音识别的典型深度学习管道包括:
数据预处理神经声学模型解码器(可选地与n-gram语言模型耦合)标点和大写模式。图1显示了深度学习语音识别管道的示例:
图1.深度学习语音识别管道的示例数据集在任何深度学习应用中都是必不可少的。神经网络的功能类似于人脑。你用来教授模型的数据越多,它学习的越多。语音识别管道也是如此。
一些流行的语音识别数据集是LibriSpeech,Fisher英语培训演讲,Mozilla通用语音(MCV)、VoxPopuli、2000HUB5英语评估演讲、AN4(包括人们拼写地址和姓名的录音)和Aisell-1/Aisell-2汉语语音语料库。除了您自己的专有数据集之外,还可以使用一些开源数据集。
数据处理是第一步。它包括数据预处理/增强技术,如速度/时间/噪声/脉冲扰动和时间拉伸增强、使用窗口的快速傅立叶变换(FFT)和归一化技术。
例如,在下图2中,使用加窗技术应用FFT后,从原始音频波形生成mel谱图。
图2.音频记录原始音频波形(左)和mel频谱图(右)我们还可以使用扰动技术来扩充训练数据集。图3和图4显示了噪声扰动和掩蔽等技术,用于增加训练数据集的大小,以避免过拟合等问题。
图3.噪声增强音频波形到噪声增强mel频谱图图像图4.噪声增强的mel频谱图到噪声增强的掩蔽mel频谱图像数据预处理阶段的输出是频谱图/mel频谱图,它是音频信号强度随时间变化的视觉表示。
然后将Mel光谱图送入下一阶段:神经声学模型QuartzNet、CitriNet、ContextNet、ConformerCTC和Conformer-Transducer是尖端神经声学模型的示例。存在多个ASR模型有几个原因,例如需要实时性能、更高的精度、内存大小和用例的计算成本。
然而,基于构象的模型由于其提高的准确性和理解能力而变得越来越流行。声学模型返回每个时间戳的字符/单词概率。
图5显示了声学模型的输出,带有时间戳。
图5.声学模型的输出包括每个时间步词汇字符的概率分布声学模型的输出与语言模型一起输入解码器。解码器包括波束搜索和贪婪解码器,语言模型包括n-gram语言、KenLM和神经评分。当涉及到解码器时,它有助于生成顶部单词,然后将其传递给语言模型以预测正确的句子。
在下图中,解码器根据概率得分选择下一个最佳单词。根据最终的最高分数,选择正确的单词或句子,并将其发送到标点符号和大小写模型。
图6.解码器工作流程示例ASR管道生成没有标点或大写的文本。
最后,使用标点符号和大写字母模型来提高文本质量,以提高可读性。来自变换器(BERT)模型的双向编码器表示通常用于生成标点文本。
图7展示了标点符号前后和大小写模型的一个简单示例:
图7.标点符号和大小写模型的示例输出语音识别行业影响语音识别可以帮助金融、电信和统一通信即服务(UCaaS)等行业改善客户体验、运营效率和投资回报率(ROI)。
视频1.语音AI如何改变客户参与度
金融语音识别应用于金融行业,例如:呼叫中心代理协助和交易记录。ASR用于转录客户与呼叫中心代理/交易大厅代理之间的对话。然后可以分析生成的转录,并将其用于向代理提供实时建议。这将使通话后时间减少80%。
此外,生成的转录本用于下游任务,包括:
情绪分析文本摘要问答意图和实体识别电信联络中心是电信行业的重要组成部分。通过呼叫中心技术,您可以重新想象电信客户中心,语音识别可以帮助您实现这一点。正如前面在财务呼叫中心用例中所讨论的,ASR用于电信联络中心转录客户和联络中心代理之间的对话,以便实时分析客户和推荐呼叫中心代理。T-Mobile使用ASR快速解决客户问题例如
统一通信及时服务(UCaaS)新冠肺炎增加了对统一通信即服务(UCaaS)解决方案的需求,该领域的供应商开始专注于使用语音人工智能技术,如ASR,以创造更具吸引力的会议体验。
例如,ASR可用于生成视频会议中的实时字幕。然后,生成的标题可用于后续任务,如会议摘要和识别笔记中的行动项目。
ASR技术的未来语音识别并不像听起来那么容易。开发语音识别充满了挑战,从准确性到用例定制,再到实时性能。另一方面,企业和学术机构正在竞相克服其中一些挑战,并推进语音识别能力的使用。
ASR挑战在生产中开发和部署语音识别管道的一些挑战包括:
由于缺乏提供最先进(SOTA)ASR模型的工具和SDK,开发人员很难利用最好的语音识别技术。有限的自定义功能,使开发人员能够微调特定于域和上下文的行话、多种语言、方言和口音,以便让您的应用程序像您一样理解和说话限制部署支持;例如,根据用例的不同,软件应该能够部署在任何云中、prem、edge和嵌入式上。实时语音识别流水线;例如,在呼叫中心代理辅助用例中,在使用会话授权代理之前,我们不能等待几秒钟才能转录会话。ASR进展语音识别在研究和软件开发方面都取得了许多进展。首先,研究结果开发了几种新的尖端ASR体系结构、E2E语音识别模型和自监督或无监督训练技术。
在软件方面,有一些工具可以快速访问SOTA模型,还有一些不同的工具可以将模型部署为生产中的服务。
关键要点由于语音识别在基于深度学习的算法方面的进步,语音识别的采用率持续增长,这使得语音识别与人类识别一样准确。此外,多语言ASR等突破有助于公司在全球范围内提供应用程序,将算法从云端移动到设备上可以节省资金、保护隐私并加快推理速度。
NVIDIA提供Riva,一个语音AISDK,以解决上面讨论的几个挑战。通过Riva,您可以快速访问为生产目的量身定制的最新SOTA研究模型。您可以根据您的领域和用例自定义这些模型,在任何云上、prem上、edge上或嵌入式上部署,并实时运行它们以进行自然交互。
通过免费电子书了解您的组织如何从语音识别技能中受益,构建语音AI应用程序。
Kaldi 语音识别基础教程
Kaldi介绍Kaldi是由C++编写的语音识别工具,其目的在于为语音识别研究者提供一个研究和使用的平台。
Kaldi环境搭建本文主要通过使用Docker和Nvidia-docker构建Ubuntu环境对Kaldi进行搭建。Docker针对的是无GPU的环境,Nvidia-docker针对的是需要使用GPU计算的环境,如果读者机器上存在GPU计算资源,请使用Nvidia-docker,使用Nvidia官方提供的CUDA镜像,可以省去安装CUDA的麻烦。Kaldi的环境搭建分为两部分,一部分为依赖工具安装,另一部分为自身源码编译。
Docker基础命令本节简单介绍在安装Kaldi过程中使用到的Docker基础命令,如读者需要更加详细的学习Docker,请主动寻找相应的专业书籍、文档学习。
本章中所用到的Docker命令如下:
dockerpull从DockerHub中拉取镜像dockerimages查看系统中所有Docker镜像dockerrun运行Docker镜像dockerexec登陆已经运行的Docker镜像dockercommit在原有镜像基础上创建新镜像dockerps查看镜像是否运行注意: 如果读者需要使用GPU来进行计算,需要安装Nvidia-docker,该软件的运行命令与Docker的运行命令一致。Docker与Nvidia-docker的安装过程这里不做介绍。
Kaldi环境搭建这里假设读者电脑已经安装Docker和Nvidia-docker,如果未安装,请先安装再进行如下操作。
首先通过Docker获取相应的Ubuntu系统。
dockerpullnvidia/cuda:9.0-base-ubuntu16.04之后启动该镜像,并安装相应软件
nvidia-dockerrun-itdnvidia/cuda:9.0-base-ubuntu16.04/bin/bash启动镜像并保持后台运行nvidia-dockerps获取该启动镜像的ContainerIDnvidia-dockerexec-it/bin/bash进入系统apt-getupdateapt-getinstallgitvimcd/opt&&gitclonehttps://github.com/kaldi-asr/kaldi.git&&cdkaldi接下来进行Kaldi的第一部分安装,第一部分主要是针对Kaldi依赖工具的安装比如Openfst、Portaudio等。安装步骤如下:
cdtools&&extras/check_dependencies.shapt-getinstallg++zlib1g-devmakeautomakeautoconfbzip2unzipwgetsoxlibtoolsubversionpython2.7python3libatlas-devlibatlas-base-devmakeextras/install_irstlm.shKaldi安装的第二部分为源码编译部分,这里的首要条件是第一部分正常安装之后,第二部分才能顺利完成。安装步骤如下:
cd/opt/kaldi/src./configure--sharedmakedepend-j8make-j8只有以上两部顺利安装,Kaldi的安装才算成功。
最后读者可以退出终端,使用命令:
dockercommitkaldi:latest来构建一个可以长时间使用的Docker镜像,当然读者也可以使用作者已经做好的Dockerfile文件来生成Docker镜像,或者直接拉取作者已经做好的Docker镜像。
Kaldi目录介绍本节主要对Kaldi的目录进行详细介绍。
Kaldi一级目录在Kaldi的一级主目录中(也就是进入kaldi目录之后大家所看到的所有目录)包括:egs、misc、scripts、src、tools、windows。
egs:此目录为Kaldi例子目录,其中例子包含了不乏语音识别、语种识别、声纹识别、关键字识别等。misc:此目录包含了一些pdf、以及相关docker、htk等资源scripts:此目录只用来存放Rnnlm,以及相应的运行脚本。src:此目录为Kaldi的源代码目录,Kaldi的多数算法的源代码都存放于此,其中不乏GMM、Ivector、Nnet等一系列的算法。tools:此目录主要存放Kaldi依赖库的安装脚本windows:此目录为在Windows平台运行所必须的脚本以及相关的执行程序。这里只是针对性的对egs和src目录进行介绍,其他目录读者可以自行了解。
Kaldi一级目录EgsEgs目录主要用于存放Kaldi的所有例程,这里会统一罗列出相关文件所包含的相关例子。
Aishell:此目录为中文语音识别和声纹识别相关例子。Aishell2:此目录主要为中文语音识别例子,但是针对Aishell在脚本方面更加规整。ami:此目录主要涉及到多信道语音识别的例子。an4:此例子为CMU提供语音识别例子,并没有涉及神经网络。apiai_decode:此例子为解码器使用的例子,其中包含了如何使用预训练模型,这里主要针对的是Nnet3解码。aspire:此为ASpIRE挑战赛的例子,其中包含了怎样使用噪声数据构建多条件数据的例子。aurora4:此例子主要介绍RBM预训练。babel:此例子主要是用来训练KWS(KeyWordSearch)。babel_multilang:此例子为训练多语音KWS。bentham:手写笔识别的例子。bn_music_speech:音乐与语音区分的例子。callhome_diarization:说话人分割的例子。callhome_etyptian:埃及语语音识别例子。chime1-5:主要针对CHiME竞赛开放的例子。cigar:图像分类的例子。commonvoice:MozillaCommonVoice语音识别的例子。csj:日语语音识别例子。dihard_2018:DiHARDSpeechDiarizationCHALLENGE的例子。fame:富里西语语音识别和声纹识别的例子。farsdat:主要用来声学语音研究和语音识别的例子。fisher_callhome_spanish:使用Callhome预料进行语音识别的例子。fisher_english:英文双声道8000Hz对话电话语音数据集的语音识别例子。fisher_swbd:包含fisher数据集以及swbd数据集的语音识别例子。gale_arabic:阿拉伯语语音识别例子。gale_mandarin:普通话语音识别例子。gp:全球电话语音识别例子(多语种语音识别例子)。heroico:西班牙语音识别例子。houst:普通话电话语音识别例子。hub4_english:英语新闻广播语音识别例子。hub4_spanish:西班牙新闻广播语音识别例子。iam:IAM手写笔识别例子。iban:语音识别例子。ifnenit:阿拉伯语手写笔识别例子。librispeech:英语语音识别例子。lre/lre07:语种识别例子。madcat_ar:手写笔识别例子。madcat_zh:中文手写笔识别例子。mini_librispeech:英语语音识别例子。mult_en:英语LVCSR例子。pub:RNNLM模型构建例子。reverb:REVERB挑战赛例子。rimes:法语手写笔识别例子。rm:英语语音识别例子,包含了如何进行迁移学习。sitw:sitw说话人识别挑战赛的例子。sprakbanken:丹麦语语音识别例子。sprakbanken_swe:瑞典语语音识别例子。sre08/10/16:说话人识别的例子。svhn:图像分类的例子。swahili:班图人语语音识别例子。swab:双声道对电话语音识别例子。tedium:英语语音识别例子。thchs30:普通话语音识别例子。tidigits:基础语音识别的例子。timit:主要是GMM/HMM语音识别例子。tunisian_msa:阿拉伯语音识别例子。uw3:OCR识别例子。voxceleb:说话人识别例子。vystadial_cz:捷克语语音识别例子。voxforge:基础语音识别例子,以及对应的在线demo的例子。vystadial_en:英文语音识别例子。wsj:wsj英文语音识别例子。yesno:独立词语音识别例子。yomdle_fa/korean/russian/tamil/zh:OCR识别例子。zeroth_korean:朝鲜语语音识别例子。注意: 虽然Egs中存放了大量的例子,但由于某些外部原因并不是所有例子的数据都能免费获得。
Kaldi一级目录srcsrc目录为Kaldi的源码目录,主要保存了包括GMM、HMM等在内的大部分Kaldi语音项目源代码。这里分别对相关算法目录进行介绍。
在src目录中,有两类文件夹,一类是算法原目录,一类为算法组合生成bin(可执行程序)目录。
base:Kaldi基础目录,主要包括与Kaldi项目相关的基础宏定义、类型定义等。bin:Kaldi的基础bin目录,主要是包括基础的执行程序。例如,查看tree信息、矩阵拷贝等基础操作。cudamatrix:Kaldi矩阵计算相关GPU计算目录matrix:Kaldi矩阵计算相关CPU计算目录itf:Kaldi相关的interfacehmm:Kaldi相关隐马尔可夫算法的代码目录utils:Kaldi相关,语音算法无关的工具目录,例如,线程操作、io操作、文本操作等。probe:Kaldi相关的exp(指数)测试目录transform:Kaldi相关的特征转换算法目录fstext:Kaldi中fst相关的算法基础目录fstbin:Kaldi中fst对应的算法执行文件夹feat:Kaldi相关的特征提取算法目录featbin:Kaldi相关的特征提取可执行目录gmm:Kaldi相关的GMM算法基础目录gmmbin:Kaldi相关的GMM算法可执行文件目录ivector:Kaldi相关的ivector算法基础目录ivectorbin:Kaldi相关的ivector算法的可执行目录,以及基于能量的vad执行目录。kws:Kaldi相关的关键字搜索基础算法目录kwsbin:Kaldi相关的关键字搜索执行目录lat:Kaldi相关的网格生成基础算法目录latbin:Kaldi相关的网格生成算法的可执行文件目录lm:Kaldi自带的语言模型基础算法目录lmbin:Kaldi相关语音模型的可执行文件目录nnet:Kaldi相关的nnet1基础算法实现目录nnetbin:Kaldinnet1相关的算法可执行文件目录nnet2:Kaldinnet2相关的基础算法实现目录nnet2bin:Kaldinnet2相关的算法可执行文件目录nnet3:Kaldinnet3相关基础算法实现目录nnet3bin:Kaldinnet3相关实现算法的可执行文件目录online:Kaldionline1相关解码算法的实现目录onlinebin:Kaldionline1相关解码器算法的可执行目录online2:Kaldionline2相关解码器算法的实现目录online2bin:Kaldionline2相关解码器算法的可执行目录rnnlm:Kaldirnnlm相关的语音模型基础算法实现目录rnnlmbin:Kaldirnnlm相关的语音模型的可执行目录sgmm2:Kaldisgmm2相关的子空间GMM基础算法实现目录sgmm2bin:Kaldisgmm2相关的子空间GMM基础算法可执行目录tfrnnlm:Kaldi相关的Tensorflowrnnlm基础算法目录tfrnnlmbin:Kaldi相关的Tensorflowrnnlm基础算法实现的可执行目录KaldiEgsAishell例子黑箱运行本节的目的在于,让读者在不了解Kaldi语音识别相关的算法的情况下,能过顺利运行Aishell的例子,并顺利获得语音识别模型。
首先需要有几个注意点:
如果需要运行神经网络相关的算法,确保机器拥有GPU运算能力。确保以上Kaldi编译成功。如果网络下载速度有限,请离线下载相关数据集。确定运行代码机器内存和硬盘大小。本例子完全运行需要硬盘资源为76G,所以需要确定硬盘是否有足够的空间。
Aishell例子运行为了能过顺利黑箱运行Aishell语音识别的例子。需要对/opt/kaldi/egs/Aishell/s5中的run.sh脚本进行几点修改。
假设Aishell的语音数据已经全部下载,目录存放于/newdata/corpus/Aishell,那么对应的run.sh脚本修改如下:
同时,由于我们的数据集已经下载,故需要注释掉与Aishell数据相关的下载脚本,修改如下:
由于大家机器、内存和CPU数量的不同,在部分脚本相对应的运行进程上也要进行部分修改,这里需要大家根据自己实际机器情况。假设运行的机器为16G内存,run.sh脚本修改为,vim打开run.sh,进入命令模式:
:%s/--nj10/--nj5/g同时,需要修改 local/nnet3/run_ivector_common.sh 该脚本中对应的nj个数,修改方法如上一步。
注意: 由于在运行神经网络计算之前会进行ivector计算,因此需要根据运行机器的内存情况进行重新设置。这里建议:如果运行机器内存不到32G,在此例子中ivector的nj个数设置为1,对应之上脚本的118行。
最后,需要注意,如果需要进行神经网络相关训练操作,需要对 local/chain/run_tdnn.sh 进行修改,修改操作为将 num_jobs_initial 和 num_jobs_final 统一修改成该训练机器所对应的GPU个数。修改如下图:
最后,回到run.sh的目录中,使用命令:
nohupshrun.sh&确保run.sh能够在后台运行。直至出现错误或者运行成功自动结束。
运行结束之后,我们可以在exp目录下的对应目录下找到对应的错误率,以及识别结果。例如,使用chain来构建的神经网络,目录位置如下:
exp/chain/tdnn_1a_sp/目录中存放的解码所需要的大部分信息。
如何在黑箱情况下,使用独立语音进行模型模型构建本节假设读者已经成功运行上一节黑箱的例子,相信大家做语音识别的初衷亦或者兴趣点在于如何使用自己的语音训练模型,那么本节的主要目的就在于告诉大家如何在Aishell的基础上,使用自己的语音构建模型。
学习本节,读者依旧不需要了解任何的Kaldi语音识别相关内容。此时,读者可能会有疑问,既然是黑箱,那如何能够使用独立语音训练集训练出自己的模型呢?
其实很简单,我们这里有两种方法提供给大家:
方法一: 我们只需要模仿Aishell的数据存放规律进行存放即可。
方法二: 如果我们现有的独立数据集有自己的规律存放,那么只需要修改针对性的修改run.sh中的两个脚本即可。
方法一这里不做详细说明,大家根据上一节使用的Aishell的数据方式模仿存储即可。这里针对方法二进行示范。
再次回到run.sh脚本中,我们可以发现,Aishell的数据处理逻辑主要存在于两个子脚本中。他们分别为如图所示:
这两个脚本即是我们需要修改的数据处理脚本。
首先看第一个脚本: local/Aishell_prepare_dict.sh,此脚本的作用在于处理Aishell语音数据集所包含的发音字典信息。由于我们使用的是我们自己的独立数据集合,因此,我们需要通过我们自己的独立语音数据集获取相对应的发音词典。对应于Aishell数据集中的lexicon.txt文件。
第二步:修改local/Aishell_data_prep.sh 脚本。该脚本主要是用来读取训练数据集、验证集以及测试集相对应的语音和语音相对应文本的对应关系。
由于第一步只需要进行匹配和人工标注,这里不多赘述。这里简单说明一下第二部分如何修改。
假设我们的语音数据集的分布为如图所示:
同时,我们可以通过Aishell的数据,看出数据存放格式如下图所示:
那么,我们只需要将我们的数据集中session文件夹去除掉,亦或者修改脚本中如下图所示的代码即可:
只需要将49行的NF-1修改为NF-2即可。这样就可以顺利运行我们自己的独立语音数据集合。
总结本章主要介绍了Kaldi相关的Docker基础操作,并介绍了如何正确安装Kaldi以及Kaldi相关的目录结构,之后介绍了黑盒运行Aishell的例子,最后简单介绍了如何修改脚本来运行自己的独立语音数据集。
本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。