klocwork命令行使用方法

原文:语音识别实际问题:(九)关键词识别与嵌入式应用 9.1 基本概念 从一个小视频说起:受过良好“教育”的狗狗端坐在一份美食面前心潮澎湃着,当主人说出“三”这个数字时,它便可以大快朵颐了。于是主人开始“调戏”它,“一”、“二”、“三——十一”(

原文:语音识别实际问题:(九)关键词识别与嵌入式应用

9.1  基本概念 

从一个小视频说起:受过良好“教育”的狗狗端坐在一份美食面前心潮澎湃着,当主人说出“三”这个数字时,它便可以大快朵颐了。于是主人开始“调戏”它,“一”、“二”、“三——十一”(都已经要低下头冲向食物了,结果主人只是拖长了音,于是晃了晃身子又回到原位)、“三——十三”(主人又拖长了音,箭在弦上,差点发射)...“三”(反应了一瞬间,后面没有声音了,终于可以开动了)。

这个视频中的狗狗让很多耗费大量人力才建立起来的计算机系统逊色。视频中的“三”就是一个关键词,并且是单独的一个“三”,而不是“三十三”中的“三”,对于机器来说,识别出“三”的同时还要区别开孤立词“三”与“三十三”,这更增加了机器识别的难度。这里,机器从一段连续的语音中识别出指定关键词的技术,就叫关键词识别或关键词检出(Keyword Spotting,KWS)。文档图像处理等领域也有关键词识别技术,这里不做讨论。

关键词检测的英文术语也可以使用“Spoken Term Detection”(STD)。STD任务最开始由美国国家标准与技术研究院(NIST)提出,是指利用语音识别系统生成的中间结果进行特定关键词的检测,其使用的评测标准也由NIST单独给出[1]。STD任务最初的定义是需要依赖语音识别系统的,属于语音识别系统的子应用,如果放开这个限制,STD与KWS的目标是一样的,都表示关键词识别,且随着研究的升入,二者的实现方法都是类似的,二者并没有本质的区别。命令词识别(Command Recognition) 也可以看成是KWS的另一种叫法,只是该叫法更加强调场景的应用,即要识别的关键词代表着机器即将进行的某种动作或行为,关键词的格式通常为祈使句,比如“打开电视”。
 

唤醒词检测(Wake-up Word Detection,WUW) 也可以看成是KWS的一种特殊应用,不同之处在于,唤醒词检测的唤醒关键词一般只有一个,如同一个人的姓名,比如“小清”;并且,使用中唤醒词作为独立词,没有直接上下文,同于我们使用姓名呼唤同伴一样,比如“小清,打开电视”(“打开电视”是命令词),而不是“小清的声音大一点”。

大体上,以上技术都可以归到关键词识别的范畴。关键词识别与语音识别的联系,可以通过识别的是否为孤立词以及词汇量的大小来进行对比。图 9.1 展示了上述技术与语音识别的关系,其中 LVCSR 表示大规模连续语音识别(Large Vocabulary Continuous Speech Recognition)。“连续词”表示连续的多个词,语音识别中文本的单位为“词”,即使是“的”这样的单字也称为词。图中各技术的界限并不是绝对的,比如一个大型关键词识别系统的规模甚至要超过一个基本的语音识别系统,又比如一个关键词甚至可以是一个连续的句子。一般来说,相较于关键词识别,语音识别词汇量更大,识别的词更长更连续,所以语音识别可以加以改造,并用于关键词识别。

图 9.1: 关键词识别与语音识别的关系

关键词识别的应用场景较为丰富,比如家居生活中,凡是需要用到遥控器、控制面板的电器都可以使用命令词操控,比如空调、电视、油烟机、热水器等;刑事侦查或公共安全中,对敏感词汇的过滤。通过引入说话人识别技术,可以实现特定人的关键词识别,比如,手机的语音唤醒,部分儿童不宜接触家电的命令词控制。

由于命令词识别常常用于低功耗电器上,系统的性能、资源消耗与实时性相互之间的平衡也是应用中需要考虑的问题。

9.2  评价指标 

关键词识别系统根据其在应用当中的关注点不同,所选取的评价指标也各有侧重,以下列举部分常用的指标。
 

考虑语音的两种情况,一种是语音中包含某个关键词,另一种是不包含关键词,则关键词识别系统对语音的识别结果无非是4种组合(沿用文献[2]中的表示):

  • 真阳性(True Positive, TP):语音包含关键词,系统识别出来了。

  • 伪阳性(False Positive,FP):语音不包含关键词,系统却识别出结果。

  • 真阴性(True Negative,TN):语音不包含关键词,系统未识别出结果。

  • 伪阴性(False Negative,FN):语音包含关键词,系统未识别出来。

图 9.2: 二分类混淆矩阵

对应地,其混淆矩阵如图9.2所示,其中TP、FP、TN、FN均表示个数,据此我们可以定义指标:

  • 虚警率(False Alarm Rate,FAR)
    虚警是指不该识别成命令词的却识别成了命令词。虚警率在关键词识别中也可称为误识率(False Acceptance Rate,FAR), FA等价于FP,FAR = FP/(FP+TN),越小越好。关键词识别系统在使用过程中,通常需要持续工作,随时都在“监听”外界声音,所以讨论单位时间内的虚警率更有实际意义,比如每天的虚警率FAR/D、每个小时的虚警率FAR/H。不同的关键词识别系统可能有不同的关键词数,所以每个关键词下的平均虚警率可以用于横向比较不同系统。

  • 拒识率(False Rejection Rate,FRR)
    拒识是指本该识别成命令词的却没识别出来。FR等价于FN,,越小越好。

  • 准确率(Accuracy)

    准确是指该识别的识别出来了,不该识别的未识别出来,,越大越好。

  • 精确率(Precision)
    也叫查准率, ,越大越好。

  • 召回率(Recall)
    也叫查全率, ,越大越好。

  • F1值(F1-Measure,F1-Score)

    F1值是Precision和Recall调和平均值,兼顾二者,。

  • ROC曲线(Receiver Operating Characteristic Curve)
    关键词识别系统的性能是误识与拒识之间的权衡,系统阈值可以“严厉”一点,不让非命令词通过,但同时也会误伤有效命令词;阈值也可以宽松一点,让命令词较容易通过,但同时伪装者也可能蒙混过关。通过调整不同的阈值,可以得到不同的Recall和FAR,并分别以二者为纵、横坐标作图,则得到ROC曲线。ROC曲线只能从直观上反映系统性能随阈值的变化趋势,不是一个可以直接比较的数字,可以通过计算曲线与横坐标之间区域(Area under ROC,AUC)的面积得到一个指标,越大越好。不同的阈值会有不同的FAR和FRR,FRR=1-Recall,当FAR=FRR时,其值称为等错误率(Equal Error Rate,EER)。等错误率常在说话人识别中用到,也可用于命令词识别。如果以FAR、FRR分别为纵、横坐标进行作图,得到的曲线就是DET(Detection Error Tradeoff)曲线,顾名思义,该曲线反映了二者的对抗关系。图9.3展示了AUC、EER与ROC曲线的关系,其中TPR=Recall。FOM(Figure Of Merit)指标[3]在计算AUC面积时进一步考虑了FAR/H。

图 9.3: ROC曲线以及AUC、EER在坐标中的表示

关键词识别系统在实际使用当中常常处于一直“监听”状态,时刻都在进行着关键词的检测,衡量系统能否正常工作的重要指标是实时率(Real Time Factor,RTF)。如果系统花费时间长度P来处理一段时间长度为I的语音,则RTF=P/I,只有RTF不大于1时,系统才算满足实时性要求,即收支平衡或支大于收。

9.3  实现方法 

9.3.1       总体框架

语音任务(语音识别、说话人识别、语种识别等)大多使用类似的前端特征提取流程,包括语音增强、语音降噪、规整手段等,关键词识别也是如此。关键词识别可以看成是个别孤立词汇的语音识别系统,故它可以延用常规语音识别的前端特征提取结构。

如果人类来做关键词识别,是可以立马上阵的,因为人类可以直接依赖已有的语音识别神经系统,从听到的内容里直接进行筛选即可。类似地,假如机器已经能够进行良好的语音识别,转而进行关键词检索,似乎是顺其自然的,这便是实现关键词识别的第一类方法:基于现成的语音识别系统,是一个站在巨人肩膀上的方法,可以坐享语音识别系统的果实,但语音识别系统的弱点也将被继承下来,比如语音识别系统较为庞大,耗费资源,不利于边缘计算。

上文提到的小视频中,狗狗并不需要懂得人类的全部语言,只需要能够区分关键词与非关键词即可,所以我们可以从头搭建一个系统,不靠外援。这便是实现关键词识别的另一类方法:独立任务,是一个短小精悍的方法,有了更多的灵巧性,但也受限于见识不足,比如训练语料不够,且专词专用,其他命令词不能复用。

图 9.4 展示了关键词识别技术主要实现方法的框架,下文将对其中的方法逐一进行解说,且以基于深度学习的思路为主。由于实际应用中,命令词识别系统需要持续不断地对输入的语音进行检索,滑动窗口的设计也至关重要,既期望大跨步,提高计算速度,又必须保证不漏检,下文也将对其设计进行简单的讨论。

图 9.4: 关键词识别的技术路线

9.3.2       基于LVCSR 的KWS 系统

前文介绍过,语音识别系统本身也有不同的实现方法,常见的包括DNN-HMM结构和端对端结构。选择不同的语音识别系统作为中间结果的提取器,后续的命令词识别设计随之也将略有不同。下文介绍较为常用的两种模式。

基于DNN-HMM的KWS系统

给定一个预训练好的DNN-HMM ASR系统以及将要识别的关键词组。由于DNN-HMM ASR系统声学模型输出的基本单元并非字词,而是所有字词的基本组成单元(如Senone),所以ASR系统的识别词表中事先可以不包括关键词,但基本音素必须可以合成关键词,这样可以将关键词新加入词表乃至语言模型,所以DNN-HMM ASR可以有效地解决集外词(Out Of Vocabulary,OOV)。将待检测语音通过ASR,我们可以获得不同的中间结果(包括最终结果):

  • 最终识别结果
    利用现成ASR系统做关键词识别最直接的方法便是从ASR的最终识别文本中进行检索,此时ASR的识别词表中包含关键词或已新加入关键词。该方法适合关键词较多且经常变换的场景,比如客服电话中,通过快速分析客户语音,将不同客户分流到不同的业务部门或售后部门。该方法的劣势在于其性能极大地依赖于语音识别系统。

  • 词格(Word Lattice)
    DNN-HMM ASR的解码图本身就是包含词表中所有词的词格(考虑了语言模型)。给定语音,通过ASR解码,使用原有解码图,获得精炼了的Lattice,即包括多条最可能的识别路径,然后通过直接比对的方式,在候选识别结果中查找关键词,该方法相对于只搜索最终识别结果,部分地减轻了对语音识别的依赖。我们还可以改造语言模型,比如将所有的词都独立成句,这样将有效降低语言模型的规模,加速解码;还可以使得在解码图中所有的关键词都有独立的路径,而所有的非关键词都共享一条路径(“垃圾”边)。改造语言模型的难点在于,无法合理设置剩余解码图中各个路径的权重,因为声学模型给出的各音素后验概率是浮动的,所以不能简单地将语言模型路径设置等权。

  • 音素特征(Phonetic Feature)
    音素特征可以是声学模型的输出或隐含层输出,利用音素特征等价于将原始语音特征转换为另一种表征形式,后续方法可以使用模板匹配的方法,下文将会介绍。直接改造语言模型是较为便捷的途径之一,也可以针对特定关键词重新训练声学模型,以使声学模型也更有针对性(趋近于下文的端对端KWS),但这样便丧失了声学模型针对不同关键词的通用性。

基于端对端ASR 的KWS 系统

相比于基于DNN-HMM的KWS系统,基于端对端ASR的方法在利用ASR最终输出结果或数条最优备选结果进行关键词检测的方法上与前者一致,只是端对端的中间输出有所不同,这取决于端对端ASR训练中选择的基本单元。如果端对端ASR的基本输出单元是词,此时要求ASR的识别词表中必须事先包含关键词,所以不利于OOV的扩展;如果端对端ASR的基本输出单元是音素,可以改造基于音素的语言模型,进行OOV扩展,也可输出音素特征,用于原始语音特征的另一种表征形式。

基于DNN-HMM的KWS,或者基于端对端ASR的KWS,二者在方法上大体相同,所以如何选择,本质上在于DNN-HMM与端对端系统的比较。

9.3.3       基于示例的KWS

关键词识别最直观的方法就是将待检测语音与已知关键词语音进行模板匹配,相似度越高,则待检测语音是该关键词的概率最大,该类方法也叫示例查询(Query By Example,QBE)。

动态时间归整(Dynamic Time Warping,DTW)将待检测语音信号与已知关键词语音信号(或它们的声学特征)进行直接DTW比对。已知关键词通常有多条样本语音,即使如此,也远远无法满足多样性,所以该方法鲁棒性不足,只适合某些固定场景,此外语音的不定长问题也极大地影响其性能。

词向量(Word Vector)、文档向量(Document Vector)、说话人向量(如i-vector、dvector、x-vector)等都是将对象表示为一个规定长度的向量,即将个体映射到一个规整的隐含空间中,方便相关计算,比如计算距离(对于相似度)。因此,可以将不定长度的待检测语音转换为另一种固定长度的表征形式,并将其与目标关键词的表征直接进行相似度计算(如余弦值)。通过将待检测语音分帧转换为另一种表征形式(比如上文提到的音素特征),直接进行 DTW 或其他比较也是可行的。

9.3.4       端对端KWS

语音任务中,端对端的两端一般是指神经网络的两端,即给定输入,神经网络的输出即为目标结果。基于DNN-HMM的KWS系统中,我们可以改造语言模型,使得所有的关键词都有独立的路径,而所有的非关键词都共享一条路径(“垃圾”边),类似地,我们也可以改造基本输出单元为词的端对端ASR,即所有的关键词都有独立的输出节点,而所有的非关键词都共享一个输出节点(“垃圾”节点)。图 9.5 展示了端对端关键词识别的神经网络结构,是一个标准的分类器,其训练方式可以直接使用交叉熵(Cross Entropy)损失函数[4]。

图 9.5: 端对端关键词识别

9.3.5       滑动窗口

考虑关键词识别系统持续不断地“吃”语音,不断地做出关键词判断,将关键词识别作为独立任务时,通常需要设计一个合理的语音操作窗口,每个窗口作为一个单元进行检索、比对,保证不漏检的同时尽量节省计算资源。滑窗机制可以简单设计为如图 9.6 所示的形式,其中包含了一个无法覆盖的关键词语音,相邻的数个窗口之间可以并行计算,且窗口之间重叠部分的中间输出结果可以重复利用。

图 9.6: 滑动窗口机制以及一个无法覆盖的关键词语音

假设窗长为window,窗口滑动步长为step,某个命令词语音时长为cmd,为了保证该命令词不会漏检,则需要保证step+cmd < window;而为了该词不被重检,则需要在检出一个关键词时,直接丢弃该窗口内的语音,不再参与下一次识别。

9.4  嵌入式应用 

关键词识别系统的多数应用场景(如智能家居设备)只能提供有限的计算资源,这要求系统必须小(资源占用小,计算快)而精(性能好),此类模型在英文术语中被称作“Small-footprint”,承载这类模型的多为低资源(Low-resource)设备或实时操作系统(Real-time Operating System,RTOS),如移动手机、嵌入式设备、边缘计算设备等。图9.7展示了获得一个小而精的神经网络模型的不同途径,基于神经网络的关键词识别系统也可遵循此流程,下文将简述图中的各个方法。

图 9.7: 小而精模型的获得方法(虚线表示方法可选)

9.4.1       模型压缩

一个大杯子装了半杯水,这些水完全可以腾挪到到另一个更小的杯子中,两个杯子承载的水量未发生改变。一个大规模神经网络所学到的知识(一种复杂的映射能力)完全有可能由一个更小规模的神经网络掌握,二者所展现的能力也就无差别。深度学习领域的模型压缩(Model Compression)就是为了使得大者能够由更小者取代,其前提条件是,大者的“容量”必须是冗余的,即神经网络确实是过度参数化(Over-parameterization)的。考虑神经网络的基本组成单元:点、边、权重、子结构,模型压缩方法也将围绕这三者进行:

  • 点、边
    可以根据每个节点、每条边的重要性采用末位淘汰制,进行网络修剪(Network Pruning),通常都采用三部曲的流程:训练大模型、网络修剪、网络微调(Fine-tuning)。点修剪是边修剪的一种特殊情况,即点相关的所有边都剪除了。网络修剪中,最关键的是重要性指标的选取,比如损失函数对参数的海森矩阵(Hessian Matrix)[5, 6]。我们常用的一阶范数(L1-norm)、二阶范数(L2-norm,Weight Decay)正则化方法本质上都是限制权重的值,使其尽可能趋近于0,从而自动学习到稀疏结构,然后可以将权重为0或极小的边直接剪掉,或者用于下一步的网络修剪。
    彩票假设(The Lottery Ticket Hypothesis)[7] 针对网络修剪提出了一个观点:一个大网络随机初始化后就已经包含了一个可以匹配原始大模型性能的子网络,这个子网络就是中奖彩票(Winning Ticket)。这意味着网络修剪中,结构的重要性大于权重,只要找到方法从随机初始化的大模型中找到“中奖彩票”,可以直接跳过“训练大模型”的步骤。原论文就如何发现“中奖彩票”做了部分探索。

  • 权重
    权重的等价存储或高效存储是模型压缩的重要手段。对权重的量化(Quantization)、二值化(Binarization)可以将原始网络中一个浮点数参数由更少的位数来表示,而不明显影响模型性能,也可以直接从头训练一个事先固定好参数位数的网络。
    编码是数字存储中必须要考虑的问题,神经网络的所有权重就是一堆位置相关的数字,也直接决定着模型大小,对这些数字可以采用更加高效的组织形式或编码算法,如哈希桶(Hash Bucket)[8]、哈夫曼编码(Huffman Coding)[9] 等。

  • 子结构
    卷积神经网络的卷积操作就使用了共享过滤器(及其参数)的机制;奇异值分解(Singular Value Decomposition,SVD)和低秩矩阵分解(Low-rank Matrix Factorization)等手段都是使得一个较大的权重矩阵可以由更小计算规模的矩阵表示;模型训练前便限制权重矩阵的格式,比如限制其为一个对称矩阵,缩减一半参数量;特定子结构的修剪,比如卷积神经网络以滤波器为单位进行修剪[10]。

9.4.2       迁移学习

模型压缩类似于师傅将功力直接灌输于徒弟(预训练),而使用迁移学习(Transfer Learning)的方法获得一个小网络则类似于,师傅带着徒弟学习(将一个网络的结构和参数用于另一个网络的初始化也属于迁移学习,但这样的迁移学习是同等规模的网络迁移)。图 9.8 展示了神经网络迁移学习的基本结构。

迁移学习中一个重要的问题是如何显性表征教师模型的知识,或者是学生模型要学习的目标,其中一个常用的手段则是知识萃取(Knowledge Distillation)[11]。考虑一个典型的深度神经网络分类器,网络经过Softmax后的最终输出本身已是一种知识表征,但为了增加Softmax输出的“柔韧”度,可以引入一个可调系数,记为温度(沿用了能量模型中的相关概念),并将知识拓展为暗知识(Dark Knowledge),该表征可以作为学生模型的学习目标。暗知识提取的基本流程如图9.9所示。

图 9.8: 神经网络的迁移学习

图 9.9: 神经网络的暗知识提取

三人行,必有我师,老师有时候也可以向学生学习,作者团队曾经提出使用小规模模型(如前向神经网络)来预训练一个较大复杂度的模型(如循环神经网络),以使后者的起点更高,后续的再训练更加有效[12]。

9.4.3       网络结构搜索与设计

上文提到,修剪一个模型,结构的重要性大于权重,且深度学习的相关任务中,网络结构也往往决定着模型的性能(所以很多深度学习工作者都是神经网络结构设计师);另一方面,修剪出的小模型结构是杂乱无章的,找到它是一个搜索问题,所以,我们完全可以让机器自行进行神经网络结构搜索(Neural Architecture Search,NAS)[13]。NAS是自动机器学习(Automated Machine Learning,AutoML)的一个步骤,本意是为了搜索更加高效的神经网络结构,而不限制于小规模。

NAS是对神经网络超参数(Hyperparameter)(如深度、宽度、子结构等)的搜索求解过程,其求解空间是巨大的,需要的计算力和时间也是巨大的,本身也是一个学习难题,所以网络结构的另一个快速获取途径是人工设计,该方法更方便将人类的先验知识和经验融入进去。常见的精小人工设计网络结构都基于卷积神经网络,包括 MobileNet[14, 15]、ShuffleNet[16, 17]、 EfficientNet[18]等。

9.5  小结

本章介绍了关键词识别的基本概念和评价指标,并对基本实现方法进行了介绍。物联网设备或移动设备中的语音唤醒系统多采用端对端神经网络方法或 QBE 方法,而对于关键词较多且经常变动的场景,则多采用基于 LVCSR 的方法或 QBE 方法,总体上,基于深度学习的关键词识别方法越来越普遍。由于关键词识别应用场景的限制,计算资源有限,所使用的模型需要小而精,本章最后也对如何获取小而精的深度神经网络模型进行了相关方法的讲解。

知秋君
上一篇 2024-08-16 13:48
下一篇 2024-08-16 13:12

相关推荐