KNN+MFCC实现方言识别
数据集
有关方言的数据集寻找困难,而且水平参差不齐,于是自己制作:
- 前往学习圣地——哔哩哔哩,寻找方言配音
- 找到合适的配音,下载并提取音频
- 音频剪辑,如果不想下载软件,我推荐一个在线音频剪辑工具
音频直接剪辑下载的命名不方便,可以按照这个方法:
CTRL+A全选,点击F2,批量重命名
例如,我将文档里面的音频命名为cs-m(表示长沙方言,男性),确认后自动将名称按照cs-m + (序号) 的方式命名,注意m后面有空格,括号为半角括号:
于是数据集便以规范命名制作完毕。
MFCC特征提取
接下来需要批量导入音频文件,我试了网上的一些方法,感觉比较乱而且不符合我的需求。我的需求是:
- 按照循环,每次读取一个样本
- 对此样本进行预加重,分帧,加窗,MFCC特征矩阵的计算
- 将一个样本的MFCC参数按帧平均,最终提取出一个样本的13个参数(最后一个元素是短时能量,在代码中会提到)
- 下一次循环进行下一样本的计算,同样也是提取13个参数,放到下一行
- 最终将矩阵 样本数x特征 导出为excel,方便下一步训练集和测试集的制作
代码如下:
clear all;
clc;
[FileName,PathName]=uigetfile({'*.wav'},'wav文件读取','MultiSelect','on');
% 选择需要用到的wav文件,存入FileNameaveCC=zeros(30,13);
for k=1:30% 每次读入一个音频str = cell2mat(FileName(k));[y2,fs]=audioread(str);% 双音道变为单音道y1=y2(:,1);CC = mymfcc(y1,fs);col=size(CC,2);% 求平均值sum=zeros(1,col);row=size(CC,1);for i=1:rowsum=sum+CC(i,:);endave=sum/row;aveCC(k,:)=ave;
enddisp(aveCC);
% 写成一个xlsx
xlswrite('yy-m.xlsx',aveCC);
关于MFCC的原理,大家可以参考语音信号处理之(四)梅尔频率倒谱系数(MFCC)
写的很详细,按照原理可以很简单的写出代码。
这里是我自己的函数mymfcc
,其中的2个归一化的原因和原理我比较模糊,欢迎大神指点迷津:
function mfccmat = mymfcc(x,fs)
% mfcc特征提取函数
% 输入:x为信号,fs抽样率
% 输出:mfccmat是一帧语音的MFCC系数矩阵% 参数
n = 24; % Mel滤波器阶数
p = 12; % 倒谱阶数
nwin = 256; % 帧长% 获得Mel滤波器组,这是voicebox中的函数
bank = melbankm(n,nwin,fs,0,0.5,'t');% 归一化mel滤波器组系数
bank = full(bank); % 将稀疏矩阵转换全矩阵
bank = bank/max(bank(:));% 归一化倒谱提升窗口
w = 1+0.5*p*sin(pi*(1:p)./p);
w = w/max(w);% 预加重滤波器
x = double(x);
x = filter([1,-0.9375],1,x);% 分帧,这也是voicebox中的函数
xframe = enframe(x,nwin);
nframe = size(xframe,1);% 总帧数% 计算每帧的MFCC参数,留出13个位置,最后一个位置是短时能量
mfccmat = zeros(nframe,p+1);
for i = 1:nframey = xframe(i,:)';y = y.*hamming(nwin); % 加窗energy = log(sum(y.^2)+eps); % 短时能量y = abs(fft(y));y = y(1:fix(nwin/2)+1); % 使y的长度和Mel滤波器组相同% Discrete cosine transform 离散余弦变换,用于逆变换取代ifftc = dct(log(bank*y+eps));c = c(2:p+1)'.*w; % 取2~p+1个系数,并且倒谱提升mfcc = [c,energy]; % 将能量加入,作为特征的一个元素mfccmat(i,:) = mfcc;
endend
KNN分类器
在KNN实现鸢尾花分类中:https://blog.csdn.net/qq_45510888/article/details/106158889
已经详细介绍了KNN分类器原理和代码,这里就不赘述。
将做好的数据集按照7:3的比例分成训练集和测试集,然后使用KNN分类器导入数据,便可以进行分类。为了操作方便,进行了小修改。与上一版相比较增加的内容有:
feature=13;sort=feature+1;% 特征数和分类所在位置
k = 9;% 确定k的值,取值不同分类结果不同% 读入训练集,分类:长沙1,河南2,南昌3,闽南4,普通话5,粤语6
train = xlsread('train.xlsx');
trainData = train(:,1:feature);% 前几列是特征
trainClass = train(:,sort);% 最后1列是分类
最终分类结果:
由于KNN最理想的情况应该是实现2分类,对于多分类(例如本文的6分类),经常会出现最大值有2个或者更多、无法确定此测试样本的最终分类的情况。作者还没想到更好的解决方法,暂且只是将第一顺序位的类别赋予结果,同样希望有相关经验的朋友交流讨论!
最后,大家在使用KNN时要规避其存在的一些不足之处:
- 添加某些类别的样本容量非常大,而其它类样本容量非常小,即已知的样本数量不均衡。有可能当输入一个和小容量类别同样的新样本时,该样本的K个近邻中,大容量类的样本占多数,从而导致误分类。
解决:针对此种情况能够采用加权的方法,即和该样本距离小的近邻所相应的权值越大,将权值纳入分类的参考根据。或者尽可能制作数据集时就使各样本数量均衡。 - 分类时须要先计算待分类样本和全体已知样本的距离。才能求得所需的K近邻点,计算量较大,尤其是样本数量较多时。
解决:针对这样的情况能够事先对已知样本点进行剪辑。去除对分类作用不大的样本,这一处理步骤仅适用于样本容量较大的情况,假设在原始样本数量较少时采用这样的处理。反而会添加误分类的概率。
关于KNN的改进,这里推荐一篇博客:KNN分类器
KNN+MFCC实现方言识别相关推荐
- python 数学公式识别_Python实现基于KNN算法的笔迹识别功能详解
本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...
- python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解
本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...
- 基于KNN算法的颜色识别
KNN实现魔方颜色识别 1.颜色识别 该程序利用KNN实现魔方颜色识别,特征采用RGB的颜色直方图,它可以区分白.黑.红.绿.蓝.橙色.黄色和紫色,如果你想分类更多颜色或者提高分类准确率,可以通过调整 ...
- CV之FR:基于DIY人脸图像数据集(每人仅需几张人脸图片训练)利用Hog方法提取特征和改进的kNN算法实现人脸识别并标注姓名(标注文本标签)—(准确度高达100%)
CV之FR:基于DIY人脸图像数据集(每人仅需几张人脸图片训练)利用Hog方法提取特征和改进的kNN算法实现人脸识别并标注姓名(标注文本标签)-(准确度高达100%) 目录 基于DIY人脸图像数据集( ...
- KNN算法虹膜图片识别(源码)
人工智能AI与大数据技术实战 公众号: weic2c 目录 1 K-近邻算法(KNN, k-NearestNeighbor) 2 K-近邻算法详述 3 K-近邻算法图片识别分类 4 参考文献 1 K ...
- python笔迹识别_python_基于KNN算法的笔迹识别
需要用到: Numpy库 Pandas库 手写识别数据 下载地址 数据说明: 数据共有785列,第一列为label,剩下的784列数据存储的是灰度图像(0~255)的像素值 28*28=784 KNN ...
- KNN算法--手写识别
文章目录 前言 一.手写识别系统 二.主要代码 1.引入库 2.分类器代码: 3.将图像转化为测试向量 4.手写数字识别系统测试代码 总结 前言 KNN算法的介绍在上篇文章中已经提及,详情请见KNN算 ...
- AI基础:KNN与K近邻距离度量说明、利用KNN手写字体识别分类实践
KNN k近邻 文章目录 KNN算法 K近邻中近邻的距离度量 欧式距离 标准化欧式距离 曼哈顿距离 汉明距离 夹角余弦 杰卡德相似系数 皮尔逊系数 切比雪夫距离 闵可夫斯基距离 马氏距离 巴氏距离 各 ...
- opencvsharp 使用knn 实现身份证号码识别
文章目录 需求 环境 先看结果 思路 总结 继续写(2021年6月21日) 遇到的问题 KNearest.Train方法训练过程中如何把素材变成数组 为解决问题 源代码 特别感谢 需求 学习openc ...
最新文章
- python键_在Python中创建键命令
- POJ 1177 Picture [离散化+扫描线+线段树]
- POJ3228二分最大流
- python slice函数画高维图_六维图见过么?Python 画出来了
- Python入门编程中的变量、字符串以及数据类型
- jinja2语法中{%raw%}和{{}}的等效替换
- 使用.NET进行高效率互联网敏捷开发的思考和探索【一、概述】
- Linq 三表 left join 的实现
- 去除非ascii字符以及ascii中的控制符
- 安装Ubuntu下的开发工具
- Framework层SMS发送
- Golang 入门 : 打造开发环境
- paip.lucene 4.3 中文语义搜索最佳实践
- word模板Normal.dotm文件的生成与替换
- ETC工作原理及技术浅析
- 使用大白菜U盘重装系统
- 计算机图形学直线算法论文,《计算机图形学》中直线生成算法的教学心得
- SharePoint 2013 App Development读书笔记1
- PostMan测试接口,出现415报错,Unsupported Media Type
- 《邱岳的产品实战》学习笔记:第9周