任务型语音对话系统主要由以下的模块组成,分别是语音识别(ASR)、自然语言理解(语义理解, NLU)、对话管理(DM)、自然语言生成(NLG)和语音合成(TTS)。语音识别是任务型对话系统交互任务唤醒后的首要环节,也是后续模块处理的基础。然而在语音交互过程中,说话人的口音、环境噪音,或者语句内容本身的同音多词等因素,会造成语音识别错误。图1展示的串行流程的语音对话系统中,识别错误会逐级传递放大,并累积至后续链路,最终造成对话任务的失败。本文主要详细介绍语音对话中的纠错系统。纠错系统旨在对错误的语音识别结果进行鲁棒理解和修正,给业务后续搜索提供更准确的输入,以及改善识别展示结果。智能语音电视,使得人们可以通过语音对话技术来控制电视机,包括使用语音来搜索播放歌曲、视频、进行各种命令控制以及查询信息服务等,从繁琐的遥控器文字输入中解脱出来。高德语音助手,秉承AI赋能出行业务的目标,通过语音交互的方式高效搜索地点规划路线、查询多种内容服务、操作各种出行设置,让用户在导航过程中解放双手,降低行驶过程中操作屏幕的风险。在文本纠错任务上, 学术界目前的主流是使用端到端模型, 输入是原始文本,输出是纠错后的文本。最近ICASSP2020的论文[1], 使用基于BERT的神经网络翻译(NMT)模型对语音识别结果进行纠正。这样的方式避免了人工特征提取的步骤,依靠端到端模型“直接”完成纠错任务。ACL2020的论文 [2],通过联合训练基于BiGRU的检测网络和基于BERT的修正网络,预测输入序列每个位置对应的纠正词。这些模型都需要大量高质量的训练数据保障模型效果。同时,端到端的模型无法直接更新纠错词库,需要重新训练模型或增加额外模块。另一个方向是工业界普遍采用的分阶段纠错架构,通常分为错误检测、候选召回、纠错排序、纠错结果评估等多个阶段。分阶段模块化的设计,方便各模块单独优化,落地的效果比较好。友商的纠错系统,有的是基于通用领域的纠错,有的是针对文法、拼写错误场景的纠错,而我们的纠错任务面向任务型对话垂直领域的语音识别文本,需要针对我们实际的业务需求设计纠错架构。在系统的分析了我们的纠错任务面临的问题和痛点之后, 我们做了相应的纠错系统设计, 如下表总结。我们的目标是构建高效、易复用、可闭环的纠错系统,解决系统和业务上的问题和痛点。整体上我们采用分阶段的纠错架构,来解决任务型语音对话中的识别错误问题。纠错系统主要有三个模块组成,分别是实体词抽取、纠错候选召回和纠错候选排序。纠错系统的最终输出,可以用于后续链路的搜索,以及修正语音识别回显文字。实体词抽取模块负责抽取句子中的实体词, 完成错误定位。任务型对话系统的语音识别输入通常是短文本,意图都是限定领域的。一个常见的用户输入通常包含多个组成部分,包括动词、实体词、语气词等。其中,动词和实体词是句子中的关键信息。动词变化少,ASR识别较少出错,而实体词量级巨大,往往是ASR识别错误最多的部分。所以,我们可以将错误定位的任务转化为实体词抽取任务。我们使用BERT模型作为实体词抽取模型。具体的,我们首先采用AliNLP工具对输入语句进行分词和词性标注,并引入业务相关的词典信息,对每个词标注词典信息。BERT的输入特征包含词信息、词性信息、词典信息以及位置信息。我们首先采用中文维基数据进行BERT预训练,任务分别是句子填空和下一句预测,再使用标注语料在我们的任务上进行fine-tune。虽然BERT是命名实体抽取任务的state-of-the-art (SOTA) 模型,但是在我们的实体词抽取任务中,最初只达到了83.04% F1 score。分析错误case,发现问题主要集中在语音识别错误的情况下,而这恰恰是纠错系统需要解决的场景。因此,针对这个问题,我们对训练数据进行增强。我们使用业务NLU语法规则 (JSGF) 展开 (图7) 来丰富训练数据,将训练数据量级提升至百万级别。然后我们模拟真实语音识别的错误分布,引入了约20%包含识别错误的数据。识别错误的样本中,替换错误约占77%,删除错误占18%,插入错误占5%。进行数据增强后,我们的训练数据分布基本与线上实际分布一致,重新训练调优后,实体词抽取F1 score从 83.04% 优化至95.58%。纠错候选召回模块用来召回可能的纠错结果。根据不同业务的需求,我们建立了三种可选的召回链路。第一种是基于本地自建的召回方式。经典的召回算法有基于编辑距离和基于倒排索引的方式。基于编辑距离的算法需要遍历词库中的所有词条,非常耗时。即使使用基于优化搜索空间的BK-tree算法[3],在选取编辑距离等于2的条件下,仍需要计算约20%词条的编辑距离。而业务实体词库中的词条数量基本都是百万以上级别的,这样的算法远远达不到接入的性能要求。基于倒排索引的算法可以有效解决效率问题,传统方法使用分词后的词汇作为索引来存储。但是纠错系统中的召回步骤,搜索串往往是包含错误的,分词后查询难以匹配正确的词条。所以,我们采用基于拼音索引的方式来存储,即使包含错误,查询操作仍具有泛化性。为了保证召回数量可控,我们提出了一种基于可回退的拼音n-gram倒排索引算法,如图9所示,建立索引时使用各阶拼音n-gram作为键值,召回时优先查询高阶键值,无法满足数量阈值时回退到低阶键值查询,保证召回数量。图9展示了建立索引时的流程:获取词典条目后,使用业务规则 (例如图10)对词条进行泛化以及获取别名,随后通过我们提出的基于可回退的拼音n-gram倒排序算法,以各阶拼音n-gram作为键值存储词条。图 9可回退的拼音n-gram倒排索引算法建立索引流程对比经典的搜索算法,我们的算法在召回速度和数量上均达到了最优。图 11召回算法对比。视频名词库约50万条,query=小猪倍琦第二种召回方式是使用开源的Elastic Search引擎进行召回。我们采用词条的拼音名作为索引项,按照词条长度以及城市信息对索引表进行分片,多机房部署服务,降低网络开销。最终在保证召回效果的情况下,我们将ES搜索耗时降低到10ms以内,满足了业务接入需求。第三种召回方式是使用业务方自带的搜索接口,比如高德地名查询、虾米音乐查询、优酷视频查询等。在不增加额外开发工作的情况下,可以进一步丰富我们的召回链路。图12展示了处理搜索召回的流程。对于实体词抽取结果,我们根据一定的业务规则进行预处理,生成多个候选结果,提供给纠错排序模块处理。纠错候选排序模块,根据各种特征,对所有召回结果做一个排序,得到最终匹配结果提供给后续业务使用。图13展示了纠错候选排序的整体流程。纠错系统上线前,最大的问题是数据冷启动。对此,我们首先构建了一种基于规则的pointwise排序算法。核心思想是定义一系列匹配先验规则,综合构成匹配计算函数,对每一个召回结果计算得分,并根据得分进行整体排序。给定用户语音识别结果 ,对每个召回结果 ,我们计算匹配度 ) 其中 是手工调整的匹配系数, 是根据众包数据总结出来的匹配先验规则,主要有以下层面:·拼音层面:声母近似(平翘舌等)、韵母近似(前后鼻音等)、整体近音、方言等对每个匹配先验规则 ,我们将其得分归一化至0-1区间,系数 求和值为1,最后得到的匹配度得分 分布于0-1区间。由于规则算法需要构建大量的匹配规则并手工调整系数,我们接下来使用了基于模型的pointwise排序算法,对每个召回样本进行二分类,选取正例结果对应概率作为置信度,参与整体样本排序。同样的,由于上线前我们没有真实的训练数据,我们采样选取了数百万条实体词条,模拟语音识别错误,生成对应的模拟用户输入结果。通过规则排序算法进行自动标注,按照正负例1:10的比例选取约十万条数据用于最终的模型训练。我们将上述匹配先验规则作为模型的特征输入,分别对比了LR、SVR、MLP、Wide & Deep等模型。由于整体数据量数据偏少,在我们的测试集上,深度模型的效果并不佳,相比之下SVR模型取得了最好的效果,并且显著优于规则算法。纠错后的实体词,一方面可以用于业务搜索,另一方面可以优化语音识别的回显结果。在与用户实际发音差异较小的情况下,改写语音识别回显内容,能够提高结果的一致性,削弱用户对语音识别错误的感知。在纠错排序模块中获得最终top1结果后,我们并不能直接将其替换语音识别的原始内容,因为原始语音和纠错词条的发音可能未必一一对应,我们可以看一个例子。在这个例子中,用户的语音输入是“菏泽鲁星医院”,而匹配的词条是“菏泽市鲁心医院”。识别的错误是将“心”识别成了“星”,但是匹配词条中还有被用户省略的“市”这个字。使用词条直接替换会导致识别结果和用户真实发音不一致,这是回显优化需要尽量避免的情况。在这里,我们提出了一种基于拼音相似的公共子序列算法,通过查询原始串和替换串的拼音,找出拼音相似的最长连续路径。在实际业务中,我们应用了这个算法,相比直接限制原始串和替换串拼音需一一对应的方式,提升了相对约10%的识别回显改写率。纠错系统已经在多个业务上落地,均取得了不错的效果。电视线业务,是将语音对话技术应用于电视机,避免繁琐的大屏遥控器文字输入,可以直接用语音搜索歌曲、视频,进行命令控制等。在这个项目中,歌手名、演员名、音乐名、视频名都是百万乃至千万级的数据。我们支持了人名、视频名、歌曲名等多个槽位的纠错能力,提升了绝对1.3%的全链路对话成功率。高德语音助手,顾名思义,是高德地图app中的语音助手。在app中可以通过语音交互的方式查询地点、规划路线、查询限号、天气等。在高德语音助手项目中,每天90%的用户请求是查询地点和规划路线,而全国的地点名量级上亿,地名识别很容易发生错误。在这个项目中,我们支持了地名的纠错能力,提升了绝对1.0%的全链路对话成功率。在语音识别回显优化上,提升了绝对2.1%的语音识别回显准确率。钉钉找人项目,是在钉钉上通过语音找人,比如说“打电话给xxx”,可以方便进行沟通。集团中人名、花名、备注名等说法复杂,语音识别也往往不准确。我们支持了人名类等纠错能力,使得在亲密度列表(top200)人名的识别准确率由88.1%提升至94.5%。接下来我们会继续优化纠错系统,主要包括以下几个方向的工作:1.新业务的快速领域迁移能力,例如使用一些few-shot learning算法。2.尝试引入更多特征,例如语音识别的声学特征以及用户个性化的特征。3.尝试研究结合END2END模型,增强纠错系统的整体性能。[1] Oleksii Hrinchuk and Mariya Popova and Boris Ginsburg. “Correction of Automatic Speech Recognition with Transformer Sequence-to-sequence Model”. In Proceedings of IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP), 2020.[2] Shaohua Zhang, Haoran Huang, Jicong Liu, Hang Li. “Spelling Error Correction with Soft-Masked BERT“. In Proceedings of Annual Meeting of the Association for Computational Linguistics (ACL) , 2020.[3] https://en./wiki/BK-tree
|