本文讲述了C#基于NAudio的音量识别!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:
以下将走过的坑分享一下:
1.不定长声音的MFCC也不定长(废话),解决不定长,我用了人工指定的方式,即指定MFCC特征的个数,多的丢,少的补零。仅个人实践表明,特征越多分类效果越好,所以,多补零吧。
string[] MFCCa = MFCCs.Split(',');
for (int j = 0; j < chanum; j++)
{
if (j > MFCCa.Length - 2)//存的时候多了个“,”,所以回退一位
{
trainDate[i, j] = 0;
}
else
{
trainDate[i, j] = Convert.ToSingle(MFCCa[j]);
}
trainLab[i, 0] = 1;
}
2.Emgucv3.×以上的训练结果文件(.XML)的读存请自行修改下,直接save和load似乎不行。半公开的秘密,代码如下:
private static void saveSVMtoFile(SVM model,String path)
{
if (File.Exists(path))
File.Delete(path);
FileStorage fs = new FileStorage(path, FileStorage.Mode.Write);
model.Write(fs);
fs.ReleaseAndGetString();
}
private static SVM loadSVMtoFile(String path)
{
SVM svm = new SVM();
FileStorage fs = new FileStorage(path, FileStorage.Mode.Read);
svm.Read(fs.GetRoot());
fs.ReleaseAndGetString();
return svm;
}
3.Emgucv的SVM和BP之间细微的差别
本以为只是改改训练器,几行代码的事情,但报了一堆错,全是小细节。
3.1 SVM的分类标签可以是int或者float,但BP一定一定要是float
Matrix<float> trainDate = new Matrix<float>(allnum, chanum);
Matrix<int> trainLab = new Matrix<int>(allnum,1);
Matrix<float> trainData = new Matrix<float>(allnum, chanum);
Matrix<float> trainClasses = new Matrix<float>(allnum, 1);
3.2 SVM可以直接给出预测结果(即标签),BP给出的不知道是什么(大概是到你定的标签范围内的落点,我定了1和-1,但有时候超出了1和-1,所以很奇怪,有真懂的同学留言教我一下),还要自己判断一下。
Matrix<float> preDate = new Matrix<float>(1, chaNum);
getPerDate(preDate, OutfileName[j], chaNum);
float kinds=svm.Predict(preDate);
Matrix<float> preDate = new Matrix<float>(1, chaNum);
Matrix<float> prediction = new Matrix<float>(1, 1);
getPerDate(preDate, OutfileName[j], chaNum);
network.Predict(preDate, prediction);
float kinds = prediction.Data[0, 0];
3.3 SVM(线性核函数)+MFCC我做出来50%上下,几乎没什么意义。BP效果不错,起码70以上,一般水准在80%上下。
悲伤的补一句,样本数量还可以且分类数量很小的情况下,最短路径的效果其实很好。
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!