【笔记】Small-footprint Keyword Spotting Using Deep Neural Networks

2023-10-28 20:50

本文主要是介绍【笔记】Small-footprint Keyword Spotting Using Deep Neural Networks,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SMALL-FOOTPRINT KEYWORD SPOTTING USING DEEP NEURAL NETWORKS

Date: 2021.8.17

Author: Xin Pan


在这里插入图片描述

摘要

我们的应用需要一个KWS系统,这个系统需要满足这些条件。内存占用小,计算消耗小,高精度。为了满足这些条件,我们提出了一个基于DNN的方法。训练一个直接预测关键词或者关键词字词单元的DNN,后边接一个后验概率处理方法产生最终的置信度得分。对比传统的HMM系统,该系统达到45%相对的性能提升,同时在babble噪声下达到39%的相对性能提升。

想解决的问题

一个能够运行在移动设备的高精度,低延迟,低内存消耗的KWS系统。KWS是为了检测音频中的预定义关键词

准备知识

在传统的HMM-Filler模型中,每个关键词有一个自己的HMM,用其他的非关键词训练一个Filler模型。在解码过程中使用Viterbi解码,但是在HMM topo上的解码很消耗计算资源。

方法

作者给这个方法起名叫做DeepKWS,14年那时候的论文都喜欢叫做Deep阿巴阿巴的哈哈。

在这里插入图片描述

DeepKWS尝试直接预测关键词或者关键词的子词单元,再用一个后续的后验概率处理单元处理得到置信度分数。这个方法的好处就是不需要序列搜索(解码),序列解码那么势必就会导致一个问题就是整句解码的延迟会比较高。因此呢本方案就是每10毫秒做一次决策。

首先利用VAD将非静音区分出去,之后论文详细介绍了VAD怎么做的。这里不再讨论。

特征提取

本方法在所有的语音区内提取40-dim FBbank,窗长25ms,每10ms计算一次。将相邻的帧堆叠一起构成了上下文相关的输入帧。这里的输入窗是不对称的,为什么呢? 因为每增加一个未来帧都会增加10ms的一个延迟。实验中该方案使用30过去帧+10未来帧。论文里说这么做是最好的平衡了精度延迟和计算量。

DNN设计

labeling

基线系统的HMM系统,NN的label是CD(context-dependent) HMM状态。更具体的就是基线系统使用2002个CD状态。

对于提出的DeepKWS系统,label可以表示完全的关键词或者关键词额子词单元。后边的实验结果是完全关键词的因为它超过了子词建模单元。

标签是怎么产生的呢? 本文使用一个50M参数的LVCSR系统做了强制对齐,使用完整的词作为标签而不是HMM状态。这么做是有优点的:

  1. 更小的输出标签就更节省空间,因为最后一层的单元少了;
  2. 一个简单的后验决策就可以完成决策过程;
  3. 全词模型可以有更好的性能。
训练

最大化CE loss作为目标,公式如下
F ( θ ) = ∑ j l o g P i j F(\theta)=\sum_j{log P_{ij}} F(θ)=jlogPij
表示的是 x j x_j xj j帧的DNN后验输出在第 i t h i^{th} ithlabel上的概率就是 P i j P_{ij} Pij。在优化的过程中使用了SGD和learning rate decay。

后验处理

这里是说怎么把DNN的后验处理为置信度。其实决策很简单就是如果置信超过一个预定义的值就激活决策。这里作者假设只针对一个词做置信度决策,因为他可以很简单的扩展到多个关键词上。、

后验平滑

接下来的解释就很有意思了。我还真是不理解作者说从DNN出来的值是噪声(noisy),这里是说有毛刺或者说跳变的意思吗?

TODO

  • 检查这个noisy到底是什么意思呢?

为了解决这个问题也是很简单的就在一个长度 w s m o o t h w_{smooth} wsmooth的窗内做平滑。假设 p i j ′ p'_{ij} pij就是平滑后的后验:
p i j ′ = 1 j − h s m o o t h + 1 ∑ k = h s m o o t h j p i l p'_{ij}=\frac{1}{j-h_{smooth}+1}\sum^{j}_{k=h_{smooth}}p_{il} pij=jhsmooth+11k=hsmoothjpil
其中的 h s m o o t h = m a x ( 1 , j − w s m o o t h + 1 ) h_{smooth}=max(1,j-w_{smooth}+1) hsmooth=max(1,jwsmooth+1)就是窗内第一帧的索引。这个窗是在frame这个维度上的,在frame那个维度上做滑动的平均。自己刚才推了一次大概上是那个样子的。

置信度计算

这置信度计算有点意思啊我草。第 j t h j^{th} jth的置信度是这么计算的
c o n f i d e n c e = ∏ i = 1 n − 1 max ⁡ h m a x ≤ k ≤ j p i k ′ n − 1 confidence=\sqrt[n-1]{\prod_{i=1}^{n-1}\max_{h_{max}\leq{k}\leq{j}}p'_{ik}} confidence=n1i=1n1hmaxkjmaxpik
其中 h m a x = m a x ( 1 , j − w m a x + 1 ) h_{max}=max(1,j-w_{max}+1) hmax=max(1,jwmax+1)​是窗内的第一个索引。实验中 w s m o o t h = 30 w_{smooth}=30 wsmooth=30 w m a x = 100 w_{max}=100 wmax=100​​。然而实际上新能对于窗的大小并不十分的敏感,上下帧输入的堆叠帮助编码了上下文信息。

后来和同事讨论了一下,觉得这里的confidence计算就是通过计算每个i维度在窗内中最大值,最后把所有的最大值相乘得到了最后的confidence。

基线系统

基线系统使用的是标准keyword-filler HMM系统。Filler模型的构建有几个方法。从全连接的音素单元到完全您的LVCSR系统,其中的词典是除去了关键词的。后边的这个系统明显得到了更好一点的性能。但是这个办法的缺点就是消耗计算资源和内存以及速度会慢。因此本文实现了一种三音素HMM作为filler。

数据集

训练集

  1. 3000小时通用数据,代号为VS;
  2. 特定的关键词数据,代号KWS。每个关键词2.3k正样本,133k负样本。

在这里插入图片描述

数据集大概包括这些关键词。对于“ok google”这个关键词有40k正样本用于训练。

测试集

每个关键词有1k正样本,70k负样本。正样本和负样本比例是1.4%。对于关键词“ok google”有2.2k正样本。

噪音数据使用的是babble噪声以10db进行仿真。

结果对比

首先这里放上一个论文的截图。
在这里插入图片描述

本文对比HMM-DNN和DeepKWS两种方法中的KWS系统,两个模型的DNN部分使用相同的网络结构,但是输出层单元和输入的上下文维度不一样。这就导致两个模型的参数量不一样,HMM-DNN是373K参数,而DeepKWS是244K。

在这里插入图片描述

从图3可以看出来,使用一个voice search corpus(我其实认为这就是一个一般的ASR数据)就是VS那个结果训练测试。相比于用VS+KWS的方式是差很多的。那么从实验的分析中可以看出来最好的就是用ASR pretrain 再去用一个KWS去fine-tuning的这种方法是最好的。

之后把模型的结构增加之后,KWS直接训练的模型效果不好了,究其原因是因为数据少不能支撑起现在的这个模型。

在这里插入图片描述

从图5,后边作者还在噪音环境下进行了测试结果就是也变好了。

评价指标

ROC曲线,包括false alarm 和false reject。

总结

作者提出的DeepKWS这个模型在干净环境和噪声环境下都是超过了传统的HMM的方案。但是现在的应用只是一个是/否的决策,不能够对关键词的截止时间进行建模。这是作者认为的一个缺点。

附言

很抱歉大家,因为单位购买数据库有版权问题我不能把论文全文放在这里,但是还是欢迎大家一起讨论。论文原文请前往IEEE官网或其他网站搜索阅读。

这篇关于【笔记】Small-footprint Keyword Spotting Using Deep Neural Networks的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295867

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus