【语音识别】基于MFCC+VAD端点检测智能语音门禁系统含Matlab源码

该文提出了一种结合MFCC倒谱距离与对数能量的语音端点检测方法,旨在解决低信噪比环境下算法性能下降的问题。首先计算语音的对数能量,然后计算改进的倒谱距离,并将两者融合得到新的语音参数。通过滤波和自动更新的双阈值判断,实现在不同噪声中对语音端点的准确检测,尤其在低信噪比条件下表现出良好的效果。

1 简介

为提高低信噪比环境下语音端点检测算法性能不高的问题,提出将MFCC倒谱距离与对数能量结合进行端点检测.首先,对语音计算对数能量,然后计算改进的倒谱距离,将MFCC倒谱距离与对数能量融合,获得了一种新的语音参数,该参数能有效地提高低信噪比情况下语音与噪声的区别,对参数进行顺利滤波用于语音端点检测,采用自动更新的双阈值进行语音端判别.仿真实验表明,该算法具有较好的适用不同噪声,在低信噪比下依然能获得比较理想的端点检测效果.

2 部分代码

function [x,mc,mn,mx]=melbankm(p,n,fs,fl,fh,w)if nargin < 6    w='tz';     if nargin < 5        fh=0.5;         if nargin < 4            fl=0; % min freq is DC        end    endendsfact=2-any(w=='s'); wr=' ';   % default warping is melfor i=1:length(w)    if any(w(i)=='lebf');        wr=w(i);    endendif any(w=='h') || any(w=='H')    mflh=[fl fh];else    mflh=[fl fh]*fs;endif ~any(w=='H')    switch wr                    case 'f'        case 'l'            if fl<=0                error('Low frequency limit must be >0 for l option');            end            mflh=log10(mflh);        case 'e'            mflh=frq2erb(mflh);        case 'b'            mflh=frq2bark(mflh);        otherwise            mflh=frq2mel(mflh);    endendmelrng=mflh*(-1:2:1)';fn2=floor(n/2);if isempty(p)    p=ceil(4.6*log10(fs));endif any(w=='c')if p<1    p=round(melrng/(p*1000))+1;endmelinc=melrng/(p-1);mflh=mflh+(-1:2:1)*melinc;else    if p<1    p=round(melrng/(p*1000))-1;endmelinc=melrng/(p+1);endswitch wr        case 'f'        blim=(mflh(1)+[0 1 p p+1]*melinc)*n/fs;    case 'l'        blim=10.^(mflh(1)+[0 1 p p+1]*melinc)*n/fs;    case 'e'        blim=erb2frq(mflh(1)+[0 1 p p+1]*melinc)*n/fs;    case 'b'        blim=bark2frq(mflh(1)+[0 1 p p+1]*melinc)*n/fs;    otherwise        blim=mel2frq(mflh(1)+[0 1 p p+1]*melinc)*n/fs;endmc=mflh(1)+(1:p)*melinc;b1=floor(blim(1))+1;b4=min(fn2,ceil(blim(4))-1);switch wr        case 'f'        pf=((b1:b4)*fs/n-mflh(1))/melinc;    case 'l'        pf=(log10((b1:b4)*fs/n)-mflh(1))/melinc;    case 'e'        pf=(frq2erb((b1:b4)*fs/n)-mflh(1))/melinc;    case 'b'        pf=(frq2bark((b1:b4)*fs/n)-mflh(1))/melinc;    otherwise        pf=(frq2mel((b1:b4)*fs/n)-mflh(1))/melinc;endif pf(1)<0    pf(1)=[];    b1=b1+1;endif pf(end)>=p+1    pf(end)=[];    b4=b4-1;endfp=floor(pf);pm=pf-fp;k2=find(fp>0,1);k3=find(fp<p,1,'last');k4=numel(fp);if isempty(k2)    k2=k4+1;endif isempty(k3)    k3=0;endif any(w=='y')    mn=1;    mx=fn2+1;    r=[ones(1,k2+b1-1) 1+fp(k2:k3) fp(k2:k3) repmat(p,1,fn2-k3-b1+1)];    c=[1:k2+b1-1 k2+b1:k3+b1 k2+b1:k3+b1 k3+b1+1:fn2+1];    v=[ones(1,k2+b1-1) pm(k2:k3) 1-pm(k2:k3) ones(1,fn2-k3-b1+1)];else    r=[1+fp(1:k3) fp(k2:k4)];    c=[1:k3 k2:k4];    v=[pm(1:k3) 1-pm(k2:k4)];    mn=b1+1;     mx=b4+1;endif b1<0    c=abs(c+b1-1)-b1+1;end% endif any(w=='n')    v=0.5-0.5*cos(v*pi);elseif any(w=='m')    v=0.5-0.46/1.08*cos(v*pi);endif sfact==2    msk=(c+mn>2) & (c+mn<n-fn2+2);    v(msk)=2*v(msk);endif nargout > 2    x=sparse(r,c,v);    if nargout == 3        mc=mn;        mn=mx;    endelse    x=sparse(r,c+mn-1,v,p,1+fn2);endif any(w=='u')    sx=sum(x,2);    x=x./repmat(sx+(sx==0),1,size(x,2));endif ~nargout || any(w=='g')     ng=201;    me=mflh(1)+(0:p+1)'*melinc;    switch wr                case 'f'            fe=me;            xg=repmat(linspace(0,1,ng),p,1).*repmat(me(3:end)-me(1:end-2),1,ng)+repmat(me(1:end-2),1,ng);        case 'l'            fe=10.^me;            xg=10.^(repmat(linspace(0,1,ng),p,1).*repmat(me(3:end)-me(1:end-2),1,ng)+repmat(me(1:end-2),1,ng));        case 'e'            fe=erb2frq(me);            xg=erb2frq(repmat(linspace(0,1,ng),p,1).*repmat(me(3:end)-me(1:end-2),1,ng)+repmat(me(1:end-2),1,ng));        case 'b'            fe=bark2frq(me);            xg=bark2frq(repmat(linspace(0,1,ng),p,1).*repmat(me(3:end)-me(1:end-2),1,ng)+repmat(me(1:end-2),1,ng));        otherwise            fe=mel2frq(me);            xg=mel2frq(repmat(linspace(0,1,ng),p,1).*repmat(me(3:end)-me(1:end-2),1,ng)+repmat(me(1:end-2),1,ng));    end    v=1-abs(linspace(-1,1,ng));    if any(w=='n')        v=0.5-0.5*cos(v*pi);    elseif any(w=='m')        v=0.5-0.46/1.08*cos(v*pi);    end    v=v*sfact;    v=repmat(v,p,1);    if any(w=='y')        v(1,xg(1,:)<fe(2))=sfact;        v(end,xg(end,:)>fe(p+1))=sfact;    end    if any(w=='u')        dx=(xg(:,3:end)-xg(:,1:end-2))/2;        dx=dx(:,[1 1:ng-2 ng-2]);        vs=sum(v.*dx,2);        v=v./repmat(vs+(vs==0),1,ng)*fs/n;    end    plot(xg',v','b');    set(gca,'xlim',[fe(1) fe(end)]);    xlabel(['Frequency (' xticksi 'Hz)']);end

3 仿真结果

4 参考文献

[1]周代勇, 曾妍萍, 蔡燕. 基于Matlab的语音识别端点检测算法研究与实现[J]. 内江科技, 2013, 34(9):2.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值