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 ...
最新文章
- 数据库和缓存一致性的问题
- paddle deepspeech v2 转 pytorch
- 斩获23项冠军,日均调用破万亿!百度交出年度AI成绩单:语音语言领衔技术突破,国产自研成大趋势...
- qt c语言程序运行时间,c – 在Qt中计时事件的最佳方法
- android 里程,鹰眼Android SDK | 百度地图API SDK
- 小程序动画从头开始_渐进式Web应用程序102:从头开始构建渐进式Web应用程序
- PAT (Basic Level) Practice1030 完美数列
- BERT时代,向量语义检索我们关注什么?
- 浅谈CTP期货行情交易API
- 你能发现什么?又能坚持什么?
- 一、开水白菜(steamed Chinese cabbage in supreme soup)
- STM32F103 - 延迟函数 -unfinished -unfinished-unfinished
- 长期招对日/赴日开发人才
- linux共享内存 pmu,基于ARM的GPS-无源北斗互备PMU研究与设计
- 阿里高维向量检索方法NSG介绍
- uint8数据类型图片和double数据类型图片的转化和显示
- nodeJS+mysql+连接池——连接池的创建和使用
- GMM-HMM孤立词识别
- FE内容付费系统响应式(带手机版) v5.46
- Vue渲染函数render
热门文章
- Rockland 血红蛋白 β A-2 抗体说明书
- nib but the view outlet was not set 错误的解决办法。
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!
- mvdbos php spider,Scrapy-Redis分布式爬取自如网(一)
- 微信版QQ群助手 | 微信也可以折叠群聊了
- vulnhub-warzone_1
- #kubeadm安装Kubernetes 1.15最佳实践#
- 计算机教室网络安全应急预案,校园网和计算机教室多媒体教室应急预案
- mysql error 1094,ERROR 1094 (HY000) at line 1: Unknown thread id
- 自动驾驶系统进阶与项目实战(十)基于PointPillars的点云三维目标检测和TensorRT实战(1)