数据集

有关方言的数据集寻找困难,而且水平参差不齐,于是自己制作:

  1. 前往学习圣地——哔哩哔哩,寻找方言配音
  2. 找到合适的配音,下载并提取音频
  3. 音频剪辑,如果不想下载软件,我推荐一个在线音频剪辑工具

音频直接剪辑下载的命名不方便,可以按照这个方法:

CTRL+A全选,点击F2,批量重命名

例如,我将文档里面的音频命名为cs-m(表示长沙方言,男性),确认后自动将名称按照cs-m + (序号) 的方式命名,注意m后面有空格,括号为半角括号:

于是数据集便以规范命名制作完毕。

MFCC特征提取

接下来需要批量导入音频文件,我试了网上的一些方法,感觉比较乱而且不符合我的需求。我的需求是:

  1. 按照循环,每次读取一个样本
  2. 对此样本进行预加重,分帧,加窗,MFCC特征矩阵的计算
  3. 将一个样本的MFCC参数按帧平均,最终提取出一个样本的13个参数(最后一个元素是短时能量,在代码中会提到)
  4. 下一次循环进行下一样本的计算,同样也是提取13个参数,放到下一行
  5. 最终将矩阵 样本数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时要规避其存在的一些不足之处:

  1. 添加某些类别的样本容量非常大,而其它类样本容量非常小,即已知的样本数量不均衡。有可能当输入一个和小容量类别同样的新样本时,该样本的K个近邻中,大容量类的样本占多数,从而导致误分类。
    解决:针对此种情况能够采用加权的方法,即和该样本距离小的近邻所相应的权值越大,将权值纳入分类的参考根据。或者尽可能制作数据集时就使各样本数量均衡。
  2. 分类时须要先计算待分类样本和全体已知样本的距离。才能求得所需的K近邻点,计算量较大,尤其是样本数量较多时。
    解决:针对这样的情况能够事先对已知样本点进行剪辑。去除对分类作用不大的样本,这一处理步骤仅适用于样本容量较大的情况,假设在原始样本数量较少时采用这样的处理。反而会添加误分类的概率。

关于KNN的改进,这里推荐一篇博客:KNN分类器

KNN+MFCC实现方言识别相关推荐

  1. python 数学公式识别_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

  2. python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

  3. 基于KNN算法的颜色识别

    KNN实现魔方颜色识别 1.颜色识别 该程序利用KNN实现魔方颜色识别,特征采用RGB的颜色直方图,它可以区分白.黑.红.绿.蓝.橙色.黄色和紫色,如果你想分类更多颜色或者提高分类准确率,可以通过调整 ...

  4. CV之FR:基于DIY人脸图像数据集(每人仅需几张人脸图片训练)利用Hog方法提取特征和改进的kNN算法实现人脸识别并标注姓名(标注文本标签)—(准确度高达100%)

    CV之FR:基于DIY人脸图像数据集(每人仅需几张人脸图片训练)利用Hog方法提取特征和改进的kNN算法实现人脸识别并标注姓名(标注文本标签)-(准确度高达100%) 目录 基于DIY人脸图像数据集( ...

  5. KNN算法虹膜图片识别(源码)

    人工智能AI与大数据技术实战  公众号: weic2c 目录 1 K-近邻算法(KNN, k-NearestNeighbor) 2 K-近邻算法详述 3 K-近邻算法图片识别分类 4 参考文献 1 K ...

  6. python笔迹识别_python_基于KNN算法的笔迹识别

    需要用到: Numpy库 Pandas库 手写识别数据 下载地址 数据说明: 数据共有785列,第一列为label,剩下的784列数据存储的是灰度图像(0~255)的像素值 28*28=784 KNN ...

  7. KNN算法--手写识别

    文章目录 前言 一.手写识别系统 二.主要代码 1.引入库 2.分类器代码: 3.将图像转化为测试向量 4.手写数字识别系统测试代码 总结 前言 KNN算法的介绍在上篇文章中已经提及,详情请见KNN算 ...

  8. AI基础:KNN与K近邻距离度量说明、利用KNN手写字体识别分类实践

    KNN k近邻 文章目录 KNN算法 K近邻中近邻的距离度量 欧式距离 标准化欧式距离 曼哈顿距离 汉明距离 夹角余弦 杰卡德相似系数 皮尔逊系数 切比雪夫距离 闵可夫斯基距离 马氏距离 巴氏距离 各 ...

  9. opencvsharp 使用knn 实现身份证号码识别

    文章目录 需求 环境 先看结果 思路 总结 继续写(2021年6月21日) 遇到的问题 KNearest.Train方法训练过程中如何把素材变成数组 为解决问题 源代码 特别感谢 需求 学习openc ...

最新文章

  1. python键_在Python中创建键命令
  2. POJ 1177 Picture [离散化+扫描线+线段树]
  3. POJ3228二分最大流
  4. python slice函数画高维图_六维图见过么?Python 画出来了
  5. Python入门编程中的变量、字符串以及数据类型
  6. jinja2语法中{%raw%}和{{}}的等效替换
  7. 使用.NET进行高效率互联网敏捷开发的思考和探索【一、概述】
  8. Linq 三表 left join 的实现
  9. 去除非ascii字符以及ascii中的控制符
  10. 安装Ubuntu下的开发工具
  11. Framework层SMS发送
  12. Golang 入门 : 打造开发环境
  13. paip.lucene 4.3 中文语义搜索最佳实践
  14. word模板Normal.dotm文件的生成与替换
  15. ETC工作原理及技术浅析
  16. 使用大白菜U盘重装系统
  17. 计算机图形学直线算法论文,《计算机图形学》中直线生成算法的教学心得
  18. SharePoint 2013 App Development读书笔记1
  19. PostMan测试接口,出现415报错,Unsupported Media Type
  20. 《邱岳的产品实战》学习笔记:第9周

热门文章

  1. 杨百万:中国股市是政策市 炒股要听党和政府的话
  2. 【蓝桥杯】【啊哈!算法】冒泡排序
  3. 【面试】奇虎360笔试解答
  4. 华为鸿蒙应用名称,国产自主系统名字定了 华为鸿蒙商标已注册公告
  5. Python的安装和环境配置
  6. 每秒处理10万订单乐视集团支付架构读后感
  7. ppm理解与代码实现
  8. 生活随记 - NBA总决赛第5场 球迷有感
  9. 河南专升本公共英语语法考点分析---定语从句
  10. java 七巧板油漆问题_《七巧板中的分数问题》评课稿