嘉宾 | 王强强
整理 | 刘雨瑶
在此前由51CTO主办的AISummit全球人工智能技术大会中,作业帮的语音团队负责人王强强老师为广大听众带来了《作业帮语音技术实践》的主题演讲,从语音合成、语音评测、语音识别三个方面解读了作业帮的语音技术实践,内容覆盖语音识别中的端到端实现与数据高效利用、高并发场景中的语音发音纠错,以及模型的因素区分与抗干扰能力提升。
为了能让更多对语音技术感兴趣的同学了解到目前语音技术的发展态势与前沿优秀技术实践,现将王强强老师的演讲内容整理如下,希望能为诸君带来一些启发。
对于传统的语音合成技术而言,想要完整合成一个人的声音,需要十小时甚至更长时间的录音。这对于录音者而言是一个不小的挑战,很少有人能够在如此长的时间中始终保持良好的发音状态。而通过小数据量语音合成技术,我们仅需要使用录音者所说的几十句话、几分钟的语音,便能达到完整的语音合成效果。
小数据量语音合成技术大体分为两类。一类是对于标注和语音不匹配的情况,处理方式主要分为两种:一是自监督学习,通过自监督的算法学习得到建模单元和音频之间的对应关系,再通过特定人的标注语料进行Finetune,以达到比较好的合成效果;二是通过ASR识别未标注的语料,并利用TTS合成对偶函数、对偶学习的方式,逐步提升TTS的合成效果。
而对于文本和音频匹配的情况,主要的处理方式也分为两种:一是构建有标注语料的多语种预训练模型。另一种则是基于这种方案之上,同语种内的多个说话人有标注数据预训练,利用目标说话的人的数据进行Finetune,以达到预期的效果。
作业帮的语音合成技术框架,在声素部分使用了FastSpeech2。FastSpeech2拥有着合成速度快的主要优势,与此同时FastSpeech2还融合了Duration、Pitch、Energy Predictor,能够为我们提供更大的可操作性空间;而在声码器的选择上,作业帮语音团队选用了Multi-Band MelGAN,这是由于Multi-Band MelGAN拥有良好的合成效果,且合成速度非常快。
在确定基础框架后,接下来要做的便是多说话人的语音合成。多说话人语音合成常见的思路是将Speaker Embedding信息加入到Encoder中,学习特定说话人的信息,而后利用模型训练多说话人的语音合成模型。最后再利用特定的说话人进行一些简单的Finetune。这套方案能够将十小时的录音需求压缩到一小时左右,但在实际中,采集一小时时长的、能够达到模型训练标准的录音还是存在一定难度。而小数据量语音合成的目标本质上是利用更少的声音,合成一个相对不错的声音。
因此,作业帮语音团队借鉴了M2VOC竞赛的冠军方案,最终选择了D-Vector和基于ECAPA的Speaker Embedding的组合,并进行了三重升级,包括Speaker Embedding的升级;将FastSpeech2使用的Transformer升级到Conformer;以及将Speaker的信息加入LayerNorm之中。
作业帮的语音评测基础技术框架,本质上还是用GOP打分判断用户单词或者句子发音的好坏。但在模型方面已经升级到了Conformer以及CGC+attention-based这种完全端到端的模型训练流程。GOP非常依赖声音和音素,也就是建模单元对齐的程度,所以在训练模型时,我们加入了通过GMM模型获得的语料的对齐信息。通过完全的认证模型,加之对齐的相应信息,能够训练出一个效果非常不错的模型,结合两者的长处,保障GOP的得分相对准确。
测评场景天然对时延比较敏感,因此时延和网络是GOP评测系统落地过程中的两大问题。如果时延很高,实时性很差,整体的用户体验感就会受到很大的影响。此外,如果网络出现问题,用户的网络环境发生波动,再加上网络时延,很容易使用户感知的染色时间超过一秒,这会带来非常明显的感觉凝滞,使得整个的课程效果受到严重影响。
对于上述问题,从算法上可以通过Chunk Mask的方式解决时延以及内存过大的问题。Chunk向前最多看两帧向后最多看五帧,时延的问题就解决掉了。
在实际中真正算法去测试的时候,它的硬时延只有50毫秒左右,就是基本50毫秒就会激活这个词,50毫秒在人的感知上是很快的。所以至少在算法层面,解决了硬延迟的问题。这是我们做的第一个层面的工作。
一套端云一体平台可以解决高并发以及由于网络传输而造成的问题。这个平台能够自动地判断用户的手机算力是否足够。如果足够的话,就会优先进行本地评测。如果算力不太够的话,就将这个请求发到云端,由云端来进行评测。若本地出了任何问题,对它的生命周期也是有把控的。
通过这套方案,我们解决了瞬间高并发所带来的问题,由于部分算力被转移到端上,云端只需要保留原来20%的机器就可以实现正常的运作,这大大的节省了资源。此外,在将算法做到本地化后,延迟的问题也得到了解决,对于大段的测评任务,能够实现良好的支撑,给用户带来更为优质的视听体验。
发音纠错的需求背景是语境问题和教育资源的稀缺,同样的,这个痛点可以利用测评技术解决。通过对测评技术的优化,可以判定发音正确与否,识别发音哪里存在问题。
在技术选型方面,虽然评测系统是基于GOP的稳定评测方案,但是GOP方案非常依赖音频和建模单元的对齐,如果起始时间不准确,其偏差就会比较大,区分性就会变差。因此原先的方案便不太适合这种纠音的场景。并且GOP的思路是通过一些专家知识,对读音进行纠正与指导,纠音中的漏读和增读GOP处理起来会非常痛,需要太多的人工支持。这便需要一个更灵活的方案,因此我们最后选择了ASR的方案来做发音纠错。
ASR方案很大的优势就是训练过程简单,不需要太多的对齐信息。即使读音错误,对上下文音素的判别也不会有太大的影响。ASR处理增读、漏读,有天然的理论上、技术上的优势。所以我们最终选了纯端到端的ASR模型来作为我们发音纠错的技术底座。
同时,作业帮也在此基础上做了一些优化及创新工作。第一,将先验的文本信息通过Attention模块加入到模型训练中;第二,通过随机替换的方式模拟出错以训练模型,使其有纠错能力;第三,由于模型区分度不够,我们对错误做了分层,有些细微的错误就不判错。通过以上方案,最终实现了虚警率的大幅下降,同时保障召回率损失不是特别大,诊断正确率也有提升。
作业帮的语音识别技术框架是端到端的语音识别框架,相对于原始的HMM-GMM/DNN方案有非常明显的优势:第一,避免了很多复杂地聚类操作以及对齐操作;第二,训练流程稍微简单;第三,端到端的框架不需要人工生成发音词典;第四,能够同时学习到音素信息和序列信息,相当于一起学习声学模型、语言模型。
当然其劣势也比较明显,端到端模型刚开始难以利用更多的语音或文本数据,而标注语料成本是很高的。我们的要求是内部选型一定要达到的目的是必须有端到端的生成模型,必须跟上最新的算法,还能够将语料模型信息融合。
提到CTC-CRF,需要先认识CTC。CTC是为整句建模而生的,CTC出现后,训练整句的声学模型就不再需要做音素和音频之间的对齐。CTC的拓扑,一方面引入了一个Blank来吸收静音,能够把真正的有效的建模单元之外的静音给吸收掉。另一方面它算整句概率的时候,是按照π,使用了动态规划的算法,让整句的路径在一个相对合理的规模范围内,这样便能够大大减轻计算量。这是CTC非常具有开创性的工作。
作业帮内部用的CTC-CRF语音识别系统。通过CRF的方式理解公式并拟合整句概率。整句概率是输入为X的一个序列,输出为π(π是用上文CTC的拓扑来表示),所以称之为CTC-CRF。
其中CRF很重要的是势函数以及势函数整个规划。势函数是输入为X,输出为πt的条件概率,再加上一个整句的概率,它们其实就对应CRF中的节点和边。
CTC-CRF与常用的声学模型思路存在一定区别。常用的声学模型有下面四个DNN-HMM、CTC、RNNT、AED。
RNNT基本的条件概率模型,是输入X、输出Y的概率,拟合的目标就是maxθ它的参数,让这个概率最大化。
CTC如图,CTC的一个假设很明显,就是条件无关假设,它的状态和状态之间是没有联系的,没有考虑它们之间的条件概率关系。
RNNT考虑了当前状态跟所有历史状态的条件概率,如图能明显看出。AED也是这样,是考虑当前状态跟历史状态的条件概率。
但CTC-CRF其实不是基于条件概率的局部归一化模型,它是一个整句归一化的模型,是全局归一化的模型。所以我们看到它不仅依赖于历史,还依赖于未来,它其实是能够考虑整句的概率信息的。这是它们在理论上的一个最大的不同。
我们对于CTC-CRF的利用,首先在Loss层,这是一个标准现阶段用的Encoder、Decoder,然后加CTC-CRF、Loss,训练声学模型,端到端声学模型的流程。Loss层上用的是CTC-CRF Loss,而不是原来的CTC Loss。CTC-CRF是Phone级别建模的,但是Attention这里,我们的Attention做的时候考虑了Word级别的建模。使用了Phone和Word级别两重特征去训练模型。
最后,关于具体效果方面,这是几个开源工具在Aishell1测试集上效果,同时标出了参数数量。能看到基于CTC-CRF的相对来说还是比较有优势的。
有了算法,理论上的效果也非常不错,结合业务方看,业务方还是有不同的,但是所有的业务方有一个共同的诉求,就是效率上要达到最优。为了解决这个问题,有了热词方案。热词方案能够完美的解决这个问题、快速地识别出业务方想要识别出的词。
常见的热词方案是向TLG加入热词展开后的有向图。上图是常见的三级Ngram的WFST解码图,实线表示条件概率,虚线是回退概率。
作业帮的方案是基于前缀自动机的热词方案,这是因为热词的规模大到会产生效率瓶颈。用前缀自动机解多模式字符串的匹配的问题就很合适,尤其是对一个串中、命中了、覆盖了热词表中的某个热词。如sher这样一个序列,它覆盖了两个热词,就是she和her,在这个前缀自动机方案中,检索完she之后,可以直接跳到her,能够快速的找到字符串中包含的多个热词。结论是,这个方案够快,还能够节省一部分的存储空间。
这个方案实际使用的时候也出现了一些问题。构建前缀树还是需要遍历整个前缀树,代价比较大。因为要实时添加热词,随时添加,随时生效。为了解决这个问题,最后也做了一两个树,一个是普通前缀树,一个是前缀自动机,就是用户热词是加在普通前缀树里的,普通前缀树会马上生效,相当于是随时上线,可以激活热词了。超过一个阈值之后,前缀自动机会自动构建,这样就基本上满足了一批用户的诉求。
上文主要是通过三个方向,每个方向一到两个点,这种技术解密的方式梳理了作业帮语音技术的落地以及落地中执行过程中遇到的问题,以及最后怎么输出一套相对能够满足业务方诉求的方案。
但是除了这三个点,语音组还积累了很多语音的原子能力。评测层面做得非常细,甚至增读、漏读、连读、浊化、重音、升降调都做了,识别还增加了中英文混合识别、声纹、降噪,以及年龄判别。
有了这些原子能力,算法层面对于业务面的支撑和服务就更加得心应手了。
王强强,作业帮语音技术团队负责人。在加入作业帮之前,曾任职于清华大学电子工程系语音处理与机器智能实验室,负责语音识别算法落地,搭建工业级解决方案。 2018 年加入作业帮,负责语音相关算法研究和落地,主导了语音识别、评测、合成等算法在作业帮的落地实践, 为公司提供整套语音技术解决方案。
以上就是作业帮语音技术实践的详细内容,更多请关注php中文网其它相关文章!