天天看點

【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】

一、高斯混合模型簡介

GMM基本架構

【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】

類似的還有GMM-UBM(Universal background model)算法,其與GMM的差別在于:對L類整體樣本訓練一個大的GMM,而不像GMM對每一類訓練一個GMM模型。SVM的話MFCC作為特征,每一幀作為一個樣本,可以借助VAD删除無效音頻段,直接訓練分類。近年來也有利用稀疏表達的方法:

【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】

二、部分源代碼

% ====== Load wave data and do feature extraction
clc,clear
waveDir='trainning\';
speakerData = dir(waveDir);
%Matlab使用dir函數獲得指定檔案夾下的所有子檔案夾和檔案,并存放在在一種為檔案結構體數組中.
% dir函數可以有調用方式
% dir('.') 列出目前目錄下所有子檔案夾和檔案
% dir('G:\Matlab') 列出指定目錄下所有子檔案夾和檔案
% dir('*.m') 列出目前目錄下符合正規表達式的檔案夾和檔案
% 得到的為結構體數組每個元素都是如下形式的結構體
%         name    -- filename
%         date    -- modification date
%         bytes   -- number of bytes allocated to the file
%         isdir   -- 1 if name is a directory and 0 if not
%         datenum -- modification date as a MATLAB serial date number
% 分别為檔案名,修改日期,大小,是否為目錄,Matlab特定的修改日期
% 可以提取出檔案名以作讀取和儲存用.
speakerData(1:2) = [];
speakerNum=length(speakerData);%speakerNum:人數;


% ====== Feature extraction
fprintf('\n讀取語音檔案并進行特征提取...       ');
% cd('D:\MATLAB7\toolbox\dcpr\');
for i=1:speakerNum
   fprintf('\n正在提取第%d個人%s的特征\n', i, speakerData(i,1).name(1:end-4));
    [y, fs, nbits]=wavread(['trainning\' speakerData(i,1).name]);
    epInSampleIndex = epdByVol(y, fs);    % endpoint detection端點檢測
    y=y(epInSampleIndex(1):epInSampleIndex(2)); % silence is not used去除靜音
    speakerData(i).mfcc=wave2mfcc(y, fs);
    fprintf('  完成!!');
end

save speakerData speakerData;    % Since feature extraction is slow, you can save the data for future use if the features are not changed.
graph_MFCC;                                 %由于特征提取速度慢,如果功能沒有改變,可以儲存供日後使用的資料,
fprintf('\n');
clear all;
fprintf('特征參數提取完成! \n\n請點選任意鍵繼續...');
 pause;


% ====== GMM training
fprintf('\n訓練每個語者的高斯混合模型...\n\n');
load speakerData.mat
gaussianNum=12;               % No. of gaussians in a GMM高斯混合模型中的高斯個數
speakerNum=length(speakerData);


for i=1:speakerNum
   fprintf('\n為第%d個語者%s訓練GMM……\n', i,speakerData(i).name(1:end-4));
   [speakerGmm(i).mu, speakerGmm(i).sigm,speakerGmm(i).c] = gmm_estimate(speakerData(i).mfcc,gaussianNum);
    fprintf('  完成!!');
end

fprintf('\n');
save speakerGmm speakerGmm;
pause(10);
clear all;
fprintf('高斯混合模型訓練結束! \n\n請點選任意鍵繼續...');
 pause;

% ====== recognition
fprintf('\n識别中...\n\n');
load speakerData;
load speakerGmm;

[filename, pathname] = uigetfile('*.wav','select a wave file to load');
    if pathname == 0
        errordlg('ERROR! No file selected!');
        return;
    end    
wav_file = [pathname filename];
[testing_data, fs, nbits]=wavread(wav_file);
 pause(10);
match= MFCC_feature_compare(testing_data,speakerGmm);
 disp('待測模型比對中,請等待10秒!')
 pause(10);
[max_1 index]=max(match);
if length(filename)>7
   fprintf('\n\n\n說話人是%s。',speakerData(index).name(1:end-4));
else
   fprintf('\n\n\n說話人是%s。',filename(1:end-4));
end      

三、運作結果

【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】
【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】
【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】
【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】
【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】
【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】
【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】
【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】
【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】
【語音識别】基于matlab MFCC GMM語音識别【含Matlab源碼 535期】

四、matlab版本及參考文獻

​1 matlab版本​

2014a

​2 參考文獻​

[1]韓紀慶,張磊,鄭鐵然.語音信号處理(第3版)[M].清華大學出版社,2019.

繼續閱讀