项目已免费开源:https://gitee.com/zhengzsj/automatic-speech-recognition–ars/tree/master

1、技术路线

2、实现过程

  层次聚类和K-means聚类的样本是0-9语音每个数字各5个,分类时加入一个新录入的语音与之前的50个样本进行分类,并与10个K-means聚类求出的质心求距离,在通过实验确定的阈值约束下,选取最小值进行分类,如果最小值大于阈值则显示无法识别。
    语音预处理和提取MFCC参数矩阵在这里不再赘述,求出MFCC矩阵之后对行取平均值,即对所有帧的MFCC参数求取平均,为简化运算和消除高频与低频噪音的影响,取第2-20个MFCC参数作为聚类样本,因此高维数据变成1*18维数据,可直接进行层次聚类和K-means聚类,层次聚类和K-means聚类都直接调用MATLAB提供的函数,求距离用欧氏距离。

3、聚类、分类效果

  从图中可以看出层次聚类效果很不错,数字相近的5个样本属于同一个数,即相同颜色的数据聚类成同一类,聚类正确率可达87.96%,同时录音‘5’(第51号文件)进行分类,确实与聚类成5的一组分类在一起,分类正确,但多次实验验证分类正确率并不高,最高只能达到30%左右。

4、GUI界面

  聚类、分类GUI界面如下,左边‘开始’、‘停止’可输入语音,中间坐标轴可视化层次聚类结果和输入语音分类结果,下边显示与K-means聚类质心进行分类的结果。同时作为服务机,可以接受客户机发送到数据并显示到下方聚类结果显示栏,同时电子音一一播放接收的数据,可清除聚类结果显示栏和坐标。

5、结果与结论

( 1)当说0时,层次聚类后分类效果不错,其与K-means聚类质心距离和质心间的距离如表1、表2。


  实验确定样本与质心间距离阈值为500,确实样本‘0’与数字‘0’质心间距离很小,只有88.85,但样本与所有质点间的距离都比较小,而质心间的类间距特别大,聚类数据间的类间距也特别大,样本与质心间的类内距很小,但样本与其他质心间的类间距也很小,这可能也是分类准确率不高的一个原因。除此之外,求平均的数据降维方式过于简单、粗暴,可能损失了大量有效信息,也是影响分类效果的很大原因。

表1 样本‘0’与10个质心DTW距离

注:第i列代表样本‘0’与数字‘i’的质心间的距离。红色为最大值,绿色为最小值。

表2 K-means聚类10个质心间DTW距离(类间差)

注:i行j列代表数字‘i’质心与数字‘j’质心的距离。红色为最大值,绿色为最小值。
( 2)0-9数字模板匹配识别和聚类、分类识别对比
  时间上来说模板匹配和聚类差不多,但由于模板匹配的正确率高很多,最后选用模板匹配的方式进行数字识别。但模板匹配准确率特别依赖模板的数量、方式以及录音人性别,本小组100个模板全为同一个女生,最后由6个女生测试得到平均准确率为83%,但如果男生来测试可能准确率就很低了,而且并不一定模板越多准确率越高,可能出现当采用多个人的语音作为模板时,不同人的1和7极为相似而使得类间距缩小,而降低准确率,因此在实际中不会采用模板匹配的方式进行语音识别。

使用模板匹配的方式进行0-9语音识别参考:https://blog.csdn.net/weixin_43808138/article/details/123184195?spm=1001.2014.3001.5501
部分代码:

%% kmeans聚类中心判别
type=11;
min_=100000;
% load C4
C4=xlsread('C4.xlsx');
for i=1:10D(i,1)=dtw(C4(i,:),me0);if(D(i,1)<500)type=i-1;set(handles.edit1,'string',type);end
%       if(D(i,1)<min_)
%           min_=D(i,1);
%           type=i;
%       end
end
if type==11set(handles.edit1,'string','无法识别');
end
%% 层次聚类
fileFolder='层次聚类\';
dirOutput=dir(strcat(fileFolder,'*'));
fileNames={dirOutput.name};
len = length(fileNames);
%% 循环读取
for j=3:len% 连接路径和文件名得到完整的文件路径K_Trace = strcat(fileFolder, fileNames(j));eval(['[x,fs]','=','audioread(K_Trace{1,1})',';']);
%% 端点检测
%幅度归一化到[-1,1]
x = double(x);
x = x / max(abs(x));
% figure,plot(x);
%常数设置
FrameLen = 256;%帧长为256点
FrameInc = 80;%帧移为80点
amp1 = 20;%初始短时能量高门限
amp2 = 2;%初始短时能量低门限
zcr1 = 10;%初始短时过零率高门限
zcr2 = 5;%初始短时过零率低门限
maxsilence = 8;  % 8*10ms  = 80ms
%语音段中允许的最大静音长度,如果语音段中的静音帧数未超过此值,则认为语音还没结束;如果超过了
%该值,则对语音段长度count进行判断,若count<minlen,则认为前面的语音段为噪音,舍弃,跳到静音
%状态0;若count>minlen,则认为语音段结束;
minlen  = 15;    % 15*10ms = 150ms
%语音段的最短长度,若语音段长度小于此值,则认为其为一段噪音
status  = 0;     %初始状态为静音状态
count   = 0;     %初始语音段长度为0
silence = 0;     %初始静音段长度为0
%计算过零率
x1=x(1:end-1);
x2=x(2:end);
%分帧
tmp1=enframe(x1,FrameLen,FrameInc);
tmp2=enframe(x2,FrameLen,FrameInc);
signs = (tmp1.*tmp2)<0;
diffs = (tmp1 -tmp2)>0.02;
zcr   = sum(signs.*diffs, 2);%一帧一个值,2表示按行求和
%计算短时能量
%一帧一个值
%amp = sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);
amp = sum(abs(enframe(x, FrameLen, FrameInc)), 2);
%调整能量门限
amp1 = min(amp1, max(amp)/4);
amp2 = min(amp2, max(amp)/8);
%开始端点检测
%For循环,整个信号各帧比较
%根据各帧能量判断帧所处的阶段
x1 = 0;
x2 = 0;
v_num=0;%记录语音段数
v_Begin=[];%记录所有语音段的起点
v_End=[];%记录所有语音段的终点
%length(zcr)即为帧数
for n=1:length(zcr)goto = 0;switch statuscase {0,1}                   % 0 = 静音, 1 = 可能开始if amp(n) > amp1          % 确信进入语音段x1 = max(n-count-1,1);
%          '打印每个x1*FrameInc'
%          x1*FrameIncstatus  = 2;silence = 0;count   = count + 1;elseif amp(n) > amp2 | ... % 可能处于语音段zcr(n) > zcr2status = 1;count  = count + 1;else                       % 静音状态status  = 0;count   = 0;endcase 2                     % 2 = 语音段if amp(n) > amp2 | ...     % 保持在语音段zcr(n) > zcr2count = count + 1;else                       % 语音将结束silence = silence+1;if silence < maxsilence % 静音还不够长,尚未结束count  = count + 1;elseif count < minlen   % 语音长度太短,认为是噪声status  = 0;silence = 0;count   = 0;else                    % 语音结束status  = 3;endendcase 3%break;%记录当前语音段数据v_num=v_num+1;   %语音段个数加一count = count-silence/2;x2 = x1 + count -1;v_Begin(1,v_num)=x1*FrameInc; v_End(1,v_num)=x2*FrameInc;%不跳出 数据归零继续往下查找下一段语音status  = 0;     %初始状态为静音状态count   = 0;     %初始语音段长度为0silence = 0;     %初始静音段长度为0end
end
if length(v_End)==0x2 = x1 + count -1;v_Begin(1,1)=x1*FrameInc; v_End(1,1)=x2*FrameInc;
end
lenafter=0;
for len=1:length(v_End)tmp=v_End(1,len)-v_Begin(1,len);lenafter=lenafter+tmp;
end
lenafter;
afterEndDet=zeros(lenafter,1);%返回去除静音段的语音信号
beginnum=0;
endnum=0; for k=1:length(v_End)tmp=x(v_Begin(1,k):v_End(1,k));beginnum=endnum+1;endnum=beginnum+v_End(1,k)-v_Begin(1,k);afterEndDet(beginnum:endnum)=tmp; end
%     figure,plot(tmp);
% end
x=tmp;
%% Mel三角滤波器组参数
fh=fs/2; % fs=8000Hz,fh=4000Hz    语音信号的频率一般在300-3400Hz,所以一般情况下采样频率设为8000Hz即可。
max_melf=2595*log10(1+fh/700);%耳朵响应频率
M=24;%三角滤波器的个数
N=floor(0.03*fs);%设置帧长
i=0:25;f=700*(10.^(max_melf/2595*i/(M+1))-1);%将mei频域中的 各滤波器的中心频率 转到实际频率
F=zeros(24,N);for m=1:24for k=1:Ni=fh*k/N;if (f(m)<=i)&&(i<=f(m+1))F(m,k)=(i-f(m))/(f(m+1)-f(m));else if (f(m+1)<=i)&&(i<=f(m+2))F(m,k)=(f(m+2)-i)/(f(m+2)-f(m+1));elseF(m,k)=0;endendendend
%  figure,plot((1:N)*fh/N,F);%% DCT系数的计算方法
dctcoef=zeros(12,24);for k=1:12n=1:24;dctcoef(k,:)=cos((2*n-1)*k*pi/(2*24));end%% 预加重
len=length(x);alpha=0.98;y=zeros(len,1);for i=2:leny(i)=x(i)-alpha*x(i-1);end%% MFCC特征参数的求取h=hamming(N);%256*1num=floor(0.235*N); %帧移count=floor((len-N)/num+1);%帧数c1=zeros(count,12);for i=1:countx_frame=y(num*(i-1)+1:num*(i-1)+N);%分帧w = x_frame.* h;%Fx=abs(fft(w));%     Fx=abs(fft(x_frame));s=log(F*Fx.^2);%取对数c1(i,:)=(dctcoef*s)'; %离散余弦变换 end
%% 求取一阶差分mfcc系数
dtm = zeros(size(c1));
for i=3:size(c1,1)-2dtm(i,:) = -2*c1(i-2,:) - c1(i-1,:) + c1(i+1,:) + 2*c1(i+2,:);
end
dtm = dtm/3;
%% 合并
ccc=[c1 dtm];
ccc = ccc(3:size(c1,1)-2,:);
%% 一段语音的所有帧的mfcc参数求均值
me1(j,:)=mean(ccc);
end
me1=me1(3:end,2:20);
me=[me1;me0];
%%
Y=pdist(me);              % 计算样本点之间的欧氏距离
Y=squareform(Y);
Z=linkage(Y);             % 用最短距离法创建系统聚类树?
% C2=cophenet(Z,Y)        % //0.94698
T=cluster(Z,10);           % 聚类结果
dendrogram(Z,0,'ColorThreshold',20);

后期会上传整个项目代码~
项目已免费开源:https://gitee.com/zhengzsj/automatic-speech-recognition–ars/tree/master
点个赞和收藏吧~谢谢啦!

通过聚类中心进行0-9数字语音识别(matlab)——基于K-means聚类相关推荐

  1. kmeans聚类图matlab,基于 K 均值聚类的图像分割

    将图像读入工作区.减小图像大小以使示例运行得更快. RGB = imread('kobi.png'); RGB = imresize(RGB,0.5); imshow(RGB) 使用 k 均值聚类将图 ...

  2. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  3. 基于K均值聚类的葡萄酒品种判别

    特别注意:主要思路.程序和分析过程来源于:https://www.kaggle.com/xvivancos/tutorial-clustering-wines-with-k-means.本文在此基础上 ...

  4. Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(1): 数据探索、模型初探

    Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(1): 数据探索.模型初探 1 前言 分类和回归是强大易学的机器学习技术.需要注意的是:为了对新的样本预测未知的值, 必须从大量已知目标值的样 ...

  5. python图像分割_基于K均值聚类算法的Python图像分割

    1个K均值算法 实际上,K-means算法是一种非常简单的算法,与算法思想或特定实现无关. 通过以一定方式测量样本之间的相似度,并迭代更新聚类中心,它属于无监督分类. 当聚类中心不再移动或移动差异小于 ...

  6. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  7. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  8. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  9. 非局部相似性 matlab,基于引导核聚类的非局部均值图像去噪算法

    非局部均值(nonlocal means, NLM)图像去噪算法是根据图像中存在的大量冗余信息,用非局部自相似性原理抑制噪声的算法.最初的NLM算法由文献[ 在NLM改进算法中,文献[[在相似窗结构张 ...

  10. 【数据聚类】第五章第一节:基于网格的聚类算法概述

    pdf下载(密码:7281) 基于网格的聚类算法:主要用于处理大规模多维数据的聚类问题.它利用一个网格结构,将数据分布的空间划分为有限数目的单元,然后在这些网格单元上执行聚类操作.基于网格的聚类算法主 ...

最新文章

  1. Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
  2. eclipse 搜索使用。
  3. 潜艇将来会无人驾驶吗?
  4. javaweb回顾第十二篇监听器
  5. [Day9]面向对象
  6. PouchContainer 容器技术演进助力阿里云原生升级
  7. Spring Boot(十四):spring boot整合shiro-登录认证和权限管理
  8. 工作206:修改新增按钮显示逻辑
  9. Unix/Linux下的open函数(O_CREAT和O_EXCL)
  10. 林肯android auto,林肯mkz仪表盘怎么设置中文
  11. Nginx中conf相关配置的简要说明
  12. 服务质量--成功的关键因素!
  13. Process p = new Process();
  14. excel取整数的函数_Excel教程:取整函数INT 与TRUNC~~Excel新技能
  15. centos 最小化安装 补充命令_CentOS7安装后没网络的解决方法
  16. html和css实现 字体变色 旋转 图标渐变
  17. 论文排版的正确方式—LaTeX【分享贴】
  18. 企业级网络性能优化 课内7 多臂单臂路由
  19. win10有一个隐藏的超级管理员帐户,拥有全部权限,如何启用它
  20. 心电图心电轴怎么计算_心电轴度数计算表

热门文章

  1. 后台管理系统的登录功能
  2. html情侣相册,情侣相册教程-会声会影中文官网
  3. mui 新闻资讯app模板下载_简单易学的app制作教程:6步0编程进行app开发
  4. rk3399调试camera
  5. C构造函数的要点梳理~
  6. 圣诞节快到了,用python、turtle画棵圣诞树吧~
  7. Vue学习(十一)Vue CLI脚手架
  8. steam教育机构品牌
  9. 解读《网络产品安全漏洞管理规定》
  10. 产品健康度模型(1) 任务介绍