【语音识别】基于高斯混合模型(GMM)的说话人识别matlab代码

147 阅读1分钟

1 简介

实现了一个基于高斯混合模型(GMM)的说话人辨识系统.GMM是用多个高斯分布的概率密度函数的组合来描述特征矢量在概率空间的分布状况,不同的说话人对应了不同的GMM.模型的训练采取了极大似然估计(ML)的EM方法.并在不同的数据集上实验,得到了好的结果.

为了说明基于非线性变换 GMM 模型的说话人识别方法,首先必须介绍一下 GMM 模型以及传统的基于 GMM 的说话人识别方法。GMM 是 M 成员密度的加权和,可以用式( 1) 表示

2 部分代码

function [mix,post,errlog]=gmm_em(mix,x,emiter)

[dim,data_sz]=size(x');
init_covars=mix.covars; 
MIN_COVAR=0.001;

for cnt=1:emiter
 %--- E step: 计算充分统计量 ---
[post,act]=calcpost(mix,x);
 prob=act*(mix.priors)';
 errlog(cnt)=-sum(log(prob));
 
 %--- M step:重估三组参数 ---
 new_pr=sum(post,1);
 new_c=post'*x;
 mix.priors=new_pr./data_sz; %pai 
 mix.centres=new_c./(new_pr'*ones(1,dim)+eps); %miu
 switch mix.covar_type
 case 'diag'
   for j=1:mix.ncentres
    diffs=x-(ones(data_sz,1)*mix.centres(j,:));
    mix.covars(j,:)=sum((diffs.*diffs).*(post(:,j)*ones(1,dim)),1)./new_pr(j);
    if min(mix.covars(j,:)) < MIN_COVAR
      mix.covars(j,:) = init_covars(j,:);
    end
   end  
 case 'full'
   for j=1:mix.ncentres
    diffs=x-(ones(data_sz,1)*mix.centres(j,:));
    diffs=diffs.*(sqrt(post(:,j))*ones(1,dim));
    mix.covars(:,:,j)=(diffs'*diffs)/(new_pr(j)+eps);
    if min(svd(mix.covars(:,:,j)))<MIN_COVAR
      a=svd(mix.covars(:,:,j));
      mix.covars(:,:,j)=init_covars(:,:,j);
    end
   end
 otherwise
   error(['Unknown covariance type ', mix.covar_type]);               
 end    

end

3 仿真结果

4 参考文献

​[1]陈芬菲. 基于GMM的说话人识别系统[J]. 微处理机, 2006, 27(4):76-77.

部分理论引用网络文献,若有侵权联系博主删除。

5 MATLAB代码与数据下载地址

见博客主页