仝辉作者

基于TensorflowLite的人声识别在端上的实现

摘要:现有的人声识别绝大部分在服务端实现,这会带来如下两方面的问题:

1)    当网络较差的情况下会造成较大的延时,带来较差的用户体验。

2)    当访问量较大的情况下,会大量占用服务端资源。

为解决以上两个问题,我们选择在客户端上实现人声识别功能。本文使用机器学习的方法识别人声。采用的框架是谷歌的tensorflowLite框架,该框架跟它的名字一样具有小巧的特点。在保证精度的同时,框架的大小只有300KB左右,且经过压缩后产生的模型是tensorflow模型的四分之一[1]。因此,tensorflowLite框架比较适合在客户端上使用。

为了提高人声的识别率,需要提取音频特征作为机器学习框架的输入样本。本文使用的特征提取算法是基于人耳听觉机理的梅尔倒频谱算法[2]

由于在客户端上使用人声识别比较耗时,在工程上需要做很多优化,优化方面如下:

1) 指令集加速:引入arm指令集,做多指令集优化,加速运算。

2) 多线程加速:对于耗时的运算采用多线程并发处理。

3) 模型加速:选用支持NEON优化的模型,并预加载模型减少预处理时间。

4) 算法加速:I) 降低音频采样率。II) 选取人声频段(20hz~20khz),剔除非人声频段。

                     III) 合理分窗和切片,防止过度计算。IV) 静音检测,减少不必要的时间片段。

1.概述

1.1 人声识别流程

人声识别分为训练和预测两个部分。训练指的是生成预测模型,预测是利用模型产生预测结果。

首先介绍下训练的过程,分为以下三个部分:

1) 基于梅尔倒频谱算法,提取声音特征,并将其转换成频谱图片。

2) 将人声频谱作为正样本,动物声音和杂音等非人声作为负样本,交由神经网络模型    训练。

3) 基于训练产生的文件,生成端上可运行的预测模型。

简而言之,人声识别训练的流程分为三个部分,提取声音特征,模型训练和生成端上模型。最后,是人声识别的部分:先提取声音特征,然后加载训练模型即可获得预测结果。

1.2 人工智能框架

2017年11月,谷歌曾在 I/O 大会上宣布推出 TensorFlow Lite,这是一款 TensorFlow 用于移动设备和嵌入式设备的轻量级解决方案。可以在多个平台上运行,从机架式服务器到小型 IoT 设备。但是随着近年来机器学习模型的广泛使用,出现了在移动和嵌入式设备上部署它们的需求。而 TensorFlow Lite 允许设备端的机器学习模型的低延迟推断。

本文基于的tensorflowLite是谷歌研发的人工智能学习系统,其命名来源于本身的运行原理。Tensor张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。

下图展示了tensorflowLite的架构设计[1]

图1.1 TFlite架构图

2.梅尔倒频谱算法

2.1 概述

本章中声音识别的算法--梅尔倒频谱算法[2]分为如下几步,将会再后续小节中详细介绍。

1) 输入声音文件,解析成原始的声音数据(时域信号)。

2) 通过短时傅里叶变换,加窗分帧将时域信号转变为频域信号。

3) 通过梅尔频谱变换,将频率转换成人耳能感知的线性关系。

4) 通过梅尔倒谱分析,采用DCT变换将直流信号分量和正弦信号分量分离[3]

5) 提取声音频谱特征向量,将向量转换成图像。

加窗分帧是为了满足语音在时域的短时平稳特性,梅尔频谱变换是为了将人耳对频率的感知度转化为线性关系,倒谱分析的重点是理解傅里叶变换,任何信号都可以通过傅里叶变换而分解成一个直流分量和若干个正弦信号的和。

图2.1 声音的时域信号

图2.1是声音的时域信号,直观上很难看出频率变化规律。图2.2是声音的频域信号,反映了能够反映出声音的音量和频率等信息。图2.3是经过梅尔倒频谱的声音特征,能够提取声音

图2.2 声音的频域信号

图2.3 声音的倒频谱特征

图2.4 梅尔倒频谱算法实现流程

2.2 短时傅里叶变换

声音信号是一维的时域信号,直观上很难看出频率变化规律。如果通过傅里叶变换把它变到频域上,虽然可以看出信号的频率分布,但是丢失了时域信息,无法看出频率分布随时间的变化。为了解决这个问题,很多时频分析手段应运而生。短时傅里叶,小波,Wigner分布等都是常用的时频域分析方法。

图2.5 FFT变换和STFT变换示意图

通过傅里叶变换可以得到信号的频谱。信号的频谱的应用非常广泛,信号的压缩、降噪都可以基于频谱。然而傅里叶变换有一个假设,那就是信号是平稳的,即信号的统计特性不随时间变化。声音信号就不是平稳信号,在很长的一段时间内,有很多信号会出现,然后立即消失。如果将这信号全部进行傅里叶变换,就不能反映声音随时间的变化。

本文采用的短时傅里叶变换(STFT)是最经典的时频域分析方法。短时傅里叶变换(STFT)是和傅里叶变换(FT)相关的一种数学变换,用以确定时变信号其局部区域正弦波的频率与相位。它的思想是:选择一个时频局部化的窗函数,假定分析窗函数h(t)在一个短时间间隔内是平稳的,使f(t)h(t)在不同的有限时间宽度内是平稳信号,从而计算出各个不同时刻的功率谱。短时傅里叶变换使用一个固定的窗函数,通常使用的窗函数有汉宁窗、海明窗、Blackman-Haris窗等。本文中采用了海明窗,海明窗是一种余弦窗,能够很好地反映某一时刻能量随时间的衰减关系。

因此,本文的STFT公式在原先傅里叶变换公式:公式的基础上加了窗函数,因此STFT公式变换为

其中,为海明窗函数。

图2.6 基于海明窗的STFT变换

2.3 梅尔频谱

声谱图往往是很大的一张图,为了得到合适大小的声音特征,往往把它通过梅尔标度滤波器组,变换为梅尔频谱。什么是梅尔滤波器组呢?这里要从梅尔标度说起。

梅尔标度,由Stevens,Volkmann和Newman在1937年命名。我们知道,频率的单位是赫兹(Hz),人耳能听到的频率范围是20-20000Hz,但人耳对Hz这种标度单位并不是线性感知关系。例如如果我们适应了1000Hz的音调,如果把音调频率提高到2000Hz,我们的耳朵只能觉察到频率提高了一点点,根本察觉不到频率提高了一倍。如果将普通的频率标度转化为梅尔频率标度,映射关系如下式所示: 

经过上述公式,则人耳对频率的感知度就成了线性关系[4]。也就是说,在梅尔标度下,如果两段语音的梅尔频率相差两倍,则人耳可以感知到的音调大概也相差两倍。

让我们观察一下从Hz到梅尔频率(mel)的映射图,由于它们是log的关系,当频率较小时,梅尔频率随Hz变化较快;当频率很大时,梅尔频率的上升很缓慢,曲线的斜率很小。这说明了人耳对低频音调的感知较灵敏,在高频时人耳是很迟钝的,梅尔标度滤波器组启发于此。 

图2.7 频率转梅尔频率示意图

如下图所示,12个三角滤波器组成滤波器组,低频处滤波器密集,门限值大,高频处滤波器稀疏,门限值低。恰好对应了频率越高人耳越迟钝这一客观规律。上图所示的滤波器形式叫做等面积梅尔滤波器(Mel-filter bank with same bank area),在人声领域(语音识别,说话人辨认)等领域应用广泛。

图2.8 梅尔滤波器组示意图

2.4 梅尔倒频谱

基于2.3的梅尔对数谱,采用DCT变换将直流信号分量和正弦信号分量分离,最后得到的结果称为梅尔倒频谱。

其中,

由于梅尔倒频谱输出的是向量,还不能用图片显示,需要将其转换成图像矩阵。需要将输出向量的范围线性变换到图像的范围

图2.9 绘图颜色标度示意图

2.5 算法处理速度优化

由于算法需要在客户端上实现,因此需要对速度做一定的改进[5]。优化方面如下:

1) 指令集加速:由于算法有大量的加法和乘法矩阵运算,因此引入arm指令集,做多指令集优化,加速运算。速度可以提高4~8倍[6]

2) 算法加速:I) 选取人声频段(20HZ~20KHZ),并剔除非人声频段减少冗余计算。II)降低音频采样率,由于人耳对过高的采样率不敏感,因此降低采样率        可以减少不必要的数据计算。III)合理分窗和切片,防止过度计算。IV) 静音检测,减少不必要的时间片段。

3) 采样频率加速:如果音频的采样频率过高,选择下采样,处理的频率最高设定为32kHZ。

4) 多线程加速:将音频拆分为多个片段,采用多线程并行处理。并根据机器的能力配置线程数,默认为4个线程。

图2.10 算法工程端选取的参数

3.人声识别模型

3.1模型选择

卷积神经网络(Convolutional Neural Networks-简称CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。

20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络。现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。 K.Fukushima在1980年提出的新识别机是卷积神经网络的第一个实现网络。随后,更多的科研工作者对该网络进行了改进。其中,具有代表性的研究成果是Alexander和Taylor提出的“改进认知机”,该方法综合了各种改进方法的优点并避免了耗时的误差反向传播。

一般地,CNN的基本结构包括两层,其一为特征提取层,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其它特征间的位置关系也随之确定下来;其二是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid, relu等函数作为卷积网络的激活函数,使得特征映射具有位移不变性。此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数。卷积神经网络中的每一个卷积层都紧跟着一个用来求局部平均与二次提取的计算层,这种特有的两次特征提取结构减小了特征分辨率。

CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

图3.1 Inception-v3模型

本文选取了精度较高的Inception-v3模型作为人声识别的模型,v3一个最重要的改进是分解,将7x7卷积网络分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算,使得网络深度进一步增加,增加了网络的非线性,还有值得注意的地方是网络输入从224x224变为了299x299,更加精细设计了35x35/17x17/8x8的模块。

使用tensorflow session模块可以实现代码层面的训练和预测功能,具体使用方法详见tensorflow官网[10]

图3.2 tensorflow session使用示意图

3.2模型样本

有监督的机器学习中,一般需要将样本分成独立的三部分训练集(train set),验证集(validation set)和测试集(test set)。其中训练集用来估计模型,验证集用来确定网络结构或者控制模型复杂程度的参数,而测试集则检验最终选择最优的模型的性能如何。

具体定义如下:

训练集:学习样本数据集,通过匹配一些参数来建立一个分类器。建立一种分类的方式,主要是用来训练模型的。

验证集:对学习出来的模型,调整分类器的参数,如在神经网络中选择隐藏单元数。验证集还用来确定网络结构或者控制模型复杂程度的参数,用来防止模型过拟合现象。

测试集:主要是测试训练好的模型的分辨能力(识别率等)

根据第二章的梅尔倒频谱算法可以得到声音识别的样本文件,将人声频谱作为正样本,动物声音和杂音等非人声作为负样本,交由Inception-v3模型进行训练。

本文采用了tensorflow作为训练框架,选取人声和非人声各5000个样本作为测试集,1000个样本作为验证集

3.3 模型训练

样本准备完成后,即可使用Inception-v3模型训练。当训练模型收敛时,即可生成端上可使用的pb模型。模型选取时选择编译armeabi-v7a或者以上版本即可默认打开NEON优化,即打开USE_NEON的宏,能够达到指令集加速的效果。例如CNN网络一半以上的运算都在卷积(conv)运算,使用指令集优化可以至少加速4倍。

图3.3 卷积处理函数

然后经过tensorflow提供的toco工具生成lite模型,该模型可以直接在客户端上使用tensorflowLite框架调用。

图3.4 toco工具调用接口

3.4 模型预测

对声音文件使用梅尔倒频谱算法提取特征,并生成预测图片。之后使用训练产生的lite模型即可预测,预测结果示意图如下:

图3.5 模型预测结果

闲鱼技术
闲鱼技术

加入闲鱼,一起玩些酷的。(阿里巴巴集团闲鱼官方技术号,欢迎同道者技术交流。) 简历投递:guicai.gxy@alibaba-inc.com

工程图像处理机器学习TensorflowLite人声识别
4
相关数据
激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

感知技术

知觉或感知是外界刺激作用于感官时,脑对外界的整体的看法和理解,为我们对外界的感官信息进行组织和解释。在认知科学中,也可看作一组程序,包括获取信息、理解信息、筛选信息、组织信息。与感觉不同,知觉反映的是由对象的各样属性及关系构成的整体。

人工智能技术

在学术研究领域,人工智能通常指能够感知周围环境并采取行动以实现最优的可能结果的智能体(intelligent agent)

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

TensorFlow技术

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

验证集技术

验证数据集是用于调整分类器超参数(即模型结构)的一组数据集,它有时也被称为开发集(dev set)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

傅里叶变换技术

傅里叶变换(法语:Transformation de Fourier、英语:Fourier transform)是一种线性积分变换,用于信号在时域(或空域)和频域之间的变换,在物理学和工程学中有许多应用。因其基本思想首先由法国学者约瑟夫·傅里叶系统地提出,所以以其名字来命名以示纪念。实际上傅里叶变换就像化学分析,确定物质的基本成分;信号来自自然界,也可对其进行分析,确定其基本成分。

卷积神经网络技术

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

特征抽取技术

神经元技术

(人工)神经元是一个类比于生物神经元的数学计算模型,是神经网络的基本组成单元。 对于生物神经网络,每个神经元与其他神经元相连,当它“兴奋”时会向相连的神经元发送化学物质,从而改变这些神经元的电位;神经元的“兴奋”由其电位决定,当它的电位超过一个“阈值”(threshold)便会被激活,亦即“兴奋”。 目前最常见的神经元模型是基于1943年 Warren McCulloch 和 Walter Pitts提出的“M-P 神经元模型”。 在这个模型中,神经元通过带权重的连接接处理来自n个其他神经元的输入信号,其总输入值将与神经元的阈值进行比较,最后通过“激活函数”(activation function)产生神经元的输出。

语音识别技术

自动语音识别是一种将口头语音转换为实时可读文本的技术。自动语音识别也称为语音识别(Speech Recognition)或计算机语音识别(Computer Speech Recognition)。自动语音识别是一个多学科交叉的领域,它与声学、语音学、语言学、数字信号处理理论、信息论、计算机科学等众多学科紧密相连。由于语音信号的多样性和复杂性,目前的语音识别系统只能在一定的限制条件下获得满意的性能,或者说只能应用于某些特定的场合。自动语音识别在人工智能领域占据着极其重要的位置。

图像处理技术

图像处理是指对图像进行分析、加工和处理,使其满足视觉、心理或其他要求的技术。 图像处理是信号处理在图像领域上的一个应用。 目前大多数的图像均是以数字形式存储,因而图像处理很多情况下指数字图像处理。

前馈神经网络技术

前馈神经网络(FNN)是人工智能领域中最早发明的简单人工神经网络类型。在它内部,参数从输入层经过隐含层向输出层单向传播。与递归神经网络不同,在它内部不会构成有向环。FNN由一个输入层、一个(浅层网络)或多个(深层网络,因此叫作深度学习)隐藏层,和一个输出层构成。每个层(除输出层以外)与下一层连接。这种连接是 FNN 架构的关键,具有两个主要特征:加权平均值和激活函数。

暂无评论
暂无评论~