语音识别三年研究感想

  语音识别技术是一门艺术,学习语音识别是一个循序渐进的过程。

  刚开始接触语音识别技术是在本科毕业广州运通研究院实习的暑假,由于本科是自动化专业,对于深度学习技术完全没有概念,对于语音识别技术更是一窍不通。实习前一个月都在做数据标注,不得不承认语音识别的标注是一样相当繁琐且乏味的工作,但是我坚持标注了一个月,到一个月结束也不明白为什么要标注。真正开始接触语音算法是在实习的后一个月,当时组内做的是语音分割,我跟着组内大佬打下手,当时我的任务时提取语音特征MFCC,这个问题对于当时的我来说真的是很难,也是在当时我接触了Python编程、Tensorflow深度学习框架,同时也知道了如何借助Arxiv、Github、Google等寻找答案,总之我用了大约10天时间参考Github写了MFCC特征提取算法,实际上当时自己并不完全理解MFCC提取的具体理论,后来接近的10天左右时间,我基本都是在看组内大佬写的语音切割算法,就这样我迷迷糊糊的实习结束了。。。

  17年8月底我研究生入学了,迷迷糊糊我选择了ASR作为未来三年的研究方向,带着实习所学会的一些理论与语言开始“研究”ASR算法。Kaldi这个名词第一次出现在我脑海中是在前后找资料的一个月内,通过网上资料知道了Kaldi是一个语音识别比较大众的工具,但此处我遇到了麻烦,因为Kaldi主要算法是基于Linux框架,且核心算法均是基于C++所写,当时我费了很大的劲装上了Ubuntu16.04系统、安装了Kaldi并学习了Shell、C++编程语言。就这样我通过接近小半年时间慢慢熟悉了Kaldi,懂了基本的Base运行流程,对于内部原理当时并不理解,我也曾试图将Kaldi完全写一遍,看到内部庞大的代码量、不同的编程语言与编程风格以及对算法原理的不理解一次又一次的击退了我,就这样我小半年研究以失败告终,期间感谢詹青燃师兄对我的Kaldi的指导。

  因为我校研究生毕业有学业压力,我不得不寻求其他解决方法来完成我的课题。偶然的机会我在Arxiv看到了端到端语音识别这个概念、了解了CTC这个概念,期间看了十多篇CTC方向的文章,基本了解了CTC实现过程,但对于具体算法原理还浮于表面,不明白为什么要计算路径再计算折叠后的结果,很幸运在Github上找到了DCNN-CTC并复现了结果,当时我把DCNN-CTC算法完全默写了一遍,也有幸结识了开源作者聂磊师弟,就这样我研究了CTC一直到18年年前,我在这个期间看了大量的端到端的论文,当时国内所有的知网上有关CTC的会议、期刊以及博硕士论文我都看过,也看了顶会、顶刊中CTC相关的几十篇文章,直至19年二月我才真正理解CTC算法具体实现过程,理解CTC中为什么要有前置假设,为什么要进行前后向算法计算,为什么要有折叠原理,更重要的是我把CTC的前推、后推以及解码搜索过程用理论写了一遍。到19年6月左右我在CTC语音识别领域中了一篇期刊与一篇会议论文,超过了我校研究生毕业要求,再此期间我学会了Git操作,对linux基本操作加强了很多,在Github开源了  CTC论文的源码并与聂师弟用自己掌握的优化措施与理论优化DCNN-CTC声学模型,并重写了DCNN-CTC解码方法。

  在18年初至19年初,我在语音算法最快乐的时光莫过于理解了CTC算法具体原理的理解与实现,期间我并没有舍弃对Kaldi,我开始一步一步研究Kaldi总每一步实现的具体原理,包括特征提取、K-means聚类、HMM拓扑图构建、Mono训练、Tri训练、状态绑定、HMM中三个问题、Viterbi-EM、包括WFST构图与搜索,买了《解析深度学习:语音识别实践》这本书,我从第一章的一个字一个字开始看,当时不管我怎么努力也只能看到HMM介绍第三章结束,并且内部很多细节不理解,对HMM中评估、学习、解码问题仍然很模糊,不理解GMM具体如何使用,更别提构图与搜索。不得不说,由CTC转传统语音识别方法基本很难实现,我用我很多努力都没有理解传统语音识别(GMM-HMM、NN-HMM),以及一些鉴别性训练优化措施。

  19年初是我语音识别研究的转折点,当时我还沉浸在CTC研究中,不断的看CTC论文,当时看顶会的论文基本看摘要就知道他要做什么了,一个偶然的机会,我认识了郝竹林师兄,我当时与郝师兄交流不多,他当时正在做CTC,我协助他理解CTC理论与具体实现细节。渐渐地我与他的交流中,我发现了自己只是在CTC这一块了解比他多,他对于NLP中基本所有算法都非常了解,此时我意识到自己不足,我开始进一步研究语音识别算法。当时我可以继续研究CTC,继续把CTC做深,现在仔细想想如果我把CTC继续按照原始的道路做下去,我可能出的成果比现在还要多。但是我并没有继续在CTC上创新,而且在语音识别宽度上进行研究,并且每周都会看CTC领域的相关推送,了解CTC研究的最新动态。

  19年6月份左右我了解了端到端中其他两种典型算法模型:RNNT与Seq2Seq,当时我先研究的RNNT,因为RNNT是CTC模型在声学模型上的优化,且CTC与RNNT均是出自于同一个作者Graves,这样也有利于也便于自己的研究,实际上RNNT与CTC我个人认为训练这一块是基本的一致,不同的在于解码策略上,虽然二者本质上都是用FSD算法进行解码,但是RNNT在解码阶段考虑了之前帧的预测信息,这样就造成了RNNT解码速度相较于CTC很慢,但是RNNT通过解码网络确实可进一步提升CTC的准确率。期间结识了科院与声学所的一些大佬,并基于他们的成果实现了一套RNNT声学模型,并用了半年时间对RNNT进行改进,并中了一篇不错的文章,这个期间感谢田正坤师兄,与田正坤师兄的交流让我明白了RNNT算法的理论与具体实现细节。

  从19年6月到12月,我主要精力都是在对RNNT的研究与创新上,但在此期间我仍然没有荒废对传统语音识别的研究,我看了接近上百篇的HMM-Based相关论文,在此期间我把一些该看的论文、不该看的论文基本都看了,我用了这半年拼凑的时间理解了GMM-HMM中GMM的作用、HMM构建过程、EM算法、HMM学习过程、评估过程与解码过程,并理解了单音素训练与三音素训练,状态绑定,K-Means算法,谢磊老师的硕士论文对于研究这部分很有帮助,但是对于构图与搜索那一块我还是很不理解,受到CTC解码中Viterbi、Beam以及Prefix解码的影响,我一直不理解为什么要构图以及如何在图上解码,WFST困扰了我接近两年。

  2020年1月份我建立了“语音识别解码群”,我把我接近两年半学习过程中认识的大佬结合在一起,专门研究语音算法。当时建群时我内心是忐忑的,但是我仍然做了,并且在大家的共同努力下,群真的如当初设想的那样成为了语音识别学术与应用研究群。直到2020年5月20日,当时群里正在讨论WFST解码,我在一旁静静的听着,虽然当时把《Speech Recognition with WFST》看了很多遍,把WFST中构图与优化基本都看懂了,但对于WFST的理论与具体应用还是不理解,自动化所某位大佬聊到构图与搜索这个字眼,我赶紧加了他的微信并和他语音聊了接近一下午和一晚上,前后接近5个小时的聊天让我茅塞顿开,困扰我两年多的WFST解码理论与应用我解决了,WFST解码,Lattice解码均梳理完毕,哈哈哈,这一天我一夜没睡,我把《解析深度学习:语音识别实践》拿出来,我居然一次性把除去GPU加速那块理论部分全部理解了,并且把交大某位师兄的博士论文除去CUDA编程那块全部理解了,这一切都是那么的自然。

  一直到今年的7月初,我一直在加强我的HMM-Based语音识别系统,看了Povey的硕士、博士论文以及他Hompage的相关论文,把kaldi中Aishell-1的Base调试了一遍,爱丁堡语音识别课程、剑桥语音算法、CMU的HMM源码均梳理几遍,并且在2020年2月到2020年7月,我把Seq2Seq在语音识别中源码实现了一遍,并将构图理论与Seq2Seq结合,用自己的理解写了Seq2Seq+WFST的解码器,值此之际我才感觉我语音识别入门了。

  就这样我用了三年多的时间断断续续把HMM-Based的ASR系统理解了,期间辅助学会并理解了CTC、RNNT与Seq2Seq理论与实现原理。即将毕业之际,我很迷惘,很惆怅,ASR领域还有很多问题亟需优化解决,我还有很多不理解地方。

你可能感兴趣的:(语音识别-深度学习,杂谈,语音识别)