离线版-端点检测代码重写

根据对双门限的理解和修改,重写了一个离线版端点检测。

function [st,en]=VAD(x, fs)
x=double(x);
x=x/max(abs(x));
framelen= floor(fs*40/1000);%
frameinc= floor(fs*10/1000);%
y=enframe(x,framelen,frameinc);
%计算短时间能量
amp=sum(abs(y),2);
%开始端点检测
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.01;
zcr=sum(signs.*diffs,2);  %
zcr=[zcr;zcr(end)];
zcr_yu=0.2*mean(zcr);%yuzhi=0.2*mean(amp);%
minspeech=10;
count=0;%
start=[];
tail=[];
N=length(amp);
flag=0;%

biaozhi2=0;
biaozhi3=0;
%%%%%%%%%%%%
for n=1:N
    if amp(n)<yuzhi || (zcr(n)<zcr_yu)
        continue;
    end
    kaitou=n;
    break;
end
for n=N:-1:1
    if amp(n)<yuzhi || (zcr(n)<zcr_yu)
        continue;
    end
    jiewei=n;
    break;
end
noise=[amp(1:kaitou-1);amp(jiewei+1:end)];
noise_mean=mean(noise);
noise_var = std(noise);
speech_mean=mean(amp(kaitou:jiewei));%noise_mean
yuzhi1= 0.3*speech_mean; %
yuzhi2= max(0.3*speech_mean , (noise_mean + noise_var)*1.3);%

noise_zcr=[zcr(1:kaitou-1);zcr(jiewei+1:end)];
noise_zcr_mean = mean(noise_zcr);
noise_zcr_std = std(noise_zcr);
speech_zcr_mean=mean(zcr(kaitou:jiewei));
zcr_yu1 = 0.3*speech_zcr_mean;
zcr_yu2 = max(0.3*speech_zcr_mean , (noise_zcr_mean+noise_zcr_std)*0.3);
%%%%%%%%%%%%%%

st = [];
en = [];
bstart_state = 0;
bend_state = 0;
segment = 0;
unvoice = 0;
voice_min_len = 7;% 最短语音长度70ms
unvoice_min_len = 5;%结束段最小持续50ms
st_candicate = 0;
en_candicate = 0;
for  i = 1:N    

    if( (amp(i) >= yuzhi2 && zcr(i) >= zcr_yu1) && ~bstart_state ) %find  start
            bstart_state = 1;  %
            if(~st_candicate)
                st_candicate = i;
            end
            segment = segment + 1;            

    elseif( (amp(i) >= yuzhi2 || zcr(i) >= zcr_yu1) && bstart_state )%
        if(unvoice >= unvoice_min_len) %
            st = [st; st_candicate];
            en_candicate = en_candicate + unvoice_min_len - 1;
            en = [en; en_candicate];
            bstart_state = 0;
            bend_state = 1;
            unvoice = 0;
            segment = 0;
            st_candicate = 0;
        else %
            unvoice = 0;  %
            bend_state = 0;
            segment = segment + 1;
        end
    elseif( (amp(i) < yuzhi2 && zcr(i) < zcr_yu1)  && bstart_state )     %
         if segment >= voice_min_len  %
             unvoice = unvoice + 1; %
             if ~bend_state  %
                 en_candicate = i;
             end
             bend_state = 1; %
         else %
             bstart_state = 0; %
             segment = 0;
             bend_state = 0;
             unvoice = 0;
             st_candicate = 0;
             %prepare_for_start = 0;
             en_candicate = 0;
         end         

    elseif((amp(i) >= yuzhi2 || zcr(i) >= zcr_yu1) && ~bstart_state) %
          if ~ st_candicate
              st_candicate = i;
          end
    else%        st_candicate = 0;
        continue;
    end

end

if(unvoice >= unvoice_min_len )%    st = [st; st_candicate];
    en = [en; (en_candicate + unvoice_min_len -1)];
    segment = 0;
end
if( segment >= voice_min_len) %    st = [st; st_candicate];
    en = [en; N];
end

figure(1);subplot(3,1,1)
plot(x);  %原始语音波形
axis([1,length(x),-1,1])
ylabel(‘speech‘);
xlabel(‘样本点‘);

for  k=1:length(st)
line([st(k)*frameinc,st(k)*frameinc],[-1,1],‘linestyle‘,‘:‘,‘color‘,‘blue‘,‘LineWidth‘,2);
line([en(k)*frameinc,en(k)*frameinc],[-1,1],‘linestyle‘,‘:‘,‘color‘,‘red‘,‘LineWidth‘,2);
end

subplot(3,1,2)
plot(amp);%原始语音能量
axis([1,length(amp),0,max(amp)])
ylabel(‘energy‘);
xlabel(‘帧数‘);
line([1,N],[yuzhi1,yuzhi1],‘color‘,‘yellow‘,‘LineWidth‘,2);%由语音能量
line([1,N],[yuzhi2,yuzhi2],‘color‘,‘red‘,‘LineWidth‘,2);%由噪声平均能量和语音能量比较而得

for  k=1:length(st)
line([st(k),st(k)],[min(amp),max(amp)],‘linestyle‘,‘:‘,‘color‘,‘blue‘,‘LineWidth‘,2);
line([en(k),en(k)],[min(amp),max(amp)],‘linestyle‘,‘:‘,‘color‘,‘red‘,‘LineWidth‘,2);
end

subplot(3,1,3)
plot(zcr);%原始语音过零率
axis([1,length(zcr),0,max(zcr)])
ylabel(‘zcr‘);
xlabel(‘帧数‘);
line([1,N],[zcr_yu1,zcr_yu1],‘color‘,‘yellow‘,‘LineWidth‘,2);%由语音能量
line([1,N],[zcr_yu2,zcr_yu2],‘color‘,‘red‘,‘LineWidth‘,2);%语音加噪音

for  k=1:length(st)
line([st(k),st(k)],[min(zcr),max(zcr)],‘linestyle‘,‘:‘,‘color‘,‘blue‘,‘LineWidth‘,2);
line([en(k),en(k)],[min(zcr),max(zcr)],‘linestyle‘,‘:‘,‘color‘,‘red‘,‘LineWidth‘,2);

end

end

用语音识别的强制对齐自动切分连续语音汉字,工程量和资源巨大,此处做了个简易版的汉字自动切分,效果还可以。

时间: 2024-08-18 00:40:28

离线版-端点检测代码重写的相关文章

bzoj3545 &amp;&amp; bzoj3551 Peaks(离线版&amp;&amp;在线版)

题目给n点m边的无向图,有点权和边权 每次询问求点v在经过路径上的边都不超过w的情况下,能到达的第k大的点的权值 首先离线版比较容易想到,属于我现在能码出来的最难的码农题之一吧T T 这道题思路是这样的 1.对于边权的限制条件,可以先想到做一棵最小生成树 2.对于第k大这种询问,可以建权值线段树,但是山的高度太大到1e9,所以我们还要先离散化到1e6的水平才能用线段树 3.显然不能对每个询问w都建线段树,因此要用到主席树.具体做法是将询问和边权都排序(详情看代码),给每个点建一棵线段树,然后边建

分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.NET Socket Tcp 技术实现的分布消息总线,也是一个简单的发布订阅框架: 并且以案例的形式为大家演示了如何使用这个分布式消息总线架构发布订阅架构模式的应用程序,在得到各位同仁的反馈的同时,大家也非常想了解订阅者离线的情况,即支持离线构发布订阅框架. 二.离线架构 不同于订阅者.发布者都同时在

关于执行findbugs,checkstyle,jacoco插件检测代码,GitHook的脚本编写

Git钩子的作用: (pre-commit ) 在用户执行 git commit -m "xxx" 命令之前,先执行pre-commit文件中的脚本命令 在pre-commit文件中,编写脚本 执行pom.xml中配置的各种插件 对代码先进行检测 如果所有插件都检测通过,git commit 命令才能执行成功,然后才能继续执行 git push 命令 否则 commit失败,git push的内容会为空. 简而言之:就是控制代码的提交,在代码提交到远程仓库之前会先对代码进行检查(检查内

堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出

 报错:0x000CC3C9 处有未经处理的异常(在 image_opencv2.exe 中):  堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出. 主要检查代码中有没有对数组的越界操作,就解决了这个bug. 其它的相关知识查后再补充.

visual studio 2015离线版msdn下载和安装

2014年11月13日,微软发布了Visual Studio 2015 Preview,但是Visual Studio 2015 的msdn该如何安装呢?下面脚本之家就为大家分享一篇visual studio 2015离线版msdn下载和安装图文教程,一起来看看吧! 百度云链接:http://pan.baidu.com/s/1eQqzp4m 工具/原料 windows 8.1 Visual Studio 2015 Preview 方法/步骤 1.如果不知道如何下载和安装Visual Studio

微信开通程序 破解版微信检测助手

如今新入微商行业的大军很多,同样的一个产品做得人越来越多!那么问题来了,客源哪里来,你有好东西,卖给谁?你天天发广告,谁看?很多人只知道在自己朋友圈简单发布一些产品广告,如果光靠你目前那点质量低下的朋友圈.你就是刷爆了也没有成交量的,只会让你的朋友慢慢的把你拉黑,现在大部分人每天都在辛苦的上传产品讯息,首先要知道,朋友圈内的人绝大部分都是自己朋友.亲戚,所以精准客户相对来说寥寥无几. 微信开通程序 破解版微信检测助手 今天小编就交给大家一些比较实用的方法及教你使用微商加好友的便捷工具. 先说说绝

VS Code C# 插件离线版 1.6.2

VS Code C# 插件离线版,目前最新稳定版为:1.6.2 . 由于在扩展中下载C#插件总是缓慢,或者容易出现错误,特制作离线版本共享出来. 本离线版本为Windows版本,其他系统请在扩展中下载官方插件. VS Code C# 1.6.2版本下载地址:C# 1.6.2离线版本(密码:mQdd) 安装教程: 打开VS Code ->扩展,然后选择点击右侧的三个点 ->从 VSIX 安装->选择插件文件即可.

HectorSLAM论文解析?代码重写(2)

这篇文章为HectorSLAM系列的以下部分 HectorSLAM的整体逻辑 激光匹配 地图构造 地图更新 500行代码重写一个LidarSLAM 测试数据的准备,和测试数据读取模块的编写 GUI编写 地图模块的编写 核心模块的编写 主循环 匹配算法 首先绘制一张以扫描匹配为核心的SLAM(例如Hector,Karto_slam,Cartographer..)大概的流程图: 基本上以这一类SLAM流程分以下几个部分: motion prediction(运动预测) scan matching(扫

Node.js的Connect框架的代码重写与改进

Node.js的Connect框架的代码重写与改进 Connect框架简介 Connect框架是建立在Node.js的基本http.server功能之上,帮助实现结构化的web服务器逻辑的框架.Connect框架建立在两个重要的设计模式之上. 1) 责任链模式 在处理web请求时常需要作分派处理.例如,ASP.NET MVC支持按照请求参数将处理分派至某个Controller类的某个Action方法,以及根据Action方法的返回结果类型分派不同的结果操作(如ViewResult.JsonRes