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代码与数据下载地址
见博客主页