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

📄 ez.m

📁 语音识别的一种改进
💻 M
字号:
function [x1,x2] = vad(x)
% x=wavread('changdu2.wav');
x=wavread('aaaqz.wav');
y=wavread('babble.wav');
snr=0;
x=jnoise(x,y,snr);%给信号加入一定的信噪比
%幅度归一化到[-1,1]
x = double(x);
x = x / max(abs(x));
x=filter([1 -0.975], 1, x);
%常数设置
FrameLen = 240;
FrameInc = 80;

amp1 = 8;
amp2 = 5;
zcr1 = 8;
zcr2 = 5;

maxsilence = 5;  % 6*10ms  = 30ms
minlen  = 20;    % 15*10ms = 150ms
status  = 0;
count   = 0;
silence = 0;
xn=1;%计算一共有多少语音段

%计算过零率
tmp1  = enframe(x(1:end-1), FrameLen, FrameInc);
tmp2  = enframe(x(2:end)  , 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)/8);
% 
% 开始端点检测
x1 = 0; 
x2 = 0;
for n=1:length(zcr)             %xn记录连续语音中字的段数(几个字)
   
   switch status
   case {0,1}                   % 0 = 静音, 1 = 可能开始
      if amp(n) > amp1 | zcr(n)>zcr1         % 确信进入语音段
         x1(xn) = max(n-count(xn)-1,1);
         status  = 2;
         %silence(xn) = 0;
         count(xn)   = count(xn) + 1;
      elseif amp(n) > amp2 |  zcr(n) > zcr2 % 可能处于语音段
             
         status = 1;
%         count(xn)  = count(xn) + 1;
      else                       % 静音状态
         status  = 0;
         count(xn)   = 0;
         silence(xn)=0;
         x1(xn)=0;
         x2(xn)=0;
      end
   case 2,                       % 2 = 语音段
      if amp(n) > amp2 | zcr(n) > zcr2     % 保持在语音段
         
         count(xn) = count(xn) + 1;
      else                       % 语音将结束
         silence(xn)  = silence(xn) +1;
         if silence < maxsilence % 静音还不够长,尚未结束
            count(xn)  = count(xn) + 1;
         elseif count(xn) < minlen   % 语音长度太短,认为是噪声
            status  = 0;
            silence(xn)  = 0;
           
         else                    % 语音结束
            status  = 3;
         end
      end
   case 3,
       
        status  = 0;          
        xn=xn+1;   
      
   end

end   

%--------------以下绘图程序


count = count-silence./2;
x2 = x1 + count -1;
% x1=[132 82 0];
% x2=[161 128 -1];
subplot(311);
plot(x);
axis([1 length(x) -1 1]);
ylabel('归一化幅度');
xlabel('样点数');
for(xn=1:length(x1))
line([x1(xn)*FrameInc x1(xn)*FrameInc],[-1 1],'Color','red');
line([x2(xn)*FrameInc x2(xn)*FrameInc],[-1 1],'Color','green');
end;

subplot(312);
plot(amp);
axis([1 length(amp) min(amp) max(amp)]);
ylabel('短时能量');
xlabel('帧数');
for(xn=1:length(x1))
line([x1(xn) x1(xn)],[min(amp),max(amp)],'Color','red');
line([x2(xn) x2(xn)],[min(amp),max(amp)],'Color','green');
end;

subplot(313);
plot(zcr);
axis([1 length(zcr) min(zcr)-10 max(zcr)+10]);
ylabel('过零率');
xlabel('帧数');
for(xn=1:length(x1))
line([x1(xn) x1(xn)],[min(zcr)-10,max(zcr)+10],'Color','red');
line([x2(xn) x2(xn)],[min(zcr)-10,max(zcr)+10],'Color','green');
end



⌨️ 快捷键说明

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