声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 12268|回复: 35

[共享资源] 基于Matlab编写的语音端点检测程序

[复制链接]
发表于 2005-9-29 08:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
function [x1,x2] = vad(x)

%幅度归一化到[-1,1]
x = double(x);
x = x / max(abs(x));

%常数设置
FrameLen = 240;
FrameInc = 80;

amp1 = 10;
amp2 = 2;
zcr1 = 10;
zcr2 = 5;

maxsilence = 8;  % 6*10ms  = 30ms
minlen  = 15;    % 15*10ms = 150ms
status  = 0;
count   = 0;
silence = 0;

%计算过零率
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)
   goto = 0;
   switch status
   case {0,1}                   % 0 = 静音, 1 = 可能开始
      if amp(n) > amp1          % 确信进入语音段
         x1 = max(n-count-1,1);
         status  = 2;
         silence = 0;
         count   = count + 1;
      elseif amp(n) > amp2 | ... % 可能处于语音段
             zcr(n) > zcr2
         status = 1;
         count  = count + 1;
      else                       % 静音状态
         status  = 0;
         count   = 0;
      end
   case 2,                       % 2 = 语音段
      if amp(n) > amp2 | ...     % 保持在语音段
         zcr(n) > zcr2
         count = count + 1;
      else                       % 语音将结束
         silence = silence+1;
         if silence < maxsilence % 静音还不够长,尚未结束
            count  = count + 1;
         elseif count < minlen   % 语音长度太短,认为是噪声
            status  = 0;
            silence = 0;
            count   = 0;
         else                    % 语音结束
            status  = 3;
         end
      end
   case 3,
      break;
   end
end   

count = count-silence/2;
x2 = x1 + count -1;

subplot(311)
plot(x)
axis([1 length(x) -1 1])
ylabel('Speech');
line([x1*FrameInc x1*FrameInc], [-1 1], 'Color', 'red');
line([x2*FrameInc x2*FrameInc], [-1 1], 'Color', 'red');

subplot(312)
plot(amp);
axis([1 length(amp) 0 max(amp)])
ylabel('Energy');
line([x1 x1], [min(amp),max(amp)], 'Color', 'red');
line([x2 x2], [min(amp),max(amp)], 'Color', 'red');

subplot(313)
plot(zcr);
axis([1 length(zcr) 0 max(zcr)])
ylabel('ZCR');
line([x1 x1], [min(zcr),max(zcr)], 'Color', 'red');
line([x2 x2], [min(zcr),max(zcr)], 'Color', 'red');
回复
分享到:

使用道具 举报

发表于 2005-9-29 16:29 | 显示全部楼层
谢<BR>了<BR>
发表于 2005-11-3 14:40 | 显示全部楼层
发表于 2006-4-28 21:49 | 显示全部楼层

众里寻大哥你千百度~

大哥,俺找你找好久了,哥们毕业设计就弄的这个!多谢了多谢了,感激涕零。。。。。
发表于 2006-5-12 20:25 | 显示全部楼层
<P>这个程序对检测单个的数字很有效,可我做的毕业设计是关于孤立词的,如开机,风速一,风速二这样的两个或三个的检测就不准了,相差太远。能不能指点一下。再这先谢了,急呀!</P>
发表于 2006-5-13 14:04 | 显示全部楼层
<P>怎么没有高手进来指点一下呀??</P>
发表于 2006-5-13 16:09 | 显示全部楼层

回复:(suffer)基于Matlab编写的语音端点检测程序

<P>没仔细看过这个程序,不过我倒是还有几个语音端点检测的程序<BR><BR>至于你提的问题估计是算法本身的缺陷,你再仔细看看程序</P>
发表于 2006-5-14 13:56 | 显示全部楼层
<P>我改过最大静音参数和最小语音长度,但效果还是不好。请问你的端点检测程序能有效检测孤立词吗?能否给我发一份,我的邮箱是<a href="mailtyangxiheyangqi@163.com" target="_blank" >yangxiheyangqi@163.com</A>,多谢了。</P>
发表于 2006-5-16 22:17 | 显示全部楼层
[em01]
发表于 2006-5-16 22:21 | 显示全部楼层
啊,太好了,遇到救星了!楼主知不知道用二次门限判决法来判断一个语音信号的有声时间长度啊,或者有其他方法也可以!!急啊,毕设的题目呢,楼主你有这个程序吗?我的邮箱<a href="mailtluoluolj@126.com" target="_blank" >luoluolj@126.com</A> ,万分感激啊 !!!!
发表于 2006-5-17 10:28 | 显示全部楼层
啊,太好了,多谢楼主啊
头像被屏蔽
发表于 2006-5-20 20:20 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
头像被屏蔽
发表于 2006-5-20 20:24 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
发表于 2006-5-21 07:52 | 显示全部楼层
<P>需要改动什么才能实现 是实现程序 显示是这个 有哪位高手可以帮解答一下吗<BR>??? Strings passed to EVAL cannot contain function declarations.<BR>怎么改动才可以实现啊</P>[em06][em06]
发表于 2006-5-21 11:05 | 显示全部楼层
谢谢楼主发贴,把你顶上去。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-16 01:52 , Processed in 0.081396 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表