赵 莉 付世凤
(湖南信息职业技术学院,湖南 长沙 410083)
声纹是携带语音特征信息的图谱,具有特定性且蕴含丰富的个人信息,因为其具有伪造难度高、辨识性强等特点,所以常用于身份识别领域[1]。随着人工智能等技术的发展,声纹识别的准确性、及时性得到提高,声纹识别技术广泛应用于军事、金融等领域。语音作为日常交流的主要媒介,可以传达思想,还可以表达说话人的情感状态,其中传达的语义内容、说话音量的高低都反映人们的情绪。语音情感识别就是对隐藏在语音中的信息进行分析和挖掘,识别其情感趋向(高兴、伤悲)或者得出其观点是“赞同”还是“反对”,甚至还可以得出情感随时间的演化规律,情感识别的结果可以作为重要的决策依据。例如,在医疗保健系统中,可以将其作为心理分析的工具;在人机交互系统中,可以以此为依据精确把握用户需求;在教育行业,可以根据情感识别结果对青少年的心理问题进行干预。综上所述,语音情感识别具有广泛的应用前景[2]。
语音情感识别的目标是从语音中识别人的情感状态,需要从语音信号中提取语音特征,从而对语音情感分类模型进行训练,分类模型训练好后就可以识别语音的情感类别,语音情感识别主要包括语音特征提取、分类模型训练以及语音情感类别预测3个阶段。
首先,语音特征提取的起点是采集样本音频,其目的是将原始的语音模拟信号转化为语音信号数字形式。其次,经过分帧、加窗以及短时傅里叶变换等标准化处理后,得到高/中/低频幅度相当的语音帧序列。再次,标注预先定义好的情绪类别标签,并提取MFCC特征数学矩阵[3],将数学矩阵与情绪类别标签绑定形成数据集合,再将集合转换为特征数学矩阵,这样就可以从特征数学矩阵中逐一读取行向量作为语音情感分类模型的输入,从而对分类模型进行训练。最后,为了对训练好的分类模型进行评估验证,还要按一定比例将数学矩阵划分为训练集和验证集(训练集模型训练,验证集模型评估),具体过程如图1所示。
图1 语音特征提取过程
语音信号属于连续的模拟信号,需要对原始信号进行采样,采样原理如下:按照一定频率对连续模拟量进行电压数值抽取,抽取频率也就是采样频率,根据声波波形对采样所得的电压波形进行数字化处理,将离散数值分级量化为对应的数字信号,由于获取的语音信号通常都有噪声,因此还需要通过滤波处理来过滤噪声,这样语音信号就转化为时间轴上离散、幅度连续的无噪信号[3]。
语音信号在一个长的时间段内是变化的,但是在一个极短的时间段,其是接近稳定不变的,可以将语音信号分割成若干帧,每帧的时间长度约为20 ms~30 ms,这样每帧的语音信号都是稳定的,为了让处理后的语音信号与实际语音信号接近,还需要加上帧移,分帧后语音信号变成有限信号,语音信号音频谱波形会随时间而变化,语音信号特征在较短的时间内不会发生变化,但是在较长时段内语音信号特征是会发生变化的,因此需要在相邻两帧之间预留重叠部分,以保证音频谱波形能够平滑过渡,分帧后还要通过添加1个窗函数来进行加窗处理。加窗使用的窗函数一般有矩形窗以及汉明窗,矩形窗函数、汉明窗函数如公式(1)、公式(2)所示。
式中:w(n)为加窗函数;M为矩形窗长度;n为0~M的整数;N为汉明窗长度,也是傅里叶变换长度。
卷积神经网络属于前馈神经网络,是一种经典的深度学习架构,一个卷积神经网络通常包括输入层、中间层(卷积层、采样层和全连接层)和输出层。卷积层负责特征提取,采样层负责特征选择,全连接层负责根据特征进行语音情感分类。对输入向量和卷积层中的卷积核进行卷积计算,完成特征提取后,通过下采样函数在采样层进行降维运算,以完成特征选择任务,最后在全连接层将前面提取到的所有特征矩阵转化为一维的特征大向量,全连接层在卷积神经网络结构中的最后,并对语音情感进行分类。一般全连接层的参数是最多的,中间层的每层都由二维平面组成,每个二维平面都包括若干个神经元节点[3],采样神经元系统大部分的计算量都集中在卷积层,是整个卷积神经网络中最重要的部分,通过卷积计算可以提取各种情感语谱图中的声纹特征(为后续的分类处理奠定基础)。卷积神经网络模型的具体结构如图2所示。
图2 卷积神经网络的结构图
卷积神经网络的训练属于有监督学习,它的工作原理与普通神经网络类似,是通过学习训练集中输入向量和输出向量之间的映射关系得到端到端的分类模型,模型的训练可细分为前向传播阶段和反向传播阶段[4]。
前向传播阶段从训练集中逐一选取样本并输入网络,在输入层经过逐级变换传至输出层,从而得到相应的实际输出[4]。
对卷积层来说,一个卷积核(滤波器)与前一层的特征数据进行卷积计算,卷积计算的形式如公式(3)、公式(4)所示。
对采样层来说,对上一层卷积操作得到的特征图进行采样降维处理(减少特征的维度),一般会在不影响训练效果的情况下尽可能减少网络训练过程中的计算量,从而达到提高训练速度的目的,也在一定程度上避免了训练过程中的过拟合现象,具体计算如公式(5)所示。
对全连接层(第l层)来说,其输入为第l-1的输出,经过激活函数处理后,得到的输出如公式(6)所示。
式中:xl为全连接层输出;(σ)为全连接层的激活函数;wl为全连接层权值;bl为全连接层偏置;xl-1为第l-1层的输出。
对输出层(第L层)来说,其输入为第L-1层的输出,经过激活函数Softmax处理后,得到的输出如公式(7)所示。
反向传播阶段的关键是根据预测输出和实际输出之间误差来调整各个神经元权值和偏置,新的值不断迭代旧的值,直到迭代后某次误差损失足够小就可以停止,具体思路如下:1) 初始化各神经元权值和偏置。2) 读取训练集样本中的输入向量和目标输出向量。3) 计算中间层和输出层神经元的输出。4) 计算目标输出和实际输出的偏差e。5)判定偏差e是否小于阈值。6) 判定结果为否,进入步骤七,判定结果为是,结束训练。7) 计算各神经元误差。8) 计算误差敏感度。9) 更新权值和偏置,回到步骤三。具体过程如图3所示。
图3 反向传播阶段权值和偏置更新过程
各个神经元权值和偏置修正的变化率都是不同的,为了方便计算和理解,可以定义一个中间项(误差敏感度δ),也是反向传播反回神经元的灵敏度,可以反映每个神经元的相对基的变化率,输出层(第L层)的神经元的误差敏感度如公式(8)所示。
式中:δL为输出层的误差敏感度;f'为激励函数的导函数的值;uL为输出层经过线性处理后的结果;y为输出层实际输出;o为输出层的预测输出。
通过求导可以得到其他各层的误差敏感度,利用梯度下降方法对权值和偏置进行修正[4],可以使用损失函数衡量误差,将损失函数记为J,具体计算如公式(9)、公式(10)所示。
式中:bl为第l层偏置;η为学习率;∆b为偏置的更新值;为损失函数对偏置求偏导;wl为第l层的权值;η为学习率;∆w为权值的更新值;为损失函数对权值求偏导。
全连接层的反向求导过程如公式(11)、公式(12)所示。
当接采样层的下一层为卷积层时,该采样层的误差敏感度如公式(13)所示。
当接卷积层的下一层为采样层时,该卷积层的误差敏感度如公式(14)所示。
在卷积神经网络的最后一层,通常使用Softmax分类器对语音情绪进行分类。具体可以通过Softmax函数求解并统计所有向量x属于类别j的条件概率p(y=j∣x),其中1≤j≤N条如果j为1~N的整数k时条件概率最大,即认为向量x为分类为类别k,这样就将分类问题转化为条件概率问题,如公式(15)所示。
式中:p(y=j|x)为样本向量x属于第j个类别的概率;K为线性函数的个数;wj为类别j的权值。
在Tensorflow框架中对多个MFCC特征矩阵和音频样本进行训练。试验过程如下:1) 使用Python读取样本音频文件,调用FFmpeg、liborosa等工具包中的相关方法读取音频文件的MFCC特征矩阵以及音频文件的标注信息,并将读取的数据存入数据集。2) 打乱数据集,这样可以让数据集中的数据随机排列,防止因数据分布不均匀而对结果造成不良影响,按照7∶3的比例,将数据集分为训练集和验证集。3) 增加输入层,并定义输入层的数据的维度。4) 增加若干中间层(包括卷积层、采样层等),并指定中间层激活函数(中间层激活函数一般使用ReLU等),指定中间层Dropout参数(防止过拟合),中间层的层数根据需要调整。5) 增加平化层。6) 增加全连接层,并在全连接层定义l1、l2等正则项参数,防止过拟合。增加全连接层的激活函数(一般使用Softmax)。7) 定义收敛方法以及收敛方法所含参数(收敛方法主要包括RMSProp以及Adam等,收敛方法所含参数主要包括学习率)。8) 定义损失函数(主要包括categorical_crossentropy、binary_crossentropy等)。9) 配置其他次要参数,并按照指定轮次开始训练。在训练过程中,Tensorflow框架会在每个轮次用验证集去验证并记录相关数据。10) 训练完成,生成模型文件以及相关中间数据。读取中间数据并评估模型是否符合要求、是否发生过拟合,网络设置是否不当,数据集是否有问题。如果模型不符合要求,就修改上述训练过程中的激活函数、训练轮次等参数和网络配置(例如中间层层数),重新训练,直到产生符合提交件语音情绪分类模型为止。具体结果见表1。
表1 神经网络模型评估结果
该文采用Tensorflow框架进行训练,从而得到音频辅助识别预测模型,基于所述情绪分析模型通过程序脚本自动处理加人工辅助处理的方式对测试集上的样本进行评估验证,得到所述测试样本的分析结果,比较所述分析结果和所述测试样本的情绪类别标签是否一致,如果不一致,那么判断所述测试样本数据和对应的情绪类别标签是否准确,如果所述测试样本数据不准确,就舍弃所述测试样本;如果所述测试样本对应的情绪类别标签不准确,就重新标注标签,并将重新标注标签后的测试样本放入训练集。在训练过程中不断调整Tensorflow训练参数(包括激活函数、中间层层数以及训练轮次等),重新对调整后的训练集和参数进行训练,直到测试集上样本的准确率满足设定阈值。验证发现,当训练轮次为1000轮、中间层层数为6层且激活函数选择ELU 时,判定准确率较高。