深度学习和语音识别

技术设计 · 2020/05/23
← 返回技术文章

随着人工智能近几年的火爆兴起,智能两字越来越受到人们的关注,智能家居语音识别技术,便是为自己家庭中的家居唤醒智能,装上“耳朵”,与传统的按键控制相比,语音控制更为方便和自然,极大的帮助了人们对于家居功能操控和使用,让人们抛去繁杂的按钮...

随着人工智能近几年的火爆兴起,智能两字越来越受到人们的关注,智能家居语音识别技术,便是为自己家庭中的家居唤醒智能,装上“耳朵”,与传统的按键控制相比,语音控制更为方便和自然,极大的帮助了人们对于家居功能操控和使用,让人们抛去繁杂的按钮并能为人们带来更好的家居交互式使用体验。虽然现在技术尚有不足,但在研究人员的不断努力研究下,终有一天,在语音识别技术将会走进千家万户,而那时语音识别技术将改变每个人的生活和文字输入习惯。

语音识别技术的研究也有有利于我们对于语音识别系统的深入理解,并且语音识别技术是之后高新科技发展的一大主流方向,通过对语音识别技术的研究,我们也能更清楚的知道,现如今的尖端科技的发展现状和趋势,利于以后的学习和发展,拥有良好的发展前景。

需求分析

本文设计的语音识别系统,拟将应用于家庭的智能家居之中。相较于传统的按键控制家居中的电子设备,语音识别控制将带给人更加方便、简单、轻松的控制体验。所以智能化家居语音识别技术必将成为人们之后热切需要的技术。

应用于家庭电子设备的语音识别技术,主要需要满足的技术需求是语音的准确识别和准确实现相应功能的控制,为此我们必须解决语音信息多样性和复杂性。因为家庭之中,一家人各自语音、语气、语言习惯都不尽相同,所以我们的识别系统需要有良好的稳定性,面对不同人的不同语音,都能够将之识别出来。另一方面便是识别的准确性,因为我们如果说出不同的语音都能被识别成不同的文字信息,那么对于家居而言,功能控制将变得复杂,如果能确定几种功能指令的固定识别,那么一条信息对应一个功能,控制将变得更加简单易行。对于语音识别系统,我们首先要满足录音功能,只有能够录取每个人的声音,才能根据音频信息实现相应的识别和控制。拥有录音功能之后,我们还需要预处理音频的功能,因为录取的声音往往是包含很多杂讯和干扰的,所以经过预处理后的音频,才能用于模型的训练和识别。神经网络模型是这些功能中的重点,它决定了语音识别的效果和表现,最后需要调用神经网络模型来输出分析后的结果,并根据该结果来实现相应的功能控制。

可行性分析

技术层面,我们需要依靠Python语言来实现功能代码的编写,使用Tensorflow框架和Keras的深度学习函数库构建人工神经网络模型,基于神经网络模型,开发相应的录音功能,预处理功能和相应的识别功能等等。技术上是可行的。

设备层面,我们只需要一台装有Windows系统的电脑即可,录音功能调用电脑自带的麦克风即可。其余功能只需要Python的相应函数库来支持我们的开发便足以。设备的需求条件很低,可以轻松满足。

语音识别技术的相关内容概述

开发环境概述

本课题使用的开发环境是基于Windows系统的Anaconda3以及Visual Studio Code 。利用Anaconda3自带的Python3.7.6版本,不需要额外下载Python便可完成该系统的功能开发。其中的Tensorflow框架使用的是1.13.1,因为最新版的2.xx版本部分功能无法使用。与此对应的Keras函数库的版本为2.2.4,这两个关键框架和函数库必须实现版本的对应,否则会发生异常,无法实现相应功能,具体对应版本号网上一搜索便可知晓。

人工神经网络概述

人工神经网络是以人类大脑为灵感,通过模仿人脑的神经网络的结构和功能,用于构造近似功能函数的计算模型。通过连接大量计算单元来模拟人脑神经元来进行计算。通常来说,人工神经网络可以不同数据来更改自己的参数,是一个自适应系统。通俗的说就是它具有学习功能。通过统计分析和概率预测,人工神经网络可以像人一样具有简单的决策能力和简单的判断能力。

人工神经网络的部分种类与原理介绍

现如今,可用于语音识别的神经网络也不断发展,深度学习兴起之前,已经有了非常成熟的模型系统,像高斯混合模型(GMM)和隐马尔可夫模型(HMM)都是早期发展的相对成熟的模型,深度学习兴起后,又出现了许多深层神经网络,如循环神经网络(RNN)、卷积神经网络(CNN)、长短期记忆网络(LSTM)、编码-解码框架等等,通过以下方法降低了传统声学模型的识别错误率,所以深度学习技术将成为语音识别的核心技术。

语音识别发展到现在,其实就是一个序列识别问题,因为声波是信号,所以我们也往往称其为音频信号。原始音频信号通常是由人声器官或语音采集设备带来的诸如静音片段,混叠,噪声和高次谐波失真等包含干扰因素的音频,这些干扰会在一定程度上影响语音信号的质量。 因此,在正式使用声学模型进行语音识别之前,我们要先对音频进行处理。预处理一般是将音频信号做重采样,降低音频的数据量,也降低信号中的干扰,之后的特征提取便是从音频信号中选择有效的音频表征的过程,常用的提取特征有两种,一个是线性预测倒谱系数(LPCC),另一个是梅尔频率倒谱系数(MFCC)。其中LPCC特征是根据声管模型建立的特征参数,并且是通道响应的特征表示。MFCC特征是基于人类听觉特征提取的特征参数,是人耳听力的特征表示,被多数人采用。由于本文直接使用librosa函数调用的mfcc特征提取,所以不需要自己去构造mfcc的实现方法。

完整的MFCC算法包括以下步骤:

(1)快速傅立叶变换(FFT)。

(2)梅尔频率换算。

(3)配置三角滤波器组并在对信号幅度频谱进行滤波后计算每个三角滤波器的输出。

(4)对所有滤波器输出执行对数运算,然后执行离散余弦变换(DTC)以获取MFCC。

语音识别的过去发展与研究证明,MFCC是一种有效的特征提取方法。

用于语音识别建模的最早的神经网络是最常见的深度神经网络(DNN)。传统的声学模型(例如GMM)在表征音频信号方面效率低下,但DNN可以在一定程度上解决这种效率低下的问题。但是,在实际建模中,由于音频信号是时间序列连续信号,而DNN需要固定大小的输入。因此,结合了HMM模型和DNN模型的DNN-HMM混合系统非常有效。

除DNN之外,CNN也被广泛应用于图像识别,但它也可以用于构建语音识别模型。当然,CNN通常与其他模型结合使用会有更好的效果。包括TDNN,CNN-DNN框架,DFCNN,CNN-LSTM-DNN(CLDNN)框架,CNN-DNN-LSTM(CDL)框架,如此众多基于CNN的混合模型框架在声学模型中取得了许多成果。

经过长期的研究和实践证明,基于深度学习的语音识别模型比基于浅层模型的传统模型能够更好的处理语音识别任务。语音识别的应用环境通常更为复杂。 选择一个可以处理各种情况的声学模型是工业界和学术界常用的建模方法。 但是单一模型有局限性。 HMM能够处理可变长度的语音信号,CNN擅长处理可变通道的信息,而RNN / CNN则能够处理可变的上下文信息。 在语音识别的建模中,混合模型是目前最主流的建模方法,并且由于结合了各种模型的优势而成为了这一段时间内的主流模型趋势。

人工神经网络的筛选

本课题由于是面向智能家居的语音识别控制,选择了CNN模型。为了提高识别正确率,以及尽量克服语音信号面临的复杂多样性,包括说话人(说话人本身和说话人)的多样性,环境的多样性等。卷积神经网络提供在时间和空间上平移不变卷积。将之于语音识别建模可以利用卷积不变性来克服语音信号本身的多样性。这样来看的话,可以认为通过分析整个语音信号而获得的时间频谱被视为图像,并被广泛用于图像中的CNN网络所识别。从实际的角度来看,CNN也相对容易实现大规模并行操作。尽管CNN卷积运算涉及许多小型矩阵运算,但运算速度非常慢。但是,CNN的加速计算相对成熟。有研究人员提出了一种可以将所有这些小的矩阵转换为一个大矩阵的乘积的技术。一些学习框架(例如Tensorflow)也提供CNN可通过GPU来实现加速处理,这使CNN能够用于语音识别。

语音识别概述

语音识别,其目标是就是让电脑将人类的语言自动转化为文字信息的过程,只有将自然语言转化为文字信息,才能让机器根据语音实现更多的功能。

语音识别的基本原理与结构

语音识别系统本质上是一种序列识别问题,包括对声音特征提取、模式匹配、参考训练好的模型的模式库等三个基本部分,它的基本结构如下图所示:

麦克风将未知声音转换为电信号,然后添加到识别系统的输入中。首先对其进行预处理,然后根据人类语音的特征建立语音模型,通过分析输入的声音信号并提取特征向量来训练模型。准备一些语音识别所需的模板数据。在识别过程中,计算机根据由训练得来的神经网络模型,将计算机中存储的语音模板的特征与输入的语音信号特征进行比较,并根据一定的搜索和匹配策略,找到该语音信号的最佳匹配。显然,这种最佳结果与功能的选择,是由语音模型的好坏以及模板数据的准确性决定的。

语音识别系统通常由训练和识别两部分组成。训练通常是离线进行的。对预先收集的大量语音和语言数据集进行处理和提取,以获得语音识别系统所需的神经网络模型。识别过程通常是在线完成的。用户输入语音,通过模型分析识别。识别过程通常可以分为“前端”和“后端”:“前端”模块的主要功能是执行语音加载,预处理等; “后端”模块的作用是使用神经网络模型,对用户语音的特征向量进行识别以获得包含在其中的文本信息。

语音识别的基本流程

语音识别工作流程图见图3-2。

语音识别系统模块设计

录音模块

录音主要函数参数说明

Sounddevice.rec()

1.samplerate表示录音的采样率。

2.duration表示录音时间。

3.channels表示录音输入声道数。

4.blocking表示录音完成后,立即返回。

录音所用函数

函数

功能

Sounddevice.rec()

录制音频

Sounddevice.wait()

检查录音是否完成,完成则返回,未完成则等待

Soundfile.write()

写入数据文件

录音的基本流程

先设置好录音的音频参数,设置好后利用函数dounddevice.rec()调用电脑麦克风开始录音,录音完成后利用soundfile.write函数将录音数据保存,录音过程至此结束。如图

数据预处理模块

预处理主要函数参数说明

Wav2mfcc()

1.wave表示音频的时间序列。

2.sr表示音频的采样率。

3.mono表示按单声道处理。

预处理所用函数

函数

功能

librosa.load()

读入音频文件

librosa.feature.mfcc()

提取声音的的mfcc特征

np.pad()

对特征数组进行填充

预处理的基本流程

先根据数据路径提取音频的标签,并将标签进行热编码。在导入音频,对音频进行下采样降低采样率,并提取mfcc特征。将处理好的音频标签和音频特征存入数组中,最后拆分数据集,一部分用于训练,一部分用于测试,至此预处理便完成了。如图

数据训练模块

数据训练主要函数参数说明

model.fit()

1.X_train表示训练数据的Numpy数组。

2.y_train_hot表示训练数据标签的Numpy数组。

3.batch_size表示每批训练的样本数大小。

4.epochs表示训练次数。

5.verbose表示日志显示模式,为1时输入进度条。

6.validation_data表示测试数据,用于评估模型。

数据训练所用函数

函数

功能

X_train.reshape()

将训练数据的Nupmy数组由1D转为2D

to_categorical()

将音频标签进行热编码

model.fit()

根据设定的参数对模型进行训练

数据训练的工作流程

设置好训练模型的参数模型,载入训练数据和标签,测试数据和标签,按照参数进行模型训练。

神经网络模型模块

神经网络模型主要函数参数说明

get_model()

1.Sequential表示模型为顺序模型,是多个网络层的线性叠加,按顺序执行。

2.Conv2D表示是一个2维卷积层。

3.kernel_size表示是一个2D卷积窗口的宽度和高度。

4.activation表示要使用的激活函数。

5.input_shape表示自己建立的模型大小。

6.MaxPooling2D表示池化层,进一步提取滤波器的特征值,将最大特征值保留。

7.Dropout表示丢弃部分神经元,防止模型过拟合。

8.Flatten表示将模型“压平”,即从多维化为一维。

9.Dense表示全连接层,对特征向量实现非线性组合,基于训练集进行特征分类。

神经网络模型所用函数

函数

功能

Sequential()

循序模型,模型按顺序执行每一层模型层

model.add(Conv2D())

添加2D卷积层,提取信息特征

model.add(MaxPooling2D())

添加池化层,进一步提取滤波器的特征,将最大特征作为保留

model.add(Dropout())

添加断开神经元层,防止模型过拟合

model.add(Flatten())

添加展平层,将多维数据变为一维数据。

model.add(Dense())

添加全连接层,对特征进行非线性组合,最后一层还将按照训练集数目进行特征分类。

神经网络模型的工作流程

神经网络的建立流程如图4-5。先选定模型的类别为顺序模型,顺序模型是指模型的每一层都按顺序执行,不会跳步执行或倒序执行,选定模型后便可开始添加模型层,每个模型层的功能不尽相同,具体如上方函数功能所示,最后根据激励函数,预测的最大概率的标签结果作为识别结果输出。

识别模块

声音识别主要函数参数说明

Predict()

1.filepath表示音频文件路径。

2.model表示识别所用的模型。

3.np.argmax表示提取模型预测最大概率的标签数组。

识别所用函数

函数

功能

predict()

提取音频的mfcc特征,放入模型,并根据模型找出最大概率的标签数组

load_model()

导入用来判断mfcc特征的模型

识别的基本流程

识别流程如图4-6。先定义好的识别函数,训练好的神经网络模型,然后将处理后的音频放入模型中,根据模型来进行识别,并将识别结果输出完成识别过程。

语音识别技术遇到的关键问题与解决

图5-4 声音频率

预处理部分问题与解决

预处理部分主要问题是音频标签的编码和音频特征的提取。

我先定义了一个获取音频标签的函数get_labels,用来提取数据集的音频标签,该函数能把文件夹的名字当作标签提取出来,并用to_categorical函数对标签进行编码,效果如下:

#定义一个拥有10个类型的向量:

b = [0,1,2,3,4,5,6,7,8,9]

#通过to_categorical函数对类别向量b进行处理:

b = to_categorical(b, 10)

#显示b

print(b)

之后定义一个提取音频特征的函数wav2mfcc,此函数会通过librosa读取音频,并将音频信号按照给定的采样率进行采样的结果作为返回值的第一部分,采样结果是一个一维的numpy数组,用于后面的分析。返回值的第二部分是采样率。再把返回值第一部分的采样结果进行下采样,减少采样值,方便后续模型计算。如果CNN的特征第二维向量大于mfcc长度的话,就把mfcc用0填充至CNN特征第二维向量的长度大小,如果小于,则切除其余部分,这样才可以将mfcc放入相应的CNN模型中。

再定义一个函数save_data_to_array,用于将音频和标签数据放入数组中,将每一个标签和对应的音频的特征向量mfcc存入数组,并存为.npy文件,用于之后的模型训练。

最后定义get_train_test函数,用于自动拆分数据集中的数据,将大部分作为训练数据,一小部分作为测试数据,通过测试,来查验模型的有效性。

到此,预处理便已经完成,之后的模型训练和识别音频就可以调用了。

如果对特征参数没概念,可利用librosa函数查看mfcc的图像。

图5-5 mfcc

可也显示mfcc的特征向量的数组

用激活函数softmax。

模型建立完成后,可用model.summary()查看模型结构

下

建立CNN模型后,对于训练数据的正确率接近于1,对于测试数据的正确率达90%以上。据此可以判断,这个卷积神经网络模型已经学会了这几种资料的语音辨识,能够成功的预测相应未知的语音信息,并且经过几次测试,均成功识别音频信息,虽然识别率受于种种限制无法达到此次识别成功的程度,不过大体上还是达到了实验的目标和要求。可以说明机器成功学习到了语音识别的内容,能够通过语音对电子设备进行语音控制了。