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


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

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

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

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

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

    2. 端到端的模型考虑到解码效率,通常在beam search解码时的每一步只保有少量的候选词(一般为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-Fusion End-to-End Contextual Biasing》,这篇工作是Google发表在InterSpeech 2019上的工作。在这个工作中,首先,为了避免还没使用语言模型进行偏移,专有名词就被剪枝掉了,我们探索在sub-word单元上进行偏移。其次,我们探索在beam 剪枝前使用contextual FST。第三,因为语境n-gram通常和一组共同前缀(“call”, “text”)一起使用,我们也去探索在shallow fusion时融合这些前缀。最后,为了帮助专有名词的建模,我们探索了多种技术去利用大规模的文本数据。

    我们在这里,首先介绍下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。

    https://bbs-img.huaweicloud.com/blogs/img/1621910739812067072.PNG

    举例来看,如上图所示,如果我们想偏移这个单词“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 John mobile”,可以得到前缀词“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。下图展示了实验的结果:
    https://bbs-img.huaweicloud.com/blogs/img/1621933579659067233.PNG

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

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

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

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

  • 相关阅读:
    程序员的数学基础课
    程序员的数学基础课
    Ruby 自学记录 7
    今日新闻整理 2020-7-22
    github of Ruby developers
    Ruby 自学记录 6 create a new controller action and view
    Ruby 自学记录 5 Using RubyMine that I quickly create Rails project
    Kafka基础(十三): 基本面试题(三)
    Hadoop基础(五十六):MapReduce 过程详解 (用WordCount作为例子)
    Hive面试题(2):Hive 执行过程实例分析
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/14813416.html
Copyright © 2020-2023  润新知