当我们说“嘿,siri”时,会发生什么?

前言

今天小松由于工作需要,研究了一下思必驰的一个语音识别模型,这块之前没有接触过,主要看了语音唤醒这一块内容。

本地语音唤醒,在做完配置后,只需要实现唤醒回调接口,实例化唤醒引擎,这个唤醒引擎我理解为启动唤醒功能的容器,你可以实现很多接口,比如唤醒引擎检测到说话声,会有对应的回调方法,开发人员可以实现这些回调方法,自定义自己的app的效果

部分回调方法会带来约定好的返回值,比如检测到声音变化或者错误码等等,下图表示整个流程,蓝框外面为应用开发来做,框里面除了实现接口回调,其他的都是sdk的工作

引擎运行流程图

话说这个项目文档真的拉胯,在sdk文档里面,本地语音识别,实时短语音识别和本地语音唤醒都是同样的内容,改了点边边角角都当三个item了,甚至接口文档直接拿jdk的来当……

无力吐槽

当然做为开发工程师,我们不能满足于调包,调参,上图中蓝色框内的部分就是sdk做的事情,我们希望能深入理解,语音是一个比较大的模块,本文仅讨论其中的唤醒识别,由于小松水平有限,若有错误,恳请指正

唤醒识别

大家都知道,语音识别现在已经普遍采用了深度学习中的神经网络,而唤醒识别,是语音识别的第一步,类似于tcp链接的第一次握手,相比普通的语音识别,需要做更多的工作,主要是语音活动端点检测(VAD)唤醒词识别技术

VAD

现在你手上有一个iphone,你只需要说:"嘿 siri",siri就会回答你,类似的,小度,小爱,小冰都是一样的,那么,就这一句话,你是否想过,发生了什么事情呢?

  • 特征提取,从原始音频中提取时域或者频域特征,类似于你不管在微信给别人发什么消息,在计算机看来,都会被转成2进制,声音的特征很丰富,有能量,熵,基频等
  • 初步决策:这里是分析中心,每一个输入的音频片段会被切分为语音片段和非语音片段,我们常用的降噪耳机,就是在这里去区别人声与环境噪声,进行降。这里的算法非常复杂:可以设立规则,比如均匀分贝的声音大概率是环境噪音等,但是不准确;也可以进行大数据统计深度学习,较准确但是可解释性差一点
  • 后处理:主要是对初步决策的结果进行平滑,每一个音频片段都是以帧的形式传入,在处理1,2,3帧时,可能初步决策认为1,3,是人声,2是环境声,这个理论上不太可能,因为人说话应该是连续的,不大可能中间突然没了一帧,然后瞬间有了,所以后处理就是将这些可能的误差进行修正,避免频繁切换语音状态

image-20211217153815976

从上面可以知道,最关键的部分是初步决策中选择何种VAD算法区分人声与环境声,我们希望这个VAD算法能在嘈杂环境,也就是高信噪比下能区分人声,同时有较好的鲁棒性

关键在于,人声和噪声的区别是什么? 肯定是有区别的,不然人耳为什么能区分?基于这个角度,出现了下面这些算法

  • 短时能量检测

    这种方法认为,能量是语音与噪声最大的区别,语音的能量更大,同时由于语音本质是非线性的(再唠叨的人也不会连续不断的说话),我们只需要统计这些非线性声音的能量,求一个平均值,然后未来再出现类似能量的声音,我们就认为是人声,公式如下

    image-20211217155748341

    开发同学不必深究公式,简单说就是x(n)为原生声音,w(n - m)为窗函数,表示取样长度,然后最后求平均值即可

这个方法在环境声比较固定,且比较小,比如持有intel 版本的mac程序员,使用这种方法,能比较好的过滤这种mac的风扇声(intel给爷爬,m1 yyds)

局限性也比较明显,那就是适用范围窄,在较为复杂的环境下,比如,公司,马路,菜市场这些地方,就几乎没有什么作用

  • 基于DNN

    图像,语音,除了我们能看到,能听到的内容,其实还隐藏着大量的特征信息,只是我们的器官没有能力去解析。而深层神经网络,可以在多次卷积-激活-池化下提取出特征,进行声学特征向量建模,这种方法,某种程度上来说,是万能的,只要两个东西有区别,神经网络就几乎可以提取到他们的不同之处

    一般针对语音,提取的是短时频谱特征,如MFCC梅尔倒谱系数,PLP(感知线性预测),FBANK相关性滤波器组特征,至于为什么选他们三,很简单,因为测试发现神经网络提取他们三更容易……,

    提取过程如下

    image-20211217161516864

    语音通常是一段连续的波形语音,所以首先会将其转换为离散的序列向量,称为特征向量,每隔大概10ms做一个切分,这些长度10毫秒的每一个向量称为”帧“,

    然后进行加窗,因为声音前后是有关系的,被生硬的切分为很多帧后需要一些平滑窗进行平滑处理,减少边界效应

    FFT就是大家熟知的快速傅里叶变换,是一种数学变换,将时域特征转换为频域特征

    最后进行滤波器组分析,这里分析出来的特征主要就是 FBANK, MFCC,PLP

    将这些特征取出后,自然就是进行训练了,建立多层神经网络,不断的训练,最后将输出结果进行后处理

    从结果上看,DNN的语音断点检测的准确率提高了很多,但是在嘈杂环境下效果仍然不佳

    关键在于,我们其实什么都没做,全交给DNN去自己发现,而面对纷繁复杂的声音世界,他是没有办法完全穷尽的,所以有一些特征,他是学不会的,或者很难学的。我们需要自己发现,并告知他,这样才能更大程度提高他的准确性和鲁棒性

下图可以简单总结一下

算法 原理 优点 缺点
短时能量检测 计算人声能量的平均值 简单,噪声小且稳定时效果较好 适用范围窄,功能弱
DNN 深度学习提取特征 效果更好,适用性更好 可解释性差,优化较为困难
DNN+ 输入特征 DNN+人工输入特征 应该是目前最好的解决方案 很难实现

唤醒词识别

上面说了针对语音端点检测的算法原理和两种现有的算法,我们回到siri,现在iphone已经在嘈杂环境下用DNN识别出了你的语音,那么接下来就是解码的过程,将你的语音转为系统能识别的指令

当我们说:“你好,siri”的时候,siri并不会理我们,所以,我们可以推测,siri的启动指令,一定是通过“嘿,siri”转换而来,那么,这就是使用了关键词检测

所以,iphone在用DNN训练时,一定是针对这句话进行了多种语言,多种声音模式的大数据训练,并构建了一个关键词声学模型,这种针对于关键词的检测算法有很多种,其中一种常用的是基于隐马尔科夫模型的关键词检测

隐马尔科夫模型

听着很悬,但是思想不难,只需要为关键词构造一组HMM模型,称为keyword 模型,为非关键词构造另一组HMM模型,称为Filler模型,当接受到一个关键词的时候,如果发现他属于Filler模型,那么就cut掉

我们都说,幸福的家庭都是一样的幸福,而不幸的家庭各有各的不幸。在这里,也一样,keyword模型只有一个,而Filler模型是一个统称,他的HMM模型,可以有很多个

image-20211217165043334

这个模型的核心作用就是过滤出关键词,并将他通过HMM模型转换为系统可识别的信号,这一过程就是解码的过程,将声学型号进行转换

解码

你可能会说,这还不简单,我们直接硬编码就行了,反正唤醒识别只用说“嘿,siri"

当然不是!唤醒识别虽然只有这么一句,但是后续用户还会说很多不一样的话,而解码器是需要在整个语音交互的过程起作用的,而不仅仅是唤醒这一块

但是,世界上的不同的话何止千万?难道让服务器去穷尽这宛若繁星的句子吗?肯定不是,本质上还是检测句子中的关键词,进而推断这一句话想表达的意思

所以解码过程,本质上还是关键词检测

image-20211217165717613

上图就是解码器所处的位置,既然要做关键词检测,就必须有一个词库KW进行配对,同时需要一个Acoustic Models模型,区分出每一句话中的关键词,当然这里已经不属于唤醒识别的范畴了,本文仅讨论唤醒识别,有兴趣的同学可以去研究哦,我后续也会继续研究的~

后记

这还是小松第一次较为系统的总结语言识别相关知识,总结下来就是两步

  • 语音检测VAD DNN算法过滤噪声
  • 唤醒词识别 隐马尔科夫模型识别关键词,解码器匹配词库解码

我本科时接过百度的apollo,百度的语音模型算是国内比较领先的了,具体使用也很简单,就是将关键词填进去,然后当一句话包含那个关键词时,就可以被模型检测出来,返回相应的结果,

比如在后台,填入一个”吃饭“,然后在app中实现回调函数:调用地图,搜索饭店

这样,你对着集成了apollo模型的app说:吃饭,app就会自动打开地图搜索饭点

还挺好玩,有兴趣的同学可以尝试一下。

小松很开心生活在这个知识爆炸的时代,有太多我曾经好奇的问题都有科学的答案,即使没有现成的答案,也有科学的方法帮助我们去寻求答案,终生学习,一起进步!

参考书籍《人工智能:语音识别理解与实践》

个人简介

我是小松,20届,末流985本科,曾参与开发手机QQ,现在不断在b站更新题解视频,手绘图解和代码实战,专注android与算法,文章首发与公众号小松漫步

另外建有学习群,已经有上百位爱学习的小伙伴,每周与群友进行模拟面试,互相鼓励学习,有意参与可以加我微信 cs183071301,加了后,请主动说自己的技术栈和称呼,然后我拉你进群(务必备注自己哦)

每周周六晚9点大家可以一起线上参与模拟远程面试,b站【小松不漫步】直播,大家快来参与吧

\

猜你喜欢

转载自juejin.im/post/7042603781602705439