👨🎓个人主页:研学社的博客
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
语音是人们传递信息内容的同时又表达情感态度的媒介,语音情感识别是人机交互的重要组成部分。
KNN(K- Nearest Neighbor)法即K最邻近法,最初由 Cover和Hart于1968年提出,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路非常简单直观:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别 。
基于K近邻分类算法的语音情感识别
语音情感识别是语音识别中的一个重要分支,旨在通过分析语音信号来识别说话者的情感状态。K近邻(K-Nearest Neighbors, KNN)分类算法由于其简单有效的特性,常用于这一领域。以下是基于K近邻分类算法的语音情感识别的详细介绍:
K近邻分类算法概述
原理
K近邻算法是一种非参数的监督学习方法,主要用于分类和回归问题。其基本思想是通过计算待分类样本与已标记样本之间的距离,选择距离最近的K个邻居,根据这些邻居的类别进行投票,最终决定待分类样本的类别。
关键步骤
1. **数据预处理**:将语音信号转化为特征向量,如梅尔频率倒谱系数(MFCC)、音高、能量等。
2. **距离度量**:常用的距离度量方法包括欧氏距离、曼哈顿距离和余弦相似度。
3. **选择K值**:K值的选择对分类结果有重要影响,通常通过交叉验证确定最优K值。
4. **分类决策**:计算待分类样本与训练样本的距离,选择最近的K个邻居,通过多数表决或加权投票确定分类结果。
语音情感识别流程
数据预处理
1. **语音信号采集**:从语音数据库或实时录音中获取语音信号。
2. **特征提取**:对语音信号进行分帧,提取每一帧的特征参数,如MFCC、音高、能量、零交叉率等。
3. **特征归一化**:对提取的特征进行归一化处理,以消除不同特征之间的量纲差异。
模型训练
1. **特征选择**:从预处理后的特征集中选择对情感识别最有用的特征,减少计算量并提高分类性能。
2. **训练样本集**:构建包含不同情感类别的训练样本集,每个样本由特征向量和情感标签组成。
3. **选择K值**:通过交叉验证或经验方法选择最优的K值。
模型测试与评估
1. **距离计算**:对待分类样本,计算其与训练样本集中所有样本的距离。
2. **K近邻选择**:选择距离最小的K个邻居。
3. **情感分类**:通过多数表决或加权投票确定待分类样本的情感类别。
4. **评估指标**:使用准确率、精确率、召回率和F1-score等指标评估分类模型的性能。
优势与挑战
优势
- **简单易实现**:KNN算法实现简单,不需要大量的参数调节。
- **适用性强**:可以处理任意数量的分类问题,特别适合小数据集。
- **非线性分类**:能够处理非线性边界的分类问题。
挑战
- **计算复杂度高**:对于大规模数据集,计算待分类样本与所有训练样本的距离计算量大。
- **敏感度高**:对噪声和异常值敏感,可能影响分类效果。
- **维数灾难**:在高维空间中,计算距离的效率和准确性下降。
未来研究方向
1. **特征优化**:进一步优化语音特征的选择和提取方法,提高分类的准确性和鲁棒性。
2. **距离度量改进**:研究更加有效的距离度量方法,以适应不同情感类别的分布特性。
3. **K值自适应调整**:开发自适应K值选择算法,根据具体数据集动态调整K值,提高分类效果。
4. **结合其他算法**:将KNN与其他机器学习算法(如SVM、神经网络)结合,构建更为复杂和高效的情感识别模型。
通过不断优化和改进,基于K近邻分类算法的语音情感识别可以在语音交互、智能助手、心理健康监测等领域发挥重要作用,提供更自然和人性化的用户体验。
📚2 运行结果
部分代码:
%情感特征提取函数
function feature=featvector(filename)
[y,fs]=wavread(filename);
L=length(y);
ys=y;
for i=1:(length(y)-1)
if (abs(y(i))<1e-3) % 剔除较小值,计算短时能量时使用 %
ys(i)=ys(i+1);
L=L-1;
end
end
y1=ys(1:L);
s=enframe(y,hamming(256),128); % 分帧加窗 %
s1=enframe(y1,hamming(256),128);
[nframe,framesize]=size(s);
[nframe1,framesize1]=size(s1);
E=zeros(1,nframe1);
Z=zeros(1,nframe);
F=zeros(1,nframe);
for i=1:nframe
Z(i)=sum(abs(sign(s(i,framesize:2)-s(i,framesize-1:1))))/2; % 过零率 %
end
for i=1:nframe1
E(i)=sum(s1(i,:).*s1(i,:)); % 短时能量 %
end
% 基音频率 %
N=2048;R=4;
for i=1:nframe
k = 1:R:N/2; K = length(k); % N是FFT变换点数,R是乘的次数,f是采样频率 %
X = fft (s(i,:), N);
X=abs(X); % 对X做绝对值,取到幅度 %
HPSx = X(k);
for r= R-1:-1:1
HPSx = HPSx.*X (1:r:r*K);
end
[~,I]=max(HPSx); % 取最大值点,I是对应下标 %
F(i)=I/N*fs; % 基音频率 %
end
% 浊音帧差分基音 %
nf=1;
for i=1:(nframe-1)
if(F(i)*F(i+1)~=0)
dF(nf)=F(i)-F(i+1);
nf=nf+1;
end
end
% 0-250hz所占比例 %
[s2,f1,t1]=specgram(y1,256,fs);
sn=20*log10(abs(s2)+eps);
sn1=sn+min(sn(:));
n=round(length(f1)*250/max(f1(:)));
Eratio=sum(sum(sn1(1:n,:)))/sum(sn1(:));
% 估计共振峰 %
[fm,~] = formant_get(y,fs);
Fm1=fm(:,1);
Fm2=fm(:,2);
Fm3=fm(:,3);
% MFCC %
MFCCs=melcepst(y,fs,'0d'); % MFCC及其一阶差分系数 %
%% 特征向量构成 %%
% 短时能量E %
dim_max=141;
feature=zeros(dim_max,1);
x=0;t=0;
for i=1:(nframe1-1)
t=abs(E(i)-E(i+1))/(nframe1-1);
x=x+t;
end
E_shimmer=x/mean(E);
x1=0;x2=0;x3=0;x4=0;
for i=1:nframe1
t1=i*mean(E);t2=i*E(i); t3=i*i;t4=i;
x1=x1+t1;x2=x2+t2;x3=x3+t3;x4=x4+t4;
end
x4=x4*x4/nframe1;
s1=x2-x1;s2=x3-x4;
E_Reg_coff=s1/s2;
x=0;
for i=1:nframe1
t=E(i)-(mean(E)-s1/s2*x4/nframe1)-s1/s2*i;
x=x+t^2/nframe1;
end
E_Sqr_Err=x;
feature(1:7,1)=[max(E);min(E);mean(E);var(E);E_shimmer;E_Reg_coff;E_Sqr_Err];% 短时能量相关特征 %
% 能量比 %
feature(8,1)=Eratio;
% 基音频率F %
x=0;
for i=1:(nframe-1)
t=abs(F(i)-F(i+1));
x=x+t;
end
F_Jitter1=100*x/(mean(F)*(nframe-1));
x=0;
for i=2:(nframe-1)
t=abs(2*F(i)-F(i+1)-F(i-1));
x=x+t;
end
F_Jitter2=100*x/(mean(F)*(nframe-2));
%% 使F得最小值是有效(去除等值)
k=1;
for i=2:numel(F)
if(F(i)==F(1))
continue;
end
FF(k)= F(i);
k=k+1;
end
feature(9:14,1)=[max(F);min(FF);mean(F);var(F);F_Jitter1;F_Jitter2];% 基音频率相关特征 %
% 浊音帧差分基音 %
feature(15:18,1)=[max(dF);min(dF);mean(dF);var(dF)];% 浊音帧差分基音 %
% 共振峰 %
x1=0;x2=0;x3=0;
for i=1:(numel(Fm1)-1)
t1=abs(Fm1(i)-Fm1(i+1));
t2=abs(Fm2(i)-Fm2(i+1));
t3=abs(Fm3(i)-Fm3(i+1));
x1=x1+t1;x2=x2+t2;x3=x3+t3;
end
Fm1_Jitter1=100*x1/(mean(Fm1)*(numel(Fm1)-1));% 前三个共振峰的一阶抖动 %
Fm2_Jitter1=100*x2/(mean(Fm2)*(numel(Fm1)-1));
Fm3_Jitter1=100*x3/(mean(Fm2)*(numel(Fm1)-1));
Fm2R=Fm2./(Fm2-Fm1);
nFm=[max(Fm1);min(Fm1);mean(Fm1);var(Fm1);Fm1_Jitter1;max(Fm2);min(Fm2);mean(Fm2);var(Fm2);Fm2_Jitter1;max(Fm3);min(Fm3);mean(Fm3);var(Fm3);Fm3_Jitter1;max(Fm2R);min(Fm2R);mean(Fm2R)];% 共振峰相关特征 %
feature(19:(size(nFm)+19),1)=nFm;
for i=1:size(MFCCs,2)
feature(37+4*(i-1):37+4*i-1,1)=[max(MFCCs(:,i));min(MFCCs(:,i));mean(MFCCs(:,i));var(MFCCs(:,i))];% mel倒谱系数及其一阶差分相关特征 %
end
🎉3 参考文献
部分理论来源于网络,如有侵权请联系删除。
[1]罗德虎,冉启武,杨超,豆旺.语音情感识别研究综述[J].计算机工程与应用,2022,58(21):40-52.
[2]纪正飚,王吉林,赵力.基于模糊K近邻的语音情感识别[J].微电子学与计算机, 2015(3):4.DOI:CNKI:SUN:WXYJ.0.2015-03-014.
[3]朱芳枚.面向语音情感识别的深度学习算法研究[D].东南大学[2024-06-24].