一、高斯混合模型簡介
GMM基本架構
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMykjMxQzMzYTYyUWNlNDZxYzX4UDNxQTM0AzLcFDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
類似的還有GMM-UBM(Universal background model)算法,其與GMM的差別在于:對L類整體樣本訓練一個大的GMM,而不像GMM對每一類訓練一個GMM模型。SVM的話MFCC作為特征,每一幀作為一個樣本,可以借助VAD删除無效音頻段,直接訓練分類。近年來也有利用稀疏表達的方法:
二、部分源代碼
% ====== 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版本及參考文獻
1 matlab版本
2014a
2 參考文獻
[1]韓紀慶,張磊,鄭鐵然.語音信号處理(第3版)[M].清華大學出版社,2019.