写点什么

探索专有领域的端到端 ASR 解决之道

发布于: 2021 年 05 月 26 日

​​​​​​​​​​摘要:本文从《Shallow-Fusion End-to-End Contextual Biasing》入手,探索解决专有领域的端到端 ASR。


本文分享自华为云社区《语境偏移如何解决?专有领域端到端ASR之路(一)》,原文作者:xiaoye0829 。


对于产品级的自动语音识别(Automatic Speech Recognition, ASR),能够适应专有领域的语境偏移(contextual bias),是一个很重要的功能。举个例子,对于手机上的 ASR,系统要能准确识别出用户说的 app 的名字,联系人的名字等等,而不是发音相同的其他词。更具体一点,比如读作“YaoMing”的这个词语,在体育领域可能是我们家喻户晓的运动员“姚明”,但是在手机上,它可能是我们通讯录里面一个叫做“姚敏”的朋友。如何随着应用领域的变化,解决这种偏差问题就是我们这个系列的文章要探索的主要问题。

        

对于传统的 ASR 系统,它们往往有独立的声学模型(AM)、发音词典(PM)、以及语言模型(LM),当需要对特定领域进行偏移时,可以通过特定语境的语言模型 LM 来偏移识别的过程。但是对于端到端的模型,AM、PM、以及 LM 被整合成了一个神经网络模型。此时,语境偏移对于端到端的模型十分具有挑战性,其中的原因主要有以下几个方面:


1. 端到端模型只在解码时用到了文本信息,作为对比,传统的 ASR 系统中的 LM 可以使用大量的文本进行训练。因此,我们发现端到端的模型在识别稀有、语境依赖的单词和短语,比如名词短语时,相较于传统模型,更容易出错。


2. 端到端的模型考虑到解码效率,通常在 beamsearch 解码时的每一步只保有少量的候选词(一般为 4 到 10 个词),因此,稀有的单词短语,比如依赖语境的 n-gram(n 元词组),很有可能不在 beam 中。

        

先前的工作主要是在尝试将独立训练的语境 n-gram 语言模型融入到端到端模型中,来解决语境建模的问题,这个做法也被称为:Shallow fusion (浅融合)。但是他们的方法对于专有名词处理得比较差,专有名词通常在 beam search 时就已经被剪裁掉了,因此即使加入语言模型来做偏移,也为时已晚,因为这种偏移通常在每个 word 生成后才进行偏移,而 beam search 在 grapheme/wordpiece (对于英文来说,grapheme 指的是 26 个英文字母+1 空格+12 常用标点。对于中文来说,grapheme 指的是 3755 一级汉字+3008 二级汉字+16 标点符号) 等 sub-word 单元上进行预测。

        

在这篇博文中,我们来介绍尝试解决这个问题的一篇工作:《Shallow-FusionEnd-to-End Contextual Biasing》,这篇工作是 Google 发表在 InterSpeech 2019 上的工作。在这个工作中,首先,为了避免还没使用语言模型进行偏移,专有名词就被剪枝掉了,我们探索在 sub-word 单元上进行偏移。其次,我们探索在 beam 剪枝前使用 contextual FST。第三,因为语境 n-gram 通常和一组共同前缀(“call”, “text”)一起使用,我们也去探索在 shallowfusion 时融合这些前缀。最后,为了帮助专有名词的建模,我们探索了多种技术去利用大规模的文本数据。

        

我们在这里,首先介绍下 Shallow fusion,给定一串语音序列 x=(x_1, …, x_K),端到端的模型输出一串子词级的后验概率分布 y=(y_1,…,y_L),即 P(y|x).Shallow fusion 的意思就是将端到端的输出得分与一个外部训练的语言 LM 得分在 beam search 时进行融合:y^{*}=argmax logP(y|x)+\lambda P_C(y)y∗=argmaxlogP(yx)+λPC​(y)


其中\lambdaλ是一个用来调节端到端模型和语言模型权重的参数。为了构建用于端到端模型的语境 LM,我们假设已经知道了一系列的单词级偏置短语,并把他们编译成了 n-gram 的 WFST(weighted finite state transducer)。这个单词级的 WFST,然后被分解成一个作为拼写转换器的 FST,这个 FST 可以把一串 graphemes/wordpieces 转换成对应的单词。

        

所有之前的偏移工作,无论是针对传统方法或者是端到端模型,都是将语境 LM 和基底模型(比如端到端模型或者 ASR 声学模型)的得分在单词(word)或者子词(sub-word)网格上进行结合。端到端的模型由于在解码时,通常设置了比较小的 beam 阈值,导致了其解码路径相较于传统的方法较少。因此本文主要探索在 beam 剪枝前将语境信息应用到端到端模型里。

当我们选择对 grapheme 进行偏移,一个担心是我们可能会有大量的不必要的词语,与语境 FST 匹配上,从而淹没这个 beam。



​举例来看,如上图所示,如果我们想偏移这个单词“cat”,那么语境 FST 构建的目标就是去偏移“c”“a”和“t”这三个字母。当我们想要往“c”这个字母去偏移时,我们可能不仅会把“cat”加入到 beam 中,也有可能会把“car”这种无关的单词加入到 beam 中。但是如果我们是在 wordpiece 层面进行偏移,相关的 subword 有较少的匹配,因此,更多相关的单词能被加入 beam 中。还是以“cat”这个例子举例,如果我们按照 wordpiece 来偏移,那么“car”这个词就不会进入 beam 中。因此,在本文中,我们使用了一个 4096 大小的 wordpiece 词汇表。

        

我们进一步分析,Shallow fusion 修改了输出的后验概率,因此我们也可以发现 shallow fusion 会伤害那些没有词语需要偏移的语音,即那些去语境化的语音。因此,我们探索只去偏移那些符合特定前缀的短语,举例来说,在手机中搜索联系人时,通常会先说一个“call”或者“message”,或者想播放音乐时,会先说一个“play”。因此在本文中,我们在构建语境 FST 时,考虑到这些前缀词语。我们抽取出在语境偏移单词前出现过 50 词以上的前缀词语。最后,我们获得了 292 个常用前缀词语用于查找联系人,11 个用于播放歌曲,66 个用于查找 app。我们构建了一个无权重的前缀 FST,并把它和语境 FST 级联起来。我们也允许一个空前缀选项,去跳过这些前缀词。

       

一个提高专有名词覆盖率的方法是利用大量的无监督数据。无监督的数据来自语音搜索中的匿名语音。这些语音利用一个 SOTA 模型进行处理,只有那些具有高 confidence 的语音会被保留下来。最后,为了保证我们留下来的语音主要关于专有名词,我们用了一个专有名词标注器(就是 ner 里的 CRF 作序列标注),并保留带有专有名词的语音。利用上述方法,我们得到了一亿条无监督的语音,并结合了 3500 万条有监督的语音进行训练,在训练时,每个 batch 内 80%的时间是有监督的数据,20%是无监督的数据。利用无监督的数据,有一个问题就是他们识别出来的文字可能有错,识别的结果也会限制名称的拼写,比如到底是 Eric,还是 Erik,或者 Erick。因此,我们也可以利用大量的专有名词,结合 TTS 的方法,创造了一个合成的数据集。我们从互联网上针对不同类别去挖掘大量的语境偏移词语,比如多媒体、社交、以及 app 等类别。最后,我们抽取除了大概 58 万条联系人的名字,4 万 2 千条歌名,以及 7 万个 app 的名字。接下来,我们从日志中去挖掘大量的前缀词语,比如,“call Johnmobile”,可以得到前缀词“call”对应到社交领域。然后,我们利用特定类别的前缀词和专有名词去生成语音识别的文本,并利用语音合成器,为每个类别生成了大约 100 万条语音。我们进一步为这些语音加上了噪音来模拟室内的声音。最后,在训练时,每个 batch 内 90%的时间是有监督的数据,10%的是合成的数据。

        

最后,我们探索了是否能添加更多的专有名词到有监督的训练集中。具体来说,我们对每一条语音利用专有名词标注器,找到其中的专有名词。对于每一个专有名词,我们获得了其发音特征。举例来说,比如“Caitlin”可以表示成发音单位(phonemes)“K eI t l @ n”.紧接着,我们从发音词典中,找到有相同发音单位序列的词语,比如“Kaitlyn”。对于真实的语音,和可以替换的单词,我们在训练时,随机替换。这个做法,可以让模型观察到更多的专有名词。一个更直接的出发点是,模型能够在训练的时候拼写出更多的名字,那么在后面解码时,结合语境 FST,更能够拼写出这些名字。

        

下面看一下实验部分。所有实验均基于 RNN-T 模型,encoder 里包含一个 time reduction 层,以及 8 层 LSTM,每层有 2000 个隐藏层单元。decoder 包含 2 层的 LSTM,每层有 2000 个隐藏层单元。encoder 和 decoer 被送到一个联合网络中,这个网络有 600 个隐藏层单元。然后这个联合网络被送到一个 softmax 里,输出为有 96 个单元的 graphemes 或者是 4096 个单元的 wordpieces。在推理时,每条语音伴随着一系列偏移短语用来构建一个语境 FST。在这个 FST 中,每条弧(arc)都有相同的权重。这个权重为每个目录(比如音乐,联系人等)的测试集分别调节。



​上图是 Shallow Fusion 的一些结果,E0 和 E1 是 grapheme 和 wordpieces 的结果,这些模型是没有进行偏移的。E2 是 grapheme 带偏移的结果,但是不带任何本文中的提升策略。E3 是用了一个减法代价(subtractive cost)去防止在 beam 中保留糟糕的候选词,这个操作在几乎所有的测试集上都带来了提升。再从 grapheme 层面的偏移转换到 wordpiece 上的偏移,即我们在更长的单元上进行偏移,有助于在 beam 内保持相关的候选词,并提高模型的性能。最后,我们的 E5 模型在 beam search 剪枝前,就应用偏移 FST,我们称之为 early biasing,这样有助于确保好的候选词能更早的保留在 beam 里,并带来了额外的性能提升。总之,我们最好的 shallow fusion 模型是在 wordpiece 层面进行偏移,并带有 subtractive cost 和 early biasing。

        

由于语境偏置的可能存在于句子中,我们也需要保证当语境偏移不存在时,模型的效果不会下降,即不会损害那些不带有偏置词的语音的识别。为了测试这一点,我们在 VS test 数据集上进行了实验,我们随机从 Cnt-TTS 测试集中选择了 200 个偏置短语,去构建一个偏置 FST。下图展示了实验的结果:



​从这个表中可以看到,E1 是我们的 baseline 模型,当添加偏移后,E5 模型在 VS 上出现了很多程度上的效果下降。为了解决这个问题,传统的模型在偏移 FST 中包含了前缀词。如果我们只在看到任何非空前缀词后,才应用偏移(E6),我们可以观察到 VS 数据集上相较 E5 出现了结果提升,但是在其他有偏移词的测试集上,出现了结果下降。进一步,当我们允许其中一条前缀可以为空时(主要想解决有偏移词的场景),但是我们仅仅获得了与 E5 类似的结果。为了解决这个问题,我们对于语境短语用了较小的权重如果前面是一个空的前缀词(即没有前缀词)。利用这个方法,我们观察到 E8 相较于 E1 模型,在 VS 上取得了很小程度的效果下降,但是在有偏移短语的测试集上,能够保持有效果提升。

        

在分析完了上述内容后,我们进一步探索下,当模型能感知到更多的专有名词时,我们是否能进一步提升偏移的能力。我们的基线模型是 E8,这个模型是在 3500 万的有监督数据集上训练得到的。结合我们上面的无监督数据和生成的数据,我们做了下面的实验:



​E9 的实验结果展示,当有无监督的数据一起训练时,在各个数据集上,都有效果提升。当有生成的数据一起训练时(E10),相比于 E9 在 TTS 测试集上有更大的效果提升,但是在真实场景数据集 Cnt-Real 上出现了较大程度的下滑(7.1 vs 5.8),这表明在 TTS 偏移测试集上的提升,主要来源于训练集和测试集间匹配的音频环境,而不是学到了更丰富的专有名词的词汇表。


点击关注,第一时间了解华为云新鲜技术~

发布于: 2021 年 05 月 26 日阅读数: 246
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
探索专有领域的端到端ASR解决之道