摘要:现有的人声识别绝大部分在服务端实现,这会带来如下两方面的问题:
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架构图