抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

基于 TensorflowLite 在移动端实现人声识别

2018 年 5 月 10 日

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

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 tensorflow lite 架构图

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 公式在原先傅里叶变换公式:\(F(\omega )=\int_{-\infty }^{+\infty }f(\tau )e^{-j\omega \tau }\mathrm{d} \tau \) 公式的基础上加了窗函数,因此STFT 公式变换为\(F(\omega,t )=\int_{-\infty }^{+\infty }f(\tau )h(\tau -t)e^{-j\omega \tau }\mathrm{d} \tau \)

其中,\(h(n)=0.53836-0.46164\cos (\frac{2\pi n}{N-1}),0\leq n\leq N-1\) 为海明窗函数。

图2.6 基于海明窗的STFT 变换

2.3 梅尔频谱

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

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

\(mel(f)=2595*\log_{10}(1+f/700)\)

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

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

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

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

图2.8 梅尔滤波器组示意图

2.4 梅尔倒频谱

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

\(mfcc(u)=c(u)\sum_{i=0}^{N-1}mel(i)\cos [(\frac{(i+0.5)\pi }{N})u]\)

其中,\(c(u)=\begin{cases} & \sqrt{\frac{1}{n}},u=0 \\ & \sqrt{\frac{2}{n}},u\neq 0 \end{cases}\)

由于梅尔倒频谱输出的是向量,还不能用图片显示,需要将其转换成图像矩阵。需要将输出向量的范围\(mel\in [min,max]\) 线性变换到图像的范围\(pixel\in [0,255]\)

\(pixel=\frac{mel-min}{max-min}*255\)

图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 模型预测结果

参考文献:

[1] https://www.tensorflow.org/mobile/tflite
[2] 基于MFCC 与IMFCC 的说话人识别研究 [D]. 刘丽岩. 哈尔滨工程大学 . 2008
[3] 一种基于MFCC 和LPCC 的文本相关说话人识别方法 [J]. 于明, 袁玉倩, 董浩, 王哲. 计算机应 用. 2006(04)
[4] Text dependent Speaker Identification in Noisy Enviroment[C]. Kumar Pawan,Jakhanwal Nitika,Chandra Mahesh. International Conference on Devices and Communications . 2011
[5] https://github.com/weedwind/MFCC
[6] https://baike.baidu.com/item/ARM 指令集 /907786?fr=aladdin
[7] https://www.tensorflow.org/api_docs/python/tf/Session

2018 年 5 月 10 日 18:159447

评论 1 条评论

发布
用户头像
有可参考的demo代码吗?
2019 年 03 月 25 日 22:13
回复
没有更多了
发现更多内容

开发者的福音,LR.NET模块化代码生成器

Philips

敏捷开发 快速开发 模块化流程 代码质量 .net core

oeasy教您玩转linux010107那啥在哪 whereis

o

分享一个阿里云轻量级开源前端图编排,流程图js组件——butterfly-dag

InfoQ_39ba186c207f

Java 流程图 flow canvas html/css

oeasy教您玩转linux010106这儿都有啥 ls

o

LeetCode题解:155.最小栈,使用两个栈,详细注释

Lee Chen

LeetCode 前端进阶训练营

有为而治:平衡吞噬世界的系统之熵

IT民工大叔

涵盖多场景区块链与政务结合 应用前景广阔

CECBC区块链专委会

区块链 互联网 数字政务

Flink-状态后端作用-11

小知识点

scala 大数据 flink

消息队列之推还是拉,RocketMQ 和 Kafka 是如何做的?

yes

kafka RocketMQ

面试官想知道都在这里

escray

学习 面试 面试现场

不得不了解系列之限流

梦朝思夕

限流

软件开发丨关于软件重构的灵魂四问

华为云开发者社区

软件 开发者 软件开发 代码 软件重构

学习Python真的能找到工作吗?

代码制造者

Python 程序员 编程语言 低代码 零代码

化妆品行业与区块链的融合可减少甚至消除假冒伪劣

CECBC区块链专委会

区块链 化妆品

架构师训练营0期11周

WW

最强云硬盘来了,让AI模型迭代从1周缩短到1天

华为云开发者社区

SSD 云存储 All-Flash 云硬盘 擎天架构

硬核科技:莱克立式吸尘器,引领家居清洁“新态度”

InfoQ_967a83c6d0d7

柔性电子拥有改变地球的能力吗?

脑极体

mPaaS 客户端证书错误避坑指南

阿里云金融线TAM SRE专家服务团队

屏幕共享接入指南

anyRTC开发者

WebRTC 在线教育 直播 RTC

区块链 新基建定位下的新使命 2020新区势

CECBC区块链专委会

区块链 新基建

甲方日常 3

句子

工作 随笔杂谈 日常

微前端在民生 APaaS/PSET 平台的探索与实践

亻尔可真木奉

探索与实践 案例分享 微前端

全民加速节:动态加速在在线教育应用上的最佳实践

阿里云Edge Plus

在线教育 CDN

【写作群星榜】8.15~8.28 写作平台优秀作者 & 文章排名

InfoQ写作平台官方

写作平台 排行榜

数据挖掘学习指南(转载)

Jackchang234987

数据挖掘 产品经理

【FCC前端教程】44关学习CSS与CSS3基础「二」

三钻

CSS 前端 FCC

ShardingSphere简介+实战

云淡风轻

ShardingJDBC

架构师训练营第 11周作业和感想

tuuezzy

极客大学架构师训练营

GitMaster 更新v1.9.0,支持Gitea,Gist拥抱黑暗模式

neo

gitlab tree gitee GitHub、

微服务架构下,DLI的部署和运维有何奥秘?

华为云开发者社区

Docker 大数据 Serverless 数据湖 DLI

Study Go: From Zero to Hero

Study Go: From Zero to Hero

基于TensorflowLite在移动端实现人声识别-InfoQ