陈克寒:阿里实时语音与智能对话

陈克寒:阿里实时语音与智能对话
2021年12月05日 20:00 DataFunTalk

分享嘉宾:陈克寒 阿里巴巴 算法专家

编辑整理:熊丹妮 武汉天喻信息

出品平台:DataFunTalk

导读:今天分享的主题是实时语音对话场景下的智能对话的一些实践。其中实时语音场景特指通过电话来进行一个语音对话。

主要内容包括3个部分:

语音对话的机器人:热线小蜜

语音特色的文本驱动对话

语音语义驱动的双工对话

01

语音对话机器人:热线小蜜

先简单介绍一下我们的产品:热线小蜜。

1. 语音对话机器人:热线小蜜

热线小蜜是现在阿里巴巴集团用来承担电话客服线路的智能机器人。它有两种形态:一个是由机器人来承接用户通过电话渠道拨到平台的热线服务;另一个是平台在某些场景下面主动通过电话触达到用户,来进行语音的对话。以上两部分都是基于语音进行一个智能对话的产品。

这里展示了智能对话的一个案例,即由机器人来解决用户电话咨询。这个是一个相对来说比较复杂的,且带有比较强业务属性的多轮对话案例。不论是呼入(由用户主动打电话到平台),还是呼出(由平台对用户进行触达),理论上其核心都是语音与对话的技术。其中技术团队的主要工作是优化语音与对话的体验:一方面对用户的理解越来越准确,另一方面提供尽量顺畅的交互能力,最终达成好的交互体验和业务效果。以上是实时语音场景下智能对话的整体背景。

2. 实时语音对话挑战

下面会侧重介绍相对于传统文本对话,语音对话中的一些差异性和特色内容。目前遇到的主要技术挑战总结如下:

口语化:相对于传统的基于IM的在线电话,用户在语音对话中,会呈现出冗长的、不连续的、和/或带有ASR噪声的表述;

多模态:语音对话包含有声音,天然具有比文本更丰富的信息;

双工化:低延时和强交互。

左图展示了在线对话和热线电话的三个典型例子:

口语化表达:在线对话可能就是简单的五六个字,十个字以内;热线对话,会有啰嗦的、讲故事的情况;

ARS噪声:基于语音的下游任务一般来说会受到ASR噪声的影响,而ASR噪声可能会导致下游有一些误差的传播;

多模态:在线对话中仅表达了文本本身的意思。这段文本看起来好像是个问句,在热线电话的音频中虽然文本信息一致,但是从声音角度来讲,明显能够听到用户中间蕴含的一些语气以及和情绪相关的信息。

右图左侧展示了一个比较经典的在线产品:阿里小蜜,是经典的一问一答的产品形态。右侧展示了一段从英文数据集中截取的电话语音片段,该片段呈现的并不是严格的一问一答的模式,它具有很复杂、很密集的交互,即存在低延时和强交互的特点。从人人对话的角度来看,人人之间的语音对话通过电话的延迟会低于500毫秒,相对于在线对话,其交互的频次会更高,即呈现出双工化。

从以上3个方面,将实时语音对话与现有使用比较广泛的两类产品做一个对比:

实时语音对话和在线对话:如左图所示,若将传统的一问一答形式称为QA(即Single-Turn,单轮对话),在线/热线产品还会存在Multi-Turn(多轮对话)的形式(会用到上下文的信息)。Single-Turn和Multi-Turn是实时语音对话和在线对话共有的形式。此外,实时语音对话在Single-Turn中的轮与轮之间会有更细腻更复杂的交互,可称之为Micro-Turn,其对话粒度会比Single-Turn更细。实时语音对话中的Micro-Turn会导致双工化,Single-Turn(QA)会导致口语化,此外,对于整个语音对话系统中由语音带来的额外的上下文信息称为多模化。

实时语音对话和语音助手(IOT设备):如右图所示,第一点:实时语音机器人是面向客服咨询的,其长query会更多;语音助手一般是提问/指令式的问题,相对来说query偏短一点。第二点:实时语音机器人的咨询场景中,两边是对等的交流方式,存在比较频繁的Turn-taking的动作;但语音助手这类智能设备的Turn-taking发生频率会相对偏少。第三点:由于实时语音对话和语音助手都是基于语音的表达,所以口语化发生的程度差不多。第四点:用户和语音助手,比如siri或者音箱类的产品交谈时,可能不会有太多的情感,但如果用户是来投诉/咨询,则语音中会蕴含更丰富的情感。

3. 对话:从文本驱动到语音语义驱动

图中展示了一个经典的几乎所有语音对话方案里面都会有的“五段架构”的模式。但是该架构存在着一些缺陷:

缺少针对性的算法模型:如图右侧是基于文本的交互,最初版本是将在线交互机器人的NLU、DM、NLG模块直接迁移过来使用,但会发现基于这种方式得到的模型,对于口语化和包含ASR错误文本的适应性比较差,会直接影响NLU的准确性。

语音语义模块割裂:由于整个对话的核心模块(NLU、DM、NLG)是完全基于文本操作的,所以丢失了一些语音模态的信息,如用户情绪化的语气就无法传递给模型,同时ASR也会给下游带来误差传播。

语音控制能力简单:对于ASR的传统处理方式是使用固定VAD时长进行断句。对于放音而言,原子化方法无法满足精细化的双工控制,即将一段文本转成语音之后,就无法对其播放过程进行操作。这种简单的控制能力,无法很好的对人人之间复杂语音的双工动作进行响应,会造成“高延迟、弱交互”的体感,进而影响对话效果。

基于以上三个问题,对话的核心工作主要围绕两个部分展开:

ASR和NLU:语音特色的文本驱动对话

ASR和TTS:语音语义驱动的双工对话

02

语音特色的文本驱动对话

1. 面向ASR的SLU

大部分的语音对话机器人都是基于ASR结果对下游进行语义理解的任务。上图展示了实际业务中的一个场景:将用户的一句描述匹配到他的订单中,并且需要利用这个订单信息在其咨询过程中做一些下游工作。此时发现用户可能因为口音或ASR噪声,把“军被”翻译成了“准备”,这个关键词的ASR错误会导致无法匹配正确的候选订单。

表中列出了4种类型的ASR错误:同音、相似读音、拼音截断或拼接、数字英文转换。这四种类型的错误几乎会发生在所有的基于ASR结果的NLP任务中,是一个共性问题。

针对ASR结果的共性问题,传统方案是“纠错+SLU”:通过纠错模型把有错误的ASR文本改成正确的,再进入SLU模型得到最终结果。但这个方案存在一些缺陷:第一个是纠错任务难,需要在GroundTruth的Vocabulary里找到一个唯一正确的词进行填充。但是下游的SLU模型任务本身可能不难,比如意图分类模型可能就是几个或十几个意图的一个分类任务,或者像刚才案例中的订单匹配任务,相对来说比纠错任务的决策空间要小。故这种方式虽然可行,但它是用一个更难的事情来解决一个相对来说更容易的事情,成本是比较高的。由此提出另外一种思路:基于错误的过程直接映射到正确的结果,即SLU容错。

上图表格中对比了三种方案(纠错SLU、容错SLU、端到端SLU)的优劣。其中端到端SLU(End2End SLU)在学术界做的比较多,工业界目前使用不是那么普遍。端到端SLU是用音频信号直接理解到最终的结果。端到端SLU是可行的,但目前在学术界没有得到和基于SLU pipeline模式的可比效果。核心原因在于:一方面音频信号比较容易过拟合,目前没有好的解决方案;另外一方面是现有的大量对话系统已经处于ASR的下游任务中,对ASR是黑盒调用状态,不见得在链路上能够拿到声学信号。综上所述,有必要做一个基于文本,有一定ASR容错能力的模型。

故构建了一个具有容错能力的预训练模型,它可以同时encode一段文本的发音信息和语义信息。在某些字有错误的情况下,由于模型同时包含了语音、语义信息,使其具有一定的容错能力。通过这样的模型,仅需要在下游任务自身语料上进行fine-tuning,就能得到具有ASR容错能力的SLU模型。以上即是ARS-Robust 预训练模型的基本思路。

上图展示了已发表的相关工作,如之前的主流方案是WCN。WCN是ASR的中间结果,即ASR中间的indexes,它会将ASR输出的indexes结果网络直接进行编码,而不是对Top-One的结果进行编码。这样的encoding方式既能够得到输出表示,又能够同时包含更丰富的上下文。WCN方案的问题在于需要拿到indexes输出,但是对于黑盒ASR的下游任务,如果拿不到indexes输出,模型就无法使用。

这些是ASR-Robust SLU的效果举例。左侧是ASR翻译的结果,可以看到它的关键信息是错误的,如果按照该结果进行分类,就会导致分类错误。但如果通过容错方案,是可以把这样包含一定错误的信息,分类到正确结果上的。这是基于对query的语音、语义信息同时进行编码所达到效果,即ASR容错。

2. 语音情绪检测

除了口语化问题以外,我们对多模态也做了一些工作,即检测用户在语音中的情绪。情绪检测在客服领域是一个很常见的应用场景,无论是人人对话、人机对话,还是机器人到人工间的跳转,都存在一定的利用价值。为什么需要去做音频的情绪,而不是单纯的文本?在实际过程中发现人机交互时,对机器人字面上的辱骂是比较少见的,但是用户会呈现出一些不耐烦的情绪,单纯从文本上去识别到负面情绪的案例是很少的。这是做情绪检测的第一个动机:在用户热线呼入的对话中检测、识别其负面情绪。第二个场景是热线人工质检,即对用户与人工客服对话的分析,需要去检测人工小二的服务质量,以及是否符合服务规范。人工小二很少会直接辱骂客户,但有时语气会有一些异常,如也会存在一些服务上的不耐烦,这种情况在文本上比较难检测出,故需要进行语音检测。

语音检测的主要挑战并不是在建模上,而是数据质量差,标注、建模方式不合理。目前调研到的所有学术界的音频数据集质量都无法在工业界直接使用(与数据集的构成方式有关)。学术界现有音频情绪数据集基本采用表演方式构造,即由演员通过给定的条件来表演一段相关的音频,这与真实情况有较大差异。目前标注方式主要采用分类标注的方式,如委屈、恐惧、着急、失望、愤怒、辱骂等,单纯从语音上是比较难去界定的。这样进行分类标注的主观性是比较强的,达标的误差一致性也比较低。以上两点导致目前学术界的分类数据是几乎无法满足工业需求的。

语音情绪检测任务的核心并不在于模型的创新,而在于如何去构造一个能用的数据集。首先摒弃分类打标的方式:如左侧下方展示的效价图,通过情绪的正负面和强弱,将不同的情绪类型划分到不同象限里(目前更倾向于只做横向象限,忽略纵向象限,只标注情绪的负面程度)。如此就将分类问题转换成了回归问题,这样可以避免在两个分类状态之间难以选择,或是划分标准模糊的问题,相对来说标注数据的质量会好很多。同时也能通过增加样本量(标注量)的方式来减少标注误差,提高标注质量。

语音情绪检测任务的方法比较简单直观,将音频信号与文本信号放在一起,做多模态的训练。

3. 口语化表达

第三个工作——口语化表达,右侧表格将口语化类型进行了分类举例,其中信息冗余是最常见的类型。所以口语化表达任务的核心是对多信息点的问题进行特殊处理。

主要采用以下两种方案对query进行前处理:

“短句分类+pattern推理”:虽然长句可能无法直接定位到一个意图,但每个短句是能够定位意图的。故可以通过先对短句(意图)定位,再利用短句间存在的因果关系,推理到最终意图。

“Bert-Sum”摘要

以上即是从NLU转换成特色口语化理解的SLU的介绍。

03

语音语义驱动的双工对话

1. 双工对话的定义

如何定义双工对话?左图给出了三个例子,分别为同步对话,异步对话及双工对话。右侧表格中总结了三类对话的区别。总结双工对话的特点如下:

独占性:通信双方在打电话时,一般无法并发做其他事情,会导致时间比较敏感。

持续性、非瞬时、非原子:与在线对话不同,双工对话的信息传递是一个过程,不是一次性把信息传递到位,所以会存在边听边想、边想边说的情况。

不完全博弈:永远无法精确判断对方在下一秒钟是否讲完一句话,或下一秒钟对方是否打算让“我”来回答。

驱动双工对话的底层逻辑在于:“减少共同静默和共同发声的时间”。

下面简单看一下双工对话是如何进行决策的。举个例子,用户和机器进行交互时,如果用户话没有讲完,是需要去等待他的。最后,用户讲的是“我今天咨询的问题,客服态度不好,想投诉”,用户讲到“想投诉”的时候认为用户表达完成了,这时才去回答他的问题。这个例子反映了什么时候去回答更合适的问题,我们永远是需要对用户进行预判的。正确的预判是我们期望的,错误的预判会导致交互中间产生一些比较差的体验。另一种场景是由机器来对话,机器讲话的同时用户也讲话了,用户开始讲话时是否就需要去打断机器的讲话?显然不是。所以也需要去判断合适的时机,即用户是否真的想打断对话,才去判断要不要停止当前的对话。对于打断的场景也需要对过程进行决策。如何进行这样的预判?有两种方案。第一个方案是由对话双方给出显式信号,如辩论中会显式的说“我的陈述完毕了,请你讲”,但显然在热线电话中不太可能完成。所以只能基于第二种方案:基于上下文进行判断。

2. 双工对话的表示

如何实现双工操控?按照人类的表达来模拟,就是耳朵在听,脑子在想,嘴巴在说。如果把它变成一个机器人,就是需要控制收音,在收音时去控制什么时候能够触发双工动作,需要有这样的动作决策机制及执行的方法。

如何把复杂的双工对话转换成一段可以结构化的方案,核心在于左下角的图,即定义了一套DSL语法,可以将用户任意一段双工对话进行结构化,表示成“状态、事件、动作”这三个要素。其中第一层为state(状态),第二层为event(事件),第三层action(动作)。基于要素,可以表示一段对话,另一方面也能让Robot具有响应双工对话的能力。同时,对人人对话进行这样表述之后,能将此数据作为训练数据。

左图是对人人对话进行表示后得到的可视化结果。对Switchboard数据集中2400通英文对话进行了结构化表示,该数据集几乎包含了所有双工行为(该数据集通过InterSpeech 2021进行了公开),也是目前学术界规模最大最全的双工行为数据集。以上为双工对话的表示。

有了双工对话的表示后,需要对它进行控制。图中可以看到我们对传统五段式机器的改造,即插入Duplex-Conversation部分。Duplex-Conversation分为三个部分:第一个是ASR驱动的语音控制部分,由它来将ASR和TTS由原来的原子化驱动变为一个更精细化操作。第二个是DuplexDM,其功能是不断接收Micro-Turn(比Turn的粒度更细)的信息,即决策时机,然后根据时机的state和event,给出一个action(包括等待不回复,或是调用NLU链路进行回复,或进行一些任务无关的回复,如语气词、承接词等)。将回复分为任务相关回复和任务无关回复两个部分,其中任务无关回复称为Task-free Chat,任务相关回复其实就是原来传统的NLU、DM、NLG。通过这样的改造,使机器人具有双工交互的能力。

3. 双工交互的能力

① 更短的响应时长

双工交互能做什么?第一个是更短的响应时长,能将机器的响应从一秒缩短到500毫秒以内。这个可以通过模仿了人的行为——“边听边想”和“边想边说”的方式来实现:人人对话时并不是听完整段对话,再开始思考回答,而是对方一边在讲,我一边在思考如何回答;“边想边说”即在回答对方时,并不是把整个答案组织好之后再开始回答,而可能是先说几个字的同时再想后面的一个答案。

实际上通过双工链路实现了以上两个功能,这里不再赘述。“边听边想”和“边想边说”的方式会比传统NLU交互链路的响应时间快得多。

以上展示了“边听边想”和“边想边说”的一个语音demo,demo中整体表现出的响应速度会比传统的“一问一答”语音链路快很多。demo中的响应速度大概是六七百毫秒,接近于人人对话的500毫秒的响应时间。

② 语义化打断

双工交互的第二个用途是:语义化打断,其本质上是判断是否应该接受用户打断。与传统打断的区别在于:传统打断是基于声音,有发声之后就会直接暂停/打断;语义化打断会将用户可能并不是处于回答当前问题的query进行过滤,仅接受对当前query的回复。 其核心在于基于语义上下文的决策模型,以及对TTS的精细化控制,由两个功能共同组成了语义化打断能力。

③ 交互式数字收集

双工交互的第三个用途是:交互式数字收集。这个场景是指一些类似于电话号码或者地址、身份证号这类信息,精度要求较高,比较难一口气直接报出,且中间可能还会有错误,使用传统单轮方式收集的效果是比较差的。这种场景实际属于密集、快速的多轮交互,传统的turn-based方式无法满足。此外,用户在表述时会存在一些异常的情况,并不是一个标准的表述形式,甚至会出现澄清修改或者表达含糊的情况。针对这个场景,基于传统Duplex DM方案,结合对数字的特殊处理(动作决策因子),进行端到端的优化,最终得到一个具有双工交互能力的复杂交互式的数字收集。与传统基于按键式的数字收集方式相比,在完善率上有显著的提高,模拟了人和人对数字的收集过程。

以上demo展示了响应速度几乎类人,同时具有一定复杂交互能力的数据收集的功能。

④ 仿真环境

最后一点:实现双工,特别是端到端的双工,需要离线的仿真环境和建模方式。仿真环境有两种构建方式(即实现方案):第一种是语音层仿真,基于完全在线的语音通信方式去构建用户模拟器和机器agent,用这样的方式进行离线模拟。该方案存在一个比较复杂的问题——比较难准确模拟语音通信中的各种延迟。

我们实现了一个更巧妙的办法:指令层仿真。上文有介绍过对双工的完全结构化的定义,可以完全从结构化指令来模拟出一段听上去和真实人人对话几乎一样的双工对话,可以在指令层随意模拟语音中间的延迟、交互等各种特性。基于指令层仿真的模式,可以更方便地实现双工对话样本的生成、模拟和训练。

总体而言,我们完成了第二步——将短文本对话升级到了语音特色的文本对话,第三步——再升级到语音语义联合驱动的对话中。对对话五段式的架构也进行了升级,加入了Duplex Conversation的模块。

04

总结

最后总结一下今天介绍的主要内容:一方面介绍了实时语音对话中的三个特点:口语化(包括表达含糊、ASR错误)、多模化(包含情绪、语速、背景环境等各种信息)、双工化(低延迟、强交互)。另一方面相应介绍了实际的工作:SLU、语音的多模态理解、双工对话。

05

精彩问答

Q:由于用户上文query可能提到了某个词,或提到的词和用户当前的词是有一定相关性的,所以能否基于上文信息来优化ASR?

A:其实ASR容错的核心思想是不是把ASR变准确,而是即使是在ASR错误的情况下也能得到正确的NLU结果。从提高ASR准确率的角度来讲,问题中所述的方案是可以使用的。如上文提到的实体,如一首歌或者一个明星的名字,在当前可能会翻译错误,但是结合上下文,可能就能够进行纠正。但是我提到的场景是:数据没有在娱乐领域进行训练,对于某个明星的名字始终都是错误的,即上下文中的实体也是错误的,即无法单纯依赖上下文来进行纠正。

Q:打电话时用户的query一般会比较长、杂乱、口语化,对这些query只做匹配、分类吗?还是真的会对query进行结构化的解析?

答:这个和业务方案和具体需求有关。我们主要的两个下游任务就只有匹配和分类,也会做一些实体识别。

Q:“边想边说”模型是否存在说到最后发现自己说的不对,还需要重新说的情况?

A:这是一个经典的问题。目前使用的是一个比较取巧的办法,也是模拟人的一种方案。“边想边说”模型的核心是为了减少响应时间,刚开始会回复较为通用的话——承接词,如“清楚了”、“了解了”,这个方式其实是和人人对话是一样的。比如人在遇到比较难回答的问题时会说“我想想”,这是一种技巧,一般来说和下文不会那么矛盾。这个模型也可以做得比较精细,如将承接词进行分类,包括“思考”、“犹豫”、“清楚”等,不同的承接词和下文答案的语义一致性/流畅性是不一样的,为了避免出现比较突兀的搭配,也会做一些预测来尽量减少最终答案的突兀程度。在少量情况下也会出现前半句和后半句转折比较突兀的情况,但总体来讲效果还是比较好的。

Q:可以在哪里体验一下刚才demo中演示的效果吗?

A:可以直接拨打淘宝官方的热线客服进行体验。

Q:双工ASR当前的主流技术是流式transformer吗?

A:ASR使用的是流式,因为流式响应速度更快,但我们系统不是对所有的流式结果都进行响应,而是选择某些时机进行响应。如100字的句子中间可能有30个流式结果(每3个字返回一次结果),这样100个字需要调用30次下游模型,这种调用方式的复杂度是比较高的。所以实际会控制调用频次,如连续两次流式结果比较接近,就不用调用了。

今天的分享就到这里,谢谢大家。

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部