C#基于NAudio的声音识别(二)——MFCC+SVM/BP
書(shū)接上文,切割后的文件轉(zhuǎn)換特征為MFCC(細(xì)節(jié)不表了,網(wǎng)搜的代碼)。聲音的特征和識(shí)別最好的組合絕對(duì)不是MFCC+SVM(后面我會(huì)講為什么),我只是怎么怎么方便怎么來(lái),看到這的準(zhǔn)備做聲音識(shí)別的同學(xué)請(qǐng)果斷變道。
有了特征值就可以作為訓(xùn)練素材了,Emgucv版本更新快,不同版本的分類(lèi)器參數(shù)設(shè)置方式不一樣,這可以參見(jiàn)我以前的類(lèi)似博客。
以下將走過(guò)的坑分享一下:
1.不定長(zhǎng)聲音的MFCC也不定長(zhǎng)(廢話),解決不定長(zhǎng),我用了人工指定的方式,即指定MFCC特征的個(gè)數(shù),多的丟,少的補(bǔ)零。僅個(gè)人實(shí)踐表明,特征越多分類(lèi)效果越好,所以,多補(bǔ)零吧。
string[] MFCCa = MFCCs.Split(',');for (int j = 0; j < chanum; j++){if (j > MFCCa.Length - 2)//存的時(shí)候多了個(gè)“,”,所以回退一位{trainDate[i, j] = 0;}else{trainDate[i, j] = Convert.ToSingle(MFCCa[j]);}trainLab[i, 0] = 1;}2.Emgucv3.×以上的訓(xùn)練結(jié)果文件(.XML)的讀存請(qǐng)自行修改下,直接save和load似乎不行。半公開(kāi)的秘密,代碼如下:
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之間細(xì)微的差別
本以為只是改改訓(xùn)練器,幾行代碼的事情,但報(bào)了一堆錯(cuò),全是小細(xì)節(jié)。
3.1 SVM的分類(lèi)標(biāo)簽可以是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可以直接給出預(yù)測(cè)結(jié)果(即標(biāo)簽),BP給出的不知道是什么(大概是到你定的標(biāo)簽范圍內(nèi)的落點(diǎn),我定了1和-1,但有時(shí)候超出了1和-1,所以很奇怪,有真懂的同學(xué)留言教我一下),還要自己判斷一下。
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(線性核函數(shù))+MFCC我做出來(lái)50%上下,幾乎沒(méi)什么意義。BP效果不錯(cuò),起碼70以上,一般水準(zhǔn)在80%上下。
悲傷的補(bǔ)一句,樣本數(shù)量還可以且分類(lèi)數(shù)量很小的情況下,最短路徑的效果其實(shí)很好。
新開(kāi)博客,目的為學(xué)習(xí)交流,本人QQ:273651820。
總結(jié)
以上是生活随笔為你收集整理的C#基于NAudio的声音识别(二)——MFCC+SVM/BP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 线性代数:方程组
- 下一篇: 功能测试与抓包工具Fiddler(htt