数据集

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

  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. 数据库和缓存一致性的问题
  2. paddle deepspeech v2 转 pytorch
  3. 斩获23项冠军,日均调用破万亿!百度交出年度AI成绩单:语音语言领衔技术突破,国产自研成大趋势...
  4. qt c语言程序运行时间,c – 在Qt中计时事件的最佳方法
  5. android 里程,鹰眼Android SDK | 百度地图API SDK
  6. 小程序动画从头开始_渐进式Web应用程序102:从头开始构建渐进式Web应用程序
  7. PAT (Basic Level) Practice1030 完美数列
  8. BERT时代,向量语义检索我们关注什么?
  9. 浅谈CTP期货行情交易API
  10. 你能发现什么?又能坚持什么?
  11. 一、开水白菜(steamed Chinese cabbage in supreme soup)
  12. STM32F103 - 延迟函数 -unfinished -unfinished-unfinished
  13. 长期招对日/赴日开发人才
  14. linux共享内存 pmu,基于ARM的GPS-无源北斗互备PMU研究与设计
  15. 阿里高维向量检索方法NSG介绍
  16. uint8数据类型图片和double数据类型图片的转化和显示
  17. nodeJS+mysql+连接池——连接池的创建和使用
  18. GMM-HMM孤立词识别
  19. FE内容付费系统响应式(带手机版) v5.46
  20. Vue渲染函数render

热门文章

  1. Rockland 血红蛋白 β A-2 抗体说明书
  2. nib but the view outlet was not set 错误的解决办法。
  3. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!
  4. mvdbos php spider,Scrapy-Redis分布式爬取自如网(一)
  5. 微信版QQ群助手 | 微信也可以折叠群聊了
  6. vulnhub-warzone_1
  7. #kubeadm安装Kubernetes 1.15最佳实践#
  8. 计算机教室网络安全应急预案,校园网和计算机教室多媒体教室应急预案
  9. mysql error 1094,ERROR 1094 (HY000) at line 1: Unknown thread id
  10. 自动驾驶系统进阶与项目实战(十)基于PointPillars的点云三维目标检测和TensorRT实战(1)