基于MATLAB的语音数据特征提取,然后进行分类,计算精度并画出混淆矩阵
三年前第一次用MATLAB处理语音分类时,我被满屏的梅尔倒谱系数和时域特征绕得头晕。今天咱们用最直白的方式,把语音分类的完整流程走一遍——从.wav文件到混淆矩阵,手把手教你避开我当年踩过的坑。
一、搞点数据先
MATLAB自带的语音工具箱藏着不少好东西。咱们先用自带数据集热热身:
% 加载示例语音文件 [clean,fs] = audioread('sample_voice.wav'); noisy = audioread('noisy_sample.wav'); % 听个响(慎点播放!) % sound(clean, fs) % sound(noisy, fs)这里fs是采样率,通常在8kHz到44.1kHz之间。注意别同时播放两个音频——别问我怎么知道的。
二、掏特征就像掏耳朵
梅尔倒谱系数(MFCC)是语音识别的老伙计了,咱们用20维系数:
function mfccs = extract_mfcc(signal, fs) frame_length = 0.025; % 25ms帧长 frame_overlap = 0.01; % 10ms重叠 num_ceps = 20; % 倒谱系数个数 % 分帧处理 frame_size = round(frame_length * fs); overlap_size = round(frame_overlap * fs); frames = buffer(signal, frame_size, overlap_size, 'nodelay'); % 计算MFCC(需要Audio Toolbox) mfccs = mfcc(frames, fs, 'NumCoeffs', num_ceps); end别被那些复杂的数学公式吓到,MATLAB早就帮我们封装好了。这里的buffer函数像切香肠一样把语音切成小段,注意重叠部分要足够才能捕捉连续特征。
三、分类器也得吃饭啊
攒够特征数据后,咱们请出老好人SVM:
% 假设已经准备好了trainFeatures和testFeatures model = fitcecoc(trainFeatures, trainLabels, ... 'Learners', 'svm', 'Coding', 'onevsall'); % 预测时记得做特征对齐 predLabels = predict(model, testFeatures); % 计算准确率 accuracy = sum(predLabels == testLabels)/numel(testLabels); fprintf('准确率:%.2f%%\n', accuracy*100);SVM在处理高维特征时稳如老狗,不过遇到大数据集可能会慢。偷偷告诉你,把'UseParallel'设为true能召唤多核加速。
四、混淆矩阵会说话
最后用混淆矩阵看看模型到底哪里犯糊涂:
figure; plotconfusion(categorical(testLabels), categorical(predLabels)) title('语音分类混淆矩阵'); set(gca, 'FontSize', 12)!
基于MATLAB的语音数据特征提取,然后进行分类,计算精度并画出混淆矩阵
矩阵对角线越亮说明分类越准,要是发现某个类别总被认错,可能需要检查那个类的特征提取是否有问题——比如把"开门"识别成"开灯",可能是爆破音特征没处理好。
五、实战小贴士
- 预处理别偷懒:做点降噪和音量归一化,效果立竿见影
- 梅尔滤波器别太多:26-40个足够,太多反而引入噪声
- 试试Delta系数:在MFCC基础上加一阶差分,识别率能涨3-5%
delta = diff(mfccs, 1, 2); % 一阶差分 ddelta = diff(delta, 1, 2); % 二阶差分 features = [mfccs(:,3:end-2); delta(:,2:end-1); ddelta];整个过程虽然看起来复杂,但拆解开来就是特征提取→喂数据→看结果的三步走。下次遇到语音分类需求时,不妨先拿这个模板魔改,说不定就能在甲方面前秀一把了。