一、什么是“唤醒词”以及它为什么重要?
语音交互的过程与平时人与人之间交流的方式非常相似,有问有答。智能音箱也是这样,语音交互流程被划分为五个环节 – 唤醒、响应、输入、理解、反馈。其中唤醒是每一次用户与语音产品交互的第一个接触点,唤醒环节的体验在整个语音交互流程中至关重要,它的体验好坏将直接影响用户对产品的“第一印象”。所以需要定义一个将产品从待机状态切换到工作状态的词语,即所谓的“唤醒词”。
二. “唤醒词”对用户体验的影响
影响语音唤醒体验的因素包含两个维度——输入和输出。输入环节的影响因素包括唤醒词、唤醒方式,输出环节的影响因素包括唤醒响应速度、唤醒反馈方式、唤醒成功率和误唤醒率。
全双工是通信领域的术语,它的通信术语定义的就是一个实时的、双向的语音信息的交互,就叫全双工。举个简单的例子可以解释全双工,手机通信就是全双工,而用对讲机通信是半双工。
全双工连续对话有三个特点:
- 一次唤醒连续交互免唤醒:用户唤醒音箱之后,一段时间之内可以对音箱连续地发出指令,不需要每次重新唤醒。
- 边听边说,随时打断:边听边说是指音箱在说话的同时可以听用户的指令。实时语义打断,不容易出现误打断,同时,对没有语义的输入,则不会打断语音合成播放。
- 更自然的表达:人一边思考一边说话,产生一些不自然的停顿会更接近于人与人之间真实的表达方式。在多轮对话,也容易省略掉一些内容。
全双工连续对话两种模式
- 场景式的连续对话。场景式的连续对话,只会响应一个或者多个领域的指令,比如听音乐的场景,音箱会响应听歌、选歌、调音量的指令。不同设备可以设定不同的场景连续对话,同一个设备可以通过唤醒词去主动的切换不同场景的连续对话。
- 全领域连续对话。这种方式对用户的请求没有任何领域限制,是全领域的,同时允许用户与音箱聊天和问答,场景式的模式,实现起来会相对容易一点,但全领域对拒识要求比较严格。
- 回声消除,由于AI在说话的时候会把自己的声音也录音,所以需要消除AI自己的声音。这部分主要是通过前端声学算法解决,而回声消除也是全双工非常必要的部分。
- 拒识,AI会一直开着麦克风,难免录入很多背景噪音,比如周围人的说话声,拒识的功能就是把无效的语音过滤掉。
- 多轮对话,连续的对话模式,对基于上下文的意图理解有更高的要求,用户可以在多轮交互中让AI完成更复杂的任务,并允许任务的切换。
- 节奏控制,用户会以更加自然的方式对话AI,就会存在着停顿、节奏的变化,这时需要通过判不停更加智能地适应用户的说话节奏。当用户连续发出多条指令时,也需要对每一条指令的回复进行优先级控制。
- 主动对话,沉默破局,全双工的场景下,当识别到用户正常表达时,AI等待说完后答复反馈;当用户大段无意义输入或表达过于复杂时,会主动打断并提示反问;在交互过程中,当用户沉默时,则可以主动发起对话交互。
- 服务架构,由于AI会实时连续不断地把语音传上来,对系统的效率有很高的要求,需要有高效的通信协议,同时能支持多模态的输入和异步的处理。
拒识和节奏控制中的语义判不停
3.1 拒识
- 非人声部分,非人声主要指的是一些背景噪音以及周围环境产生的声音,目前通过 VAD 已经能比较成熟地解决。
- 不清晰的人声,通过 ASR 可能识别不出文字或者对文字不是太置信,可以通过 ASR 拒识。
- 无效人声,需要拒识处理。
拒识具体要解决哪些问题呢?上图给了一些具体的例子
在拒识方面的做法大致可以分为四个阶段:
3.1.1 场景拒识
场景拒识相对比较直接,只要定义好场景,确定场景下的意图集合,如果在意图集合中识别出用户意图,如果不在意图集合内的指令就可以不做响应。这种方式对于场景式连续对话来说,基本上能达到稳定可用的效果。
3.1.2 策略拒识
特征提取层通过各种模块提取特征。
- NLU 部分,NLU 是利用意图识别的能力,给出 domain 和意图的打分。
- 语言模型,语言模型会给每一个 query 计算出困惑度,表示一个 query 合法的程度,
- ASR 模块,提供一些语音方面的特征,包括用户说话的语速、信噪比,包括音量等,ASR 可以对 query 提供置信度信息,置信度表征的是语音清晰的程度。
策略的制定采用启发式,针对具体的 case 设计了各种策略,如根据 query 是不是无意语义进行拒识、对于超长的 query 进行拒识、对于一些长尾的闲聊很有可能是周围人在聊天,进行拒识。还会根据用户说话的语速,假设用户在很短的时间内说了很长的话,有可能不是正常地在与 AI对话。
3.1.2 语义拒识
基于当前的 query 和历史的 query,建立二分类的模型,通过模型学习各类特征的最佳组合策略。前提假设,用户“跟小爱说”和“不是跟小爱说”的 query 在语义空间上是不同的,用模型把两个空间划分出来,这样两个语义空间交集的部分,决定了这个问题能解决的上限。
模型采用了 BERT 二分类,首先通过 BERT 提取出 query 和上一轮 query 的向量表示,通过外部的模块提取出一些可解释的特征,以拼接的方式,接上全连接层和 softmax 进行分类。
语义识别比较依赖于文本,如果 ASR 有错误的话,会产生比较大的干扰。下面是小米在ASR纠错方面的介绍:基于BERT的ASR纠错www.zyxiao.com
无法单纯从文本确定是不是在和 AI说话,“跟小爱说”和“不是跟小爱说”,语义空间是有交叉的,单纯通过语义是没办法解决的,这就需要结合语音身份识别、声纹识别等其他信息。
3.1.3 多模态拒识
语音特征的提取,语音信号如果想在神经网络中处理,需要先进行预处理,输入是一维的声音序列,对应到每个时间点,是信号的强度。通过处理之后,会产生一个二维的 M 乘 N 矩阵,M 是每一帧能拿到的特征维度,N 对应到每一帧是时间维度。
单语音模型的输入只有用户的语音,语音加语义模型会把用户的语音和 ASR 取得的文本以及其他的一些语义特征,都输入到模型中去。语音加语义的模型效果是要优于单语音模型的。单语音模型效果比之前的语义模型是更优。
语音处理会经过特征提取模块,得到一些二维的特征矩阵,还会经过语音的 encoder,语音 encoder 可以选择适合处理语音的一些模型,比如 CNN、CNN+LSTM,这里选用的是CNN+LSTM。
语音经过 ASR 处理之后会得到文本,然后经过文本的 encoder,文本的 encoder 也有很多种选择,可以选择比较流行的 BERT。语音和文本分别得到表示向量一步融合。这一步融合是根据下层的网络设计确定,可以采用 attention 的机制,也可以通过门控的机制进行融合。
另外两边是一些高阶特征,包括从声音能提出来的一些比如音量、语速、信噪比,上图右边是通过 NLU 模块提到的语义的高阶特征,然后把三类特征做拼接,最后综合分类。
3.2 语义判不停
语义判不停要解决的问题是如何更加准确地对用户说话中存在的一些停顿判断句子是否结束。
判断用户说完通用的方案是采用的 VAD 判停,这是一种声学方案,根据尾部的静音时长,设置一个固定的阈值,比如 300 毫秒到 500 毫秒,如果静音时长超过阈值就认为用户的话说完了,但如果用户的停顿超过这个时长就会出现过早判停的问题。
vad 判停之后,再从语义的角度判断用户的 query 是不是完整。如果没有完整的话,继续延长收音时长,让用户话完请求。
3.2.1 规则系统
3.2.2 单轮判别模型
采用 LSTM 模型,把句尾也当作一个词,计算下一个词是句尾的概率,就可以表示一个句子说完的概率。判不停的条件用到三个:第一个条件是 EOS 的概率,就是句子下一个词是句尾的概率,这个概率越大,说明句子结束的概率越大。第二个条件是句子的混乱度,它表征了一个句子符合语法的程度,如果一个句子的混合度非常高,则认为它可能是一些无效的 query,这时候就不会做判不停。第三个条件是字数。
一些模型蒸馏和压缩的文章:
小莲子:碎碎念:Bert的知识蒸馏zhuanlan.zhihu.com3.2.3 多轮判不停
分析这一类 case 会发现,这种情况的次轮,跟上一轮有一些承接关系,可以把这个任务定义成对上下文的承接关系进行建模,可以用 BERT 句对分类任务去做。把前三轮的 query 和 answer 作为上句,当前轮的 query 作为下句,经过 BERT 模型做分类。
4.1 全领域的全双工的连续对话
难点:全领域很容易被AI乱搭话
拒识:采用策略拒识和语义拒识别,大体与小爱同学类似。
语义判不停:由于整理数的收集与整理是一个长期的工作,初版采用语义拼接的策略实现判不停,具体体现在设定2个参数,一是用户习惯性的停顿时间、二是连续拒识上下文片段截取时间。
全领域的全双工的连续对话体验效果不是很好,对语音、语义、系统架构、工程的挑战都很大,任重而道远。于是有了特殊场景下的连续对话。
4.2 场景式的连续对话
场景式的连续对话实现起来还是比较简单的,多个场景可是通过唤醒词自由的切换。
拒识:在进入语义系统之前,我们通过领域分类、意图识别等手段做3.1.1 场景拒识,如果不能判断明确意图,则交给语义系统做上下文语义的融合,根据融合结果做最后的拒识处理。有效提高了系统的响应速度,节省交互时间。
语义判不停:采用策略与基于ALBERT的二分类模型的判不停。
参考文献
1、智能音箱的“唤醒词”是怎样诞生的?
2、【biendata & PaperWeekly 联播】Industry AI Live - 小爱同学全双工技术实践
3、挑战真实场景对话——小爱同学背后关键技术深度解析
4、微软小冰:全双工语音对话详解