⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 originalspeech.m

📁 很好的MATLAB开发源程序 基于VQ矢量量化的语音识别程序
💻 M
字号:
%将原始语音x端点检测,将检测出的各段语音数据保存在originalspeechdata中
function originalspeech1(x)
%幅度归一化到[-1,1]
x=double(x);
x=x/max(abs(x));

%常数设置
FrameLen=240;        %8k采样,30ms对应240点
FrameInc=240;         %30ms对应桢移240点

amp1=2;
amp2=0.3;

zcr2=0.0005;

maxsilence=3; %3*30ms=90ms
minlen=6;	%10*30ms=300ms
status=0;
count=0;    %语音长度
silence=0;

%计算过零率
tmp1=enframe(x(1:length(x)-1),FrameLen,FrameInc);
tmp2=enframe(x(2:length(x)),FrameLen,FrameInc);
signs=(tmp1.*tmp2)<0;
diffs=(tmp1-tmp2)>0.02;
zcr=sum(signs.*diffs,2);

%计算短时能量
amp=sum(abs(enframe(filter([1-0.9375],1,x),FrameLen,FrameInc)),2);

%调整能量门限
amp1=min(amp1,max(amp)/4);
amp2=min(amp2,max(amp)/9);
d=zeros(20,1);
d(1)=1;
d(2)=1;
%开始端点检测
for i=0:10
    
    status=0;
    count=0;
    for n=d(2*i+1):length(zcr)
     
        switch status
     
       
        case 0,					%2=语音段
            if amp(n)>amp2|zcr(n)>zcr2	%保持在语音段
                count=count+1;
                status=1;
                silence=0;
            else				%静音状态
                status=0;
                count=0;
            end
        case 1,
            if amp(n)>amp2|zcr(n)>zcr2	%保持在语音段
                count=count+1;
                d(2*i+1)=max(n-count,1);
            else				%语音将结束
                silence=silence+1;
                if silence<maxsilence	%静音还不够长,尚未结束
                    count=count+1;
               elseif count<minlen	%语音长度太短,认为是噪声
                    status=0;
                    silence=0;
                    count=0;
                else 			%语音结束
                    status=2;
                end
            end
        case 2,
            break;
        end
    end
    
    count=count-silence/2;
    d(2*i+2)=d(2*i+1)+count-0.5;
    
    d(2*i+3)=fix(d(2*i+2)+5);
    d(2*i+4)=fix(d(2*i+2)+5);
end




subplot(311)
plot(x)
axis([1 length(x) -1 1])
ylabel('OriginalSpeech');
for i=1:22
    line([d(i)*FrameInc d(i)*FrameInc],[-1,1],'Color','red');
end

subplot(312)
plot(amp);
axis([1 length(amp) 0 max(amp)])
ylabel('Energy');
for i=1:22
    line([d(i) d(i)],[min(amp),max(amp)],'Color','red');
end

subplot(313)
plot (zcr);
axis([1 length(zcr) 0 max(zcr)])
ylabel('ZCR');
for i=1:22
    line([d(i) d(i)],[min(zcr),max(zcr)],'Color','red');
end




n=d(2)-d(1);
p=d(1)*240;
v1=x(p+1:p+240);
cx=lpc(v1,12)';
c3=cx(2:13);
p=p+240;

for i=1:n-1
    y=x(p+1:p+240);
    cx1=lpc(y,12)';
    c1=cx1(2:13);
    c3=horzcat(c3,c1);
    v1=vertcat(v1,y);
    p=p+240;
end
sd=v1;



for i=1:10
n=d(2*i+2)-d(2*i+1);
p=d(2*i+1)*240;
v1=x(p+1:p+240);
cx1=lpc(v1,12)';
c1=cx1(2:13);
p=p+240;

for i=1:n-1
    y=x(p+1:p+240);
    cx2=lpc(y,12)';
    c2=cx2(2:13);
    c1=horzcat(c1,c2);
    v1=vertcat(v1,y);
    p=p+240;
end
c3=horzcat(c3,c1);
sd=vertcat(sd,v1);
end


save('originalspeechdata','sd');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -