java 简单判断录音是否有人声(1) vad语音活动检测

自用

仅核心部分

原理

采样率16000,即每秒16000个声音数据,根据每0.12秒的(160000.12=1920个)声音数据平均数大小判断人声,大于VadParam定为有人声*

//VadParam 最重参数,判断人声权值
int VadParam=500,expirationTime=5000;
AudioFormat af=new AudioFormat(16000f, 16, 1, true,true);
//采样率16000 16bit的采样精度
// 记录开始录音的时间
startPlay = System.currentTimeMillis();

// 将字节数组包装到流里,最终存入到baos中
//每0.12秒检测一次,正在录音
// 0.12160002=19202=3840 字节
movementTimer = new Timer(120, new ActionListener() {
byte[] buffer;
private int res;
String a;
@Override
public void actionPerformed(ActionEvent e1) {
long audioTime=System.currentTimeMillis()-startPlay;
// repaint();
buffer=baos.toByteArray();
if(buffer!=null&&buffer.length>0) {
System.out.println("the length is "+buffer.length);
//判断无人说话 vad语音活动检测
double sum3=0;
//取每次最后0.12 0.12
160002=19202=3840
for (int i = buffer.length-3840; i < buffer.length - 1; i=2+i) {
a=String.format(“%02X%02X”, buffer[i + 1],buffer[i ]);
res = (buffer[i] & 0x000000FF) | (((int) buffer[i + 1]) << 8);
sum3+=Math.abs(res);
// if(i<10) {
// System.out.println(a);
// System.out.println(Integer.valueOf(a,16).shortValue());
// System.out.println(res);
// }
//
}
double avg3=sum3/1920;
System.out.println(sum3+“/”+1920+“=”+avg3);
if(avg3<VadParam&&audioTime>3000) {
Toolkit.getDefaultToolkit().beep();//windows警告声
mouseReleased(e);;//模拟鼠标释放触发结束
}
}
//打印当前时间
System.out.println("At the stone,the time is "+(System.currentTimeMillis()-startPlay));
if(System.currentTimeMillis()-startPlay>expirationTime) {
//使用工具箱里面默认的工具包 获取到“叮”的一声提醒
Toolkit.getDefaultToolkit().beep();
mouseReleased(e);//模拟鼠标释放触发结束
}
}
});
movementTimer.start();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值