一、SVM语音情感识别简介

0 引 言

语音情感识别是当前研究热点,在人机交互(Human-Computer Interaction,HCI)领域的应用价值日益突显。在今天的HCI系统中,机器可以通过扬声器和语音识别系统知道谁在说话以及他或她在说什么。当机器配备语音情感识别技术时,他们可以知道他或她的说话方式。为了实现这一目标,计算机必须能够感知其现状并根据这种感知作出不同的反应。此过程的一部分涉及了解用户的情绪状态。为了使人机交互更自然,让计算机能够以与人类相同的方式识别情绪情况是有益的。

在人机交互领域,言语是情绪识别系统目标的主要内容,面部表情和手势也是如此。语音被认为是一种与意图和情感交流的强有力模式。近年来,许多研究人员对使用语音信息识别人类情感做了大量研究,并探索了几种分类方法,包括神经网络、高斯混合模型(Gaussian Mixture Model,GMM)、隐马尔可夫模型(Hidden Markov Model,HMM)、最大似然贝叶斯分类器(Maximum Likelihood Classification,MLC)、核回归和K近邻(k-Nearest Neighbor,KNN)、支持向量机(SVM)。文献提出一种基于多分类器集成的语音情感识别新算法。首先提取情感语音的韵律特征、音质特征和MFCC特征参数,然后将径向基神经网络、K近邻法和贝叶斯网络三种分类器构成集成分类器,实现对柏林情感语言数据库中7种主要情感类型的识别。文献采用二叉树结构设计多分类器,使用半定规划法求解并构造多核SVM分类模型,并采用均方根误差与最大误差对分类器性能进行衡量。对特征选择之后的参数集合进行了测试,其有效减少误差积累和降低情感状态之间混淆程度。文献在传统SVM方法的基础上,提出了一种基于主成分分析法的多级SVM情感分类算法。首先将容易区分的情感分开,针对混淆度大且不能再利用多级分类策略直接进行区分的情感,采用PCA进行特征降维,逐级判断出输入语音所属的情感类型。

为了进一步提高语音情感识别精度,本文设计了一种基于MFCC特征提取和SVM的语音情感数据挖掘分类识别方法。SVM是过去十年由Vapnik在1995年开发的监督学习算法。该算法解决了学习区分给定类n维向量的正负成员的一般问题。SVM用作情感识别的分类器,通过构建N维超平面来执行分类,该超平面最佳地将数据分成类别。通过数据集输入特征空间中的线性或非线性分离表面来实现分类。实验结果证明了本文提出的基于MFCC特征提取和SVM的语音情感数据挖掘分类识别方法的有效性。

1 语音情感

1.1 语 音

语音感知指的是人类能够解释和理解语言中使用的声音的过程。言语感知的研究与语言学和认知心理学中的语音学、音韵学以及心理学中的感知密切相关。语音感知研究旨在了解人类听众如何识别语音并使用这些信息来理解口语。语音研究可用于构建能够识别语音的计算机系统,以及改善听力和语言障碍听众的语音识别。

语音信号通常被视为有声或无声,浊音包括基频(F0)及其由声带产生的谐波分量。声道修改了这个激励信号,导致共振峰(极点),有时还有反共振荡(零)频率。每个共振峰频率具有幅度和带宽,并且有时可能难以正确地定义这些参数中的一些。基频和共振峰频率可能是语音合成和语音处理中最重要的概念。在清音中,激励信号没有基频,因此也没有谐波结构,激励可以被认为是白噪声。气流被迫通过声道收缩,这可能发生在声门和嘴之间的几个地方。一些声音是在完全停止气流然后突然释放的情况下产生的。清音也通常比浊音更安静,更不稳定。悄悄话是言语的特例。当低声说出浊音时,在激发中没有基本频率,并且感知由声道产生的第一共振峰频率。

音节是一系列语音的组织单位。例如,水一词由两个音节组成,音节通常被认为是单词的语音“构建块”。韵律是言语的节奏、压力和语调。韵律反映了说话者的情绪状态;一个话语是一个陈述、一个问题还是一个命令;说话者是讽刺还是强调,对比还是专注;可能无法用语法编码的其他语言元素。韵律包括音高、强度和持续时间,以及语音质量和关键特征。以下功能可以处理语音质量:共振峰均值和带宽,谐波噪声比,MFCC系数。响度是声音的质量,是物理力量(振幅)的主要心理关联。响度感与声压级和声音持续时间有关。音高表示声音的感知基频,它是声音和响度的三个主要听觉属性之一。周期信号的基频(也称为固有频率)是基音周期长度的倒数。音调周期是术语,是信号的最小重复单位。因此,一个音调周期完全描述了周期信号。

1.2 情 感

情绪是一个与各种各样的情感、思想和行为相关的心理和生理状态的术语。情绪是主观体验或个人角度的体验。一种特殊的情绪可持续数天,甚至持续数月或数年。人类的情感可以是不同的类型,如愤怒、快乐、悲伤、中立、恐惧、厌恶、惊讶、害羞、无聊等。情绪的研究是在很长一段时间内进行的。这项研究有助于心理学、社会学、犯罪学、生理学等领域。研究人员经常使用自主反应来衡量情绪。一种常用的自主反应为皮肤电反应。皮肤电反应是皮肤导电率的增加,当受试者在情绪状态下出汗时会发生这种情况。研究人员还使用血压、肌肉紧张度、心率和呼吸率等指标来衡量情绪。

2 系统实施

情感在人与人之间互动中的重要性为工程和计算机科学界的研究人员提供了开发计算机识别情感的自动方法的基础。系统的输入是来自柏林情感数据库的.wav文件,其包含来自不同情绪类别的情绪语音话语。在特征提取过程中,MFCC和MEDC两个特征被提取。将提取的特征及其对应的类标签作为LIBSVM分类器的输入。分类器的输出是特定情绪类的标签。总共有五个标签分别为生气、悲伤、快乐、中立和恐惧。每个标签代表相应的情绪类别。

2.1 特征提取

在先前的工作中,提取了若干特征用于对诸如能量、音调、共振峰频率等的语音影响进行分类。第一步要采集语音信号,并进行预处理。所有这些都是韵律特征。一般而言,韵律特征是说话者情绪状态的主要指标。这里在特征提取过程中提取了两个特征:MFCC和MEDC。

MFCC由Stevens、Volkman和Newman在1937年提出。它是由听众判断的彼此距离相等的感知音阶。Mel是感知音调或音调频率的度量单位。此刻度和正常频率测量之间的参考点通过将1 000 Hz音调等于听众阈值40 dB,音高为1 000 mels来定义。在大约500 Hz以上,听众判断越来越大的间隔以产生相等的音高增量。最终,在500 Hz以上的赫兹音阶上的四个八度音阶被判断为在音阶上包括大约两个八度音阶。梅尔尺度在1 kHz以下近似线性并且在上面对数。以下公式用于计算给定频率f的赫兹(以Hz为单位)。MFCC抗噪能力强,其频率与声音的实际频率f的关系为:

Mel(f)=2 595lg(1+f/700) (1)

语音情感识别的MFCC特征提取过程为:

(1) 以采样频率对连续时间信号(语音)进行采样。在MFCC的第一阶段,特征提取是为了增加高频中的能量。这个预加重是通过使用滤波器完成的。预加重数字滤波器为:

H(Z)=1-αZ-1 (2)

式中:α表示预加重系数。

(2) 对语音信号进行分帧,并提取语音信号的短时特性。它是将从模数转换(ADC)获得的语音样本分割成时间长度在2 040 ms范围内的小帧的过程。成帧使得非静止语音信号能够被分段为准静态帧,并且能够对语音信号进行傅里叶变换。这是因为,已知语音信号在20~40 ms的短时间内表现出准静态行为。采用加汉明窗平滑语音信号:

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_算法

(3) 加窗。加窗步骤用于窗口化每个单独的帧,以便最小化每帧开始和结束时的信号不连续性。

(4) 将快速傅里叶变换(FFT)算法理想地用于评估语音的频谱。FFT将N个样本的每个帧从时域转换到频域。用离散傅里叶变换得到语音信号的线性频谱:

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_特征提取_02

(5) 通过Mel频率滤波器提取频谱、Mel滤波器组和频率包络。Mel滤波器组由重叠的三角滤波器组成,截止频率由两个相邻滤波器的中心频率确定。滤波器具有线性间隔的中心频率和梅尔标度上的固定带宽。Mel频率滤波器设计如下:

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_语音信号_03

式中:p为滤波器的个数。

(6) 对Mel频谱取对数,对数具有将乘法变为加法的效果。因此,该步骤简单地将傅里叶变换中的幅度的乘法转换为加法,得到对数频谱S§,其传递函数为:

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_matlab_04

(7) 采用离散余弦变换:它用于使滤波器能量矢量正交化。由于该正交化步骤,滤波器能量矢量的信息被压缩成第一数量的分量并且将矢量缩短为分量数量。对S§进行离散余弦变换得到MFCC参数c(n)为:

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_语音信号_05

(8) 计算MFCC的最大值、最小值、标准差。

图1显示了MFCC特征提取过程。MFCC技术使用两种类型的滤波器,即线性间隔滤波器和对数间隔滤波器。

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_开发语言_06

图1 MFCC特征提取过程

Mel能量谱动态系数(MEDC)的特征提取过程如图2所示。使用FFT估计每个语音话语的幅度谱,然后输入到12个滤波器组,计算滤波器输出的对数平均能量En(i),i=1,2,…,n。然后,计算En(i)的第一和第二差值。

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_matlab_07

图2 MEDC特征提取过程

(1) MEDC特征提取的预处理、成帧、窗口化、FFT和Mel滤波器组和频率包装过程与MFCC特征提取相同。

(2) 取能量的对数平均值,在此过程中计算每个滤波器能量的平均对数。该平均值表示滤波器组中的各个滤波器的能量。

(3) 计算第一和第二差异,然后通过组合滤波器能量的第一和第二差异来获得最终的Mel能谱动力学系数。

2.2 数据挖掘功能标签与SVM训练分类

在功能标签中,每个提取的功能与其类标签一起存储在数据库中。虽然SVM是二元分类器,但它也可以用于分类多个类。每个功能都与其类标签相关联,例如:生气、快乐、悲伤、中立、恐惧。

SVM根据标记的特征进行训练。SVM内核函数用于SVM的训练过程。二进制分类可以视为在特征空间中分离类的任务。SVM是二进制分类器,但它也可以用作多类分类器。LIBSVM是由C.J.Lin开发的用于SVM分类和回归的最广泛使用的工具。径向基函数(Radical Basis Function,RBF)内核用于训练阶段。使用RBF内核的优点是它将训练数据限制在指定的边界内。RBF内核将样本非线性地映射到更高维空间,因此,与线性内核不同,它可以处理类标签和属性之间的关系是非线性的情况。RBF内核比多项式内核具有更少的数值困难。SVM分类的结果以混淆矩阵表的形式给出。混淆矩阵表示给定类的准确分类和错误分类的百分比。

二分类原理如图3所示。

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_特征提取_08

图3 支持向量机的二分类原理

设语音情感识别的训练样本数据为:{xi,yi},xi∈Rn,i=1,2,…,n,xi为情感识别的特征向量,yi为情感的类别,SVM利用非线性映射Φ(x)将训练集映射到高维空间,使非线性问题线性的最优分类面描述为:

y=ωTΦ(x)+b (8)

式中:ω和b表示SVM的权值和偏向量。

必须找到最优的ω和b,对式(8)无法直接求解,因此要找到最优分类面,于是引入松弛因子ξi对式(8)进行变换,得到其二次优化问题,即:

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_开发语言_09

式中:C表示惩罚参数。通过引入拉格朗日乘子对式(9)进行变换,则有:

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_语音信号_10

权向量ω的计算公式为:

ω=∑αiyiΦ(xi)·Φ(x) (11)

支持向量机的分类决策函数可以描述为:

f(x)=sgn(αiyiΦ(xi)·Φ(xj)+b) (12)

为了降低计算复杂度,简化运算,引入核函数k(x,xi),以k(x,xi)代替点积椎Φ(xi)·Φ(xj),式(12)变为:

f(x)=sgn(αiyik(x,xi)+b) (13)

在众多核函数中,采用RBF作为支持向量机核函数,这是因为RBF的通用性好,参数少,式(12)变为:

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_开发语言_11

式中:σ表示RBF的宽度参数。

二、部分源代码

function varargout = main(varargin)
% MAIN MATLAB code for main.fig
% MAIN, by itself, creates a new MAIN or raises the existing
% singleton*.
%
% H = MAIN returns the handle to a new MAIN or the handle to
% the existing singleton*.
%
% MAIN('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in MAIN.M with the given input arguments.
%
% MAIN('Property','Value',...) creates a new MAIN or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before main_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to main_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help main

% Last Modified by GUIDE v2.5 12-Apr-2020 14:35:36

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @main_OpeningFcn, ...
'gui_OutputFcn', @main_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before main is made visible.
function main_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to main (see VARARGIN)

% Choose default command line output for main
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes main wait for user response (see UIRESUME)
% uiwait(handles.figure1);
ha=axes('units','normalized','pos',[0 0 1 1]);
uistack(ha,'down');
ii=imread('背景.jpg');
image(ii);
colormap gray
set(ha,'handlevisibility','off','visible','on');

% --- Outputs from this function are returned to the command line.
function varargout = main_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
close
gui

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
close

三、运行结果

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_算法_12

【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】_开发语言_13

四、matlab版本及参考文献

1 matlab版本

2019

2 参考文献

[1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019.

[2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,2019.

[3]张钰莎,蒋盛益.基于MFCC特征提取和改进SVM的语音情感数据挖掘分类识别方法研究.[J]计算机应用与软件. 2020,37(08)