自用
仅核心部分
原理
采样率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.12160002=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();