Java 从麦克风录制的声音的音量

Java 从麦克风录制的声音的音量,java,audio,javasound,Java,Audio,Javasound,我正试图编写一个小程序,当用户说话时做出反应。比如让一个圆圈变大或者类似的东西 我使用此代码访问麦克风,但如何使其仅在用户说话时作出反应?e、 g.当记录的音量大于某个量时 TargetDataLine line = null; AudioFormat format = new AudioFormat(16000, 16, 1, true, true); DataLine.Info info = new DataLine.Info(TargetDataLine.class

我正试图编写一个小程序,当用户说话时做出反应。比如让一个圆圈变大或者类似的东西

我使用此代码访问麦克风,但如何使其仅在用户说话时作出反应?e、 g.当记录的音量大于某个量时

    TargetDataLine line = null;
    AudioFormat format = new AudioFormat(16000, 16, 1, true, true);
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);

    if(! AudioSystem.isLineSupported(info)){
        System.out.println("Line is not supported");
    }

    try{
        line = (TargetDataLine) AudioSystem.getLine(info);
        line.open();
    }catch(LineUnavailableException e){
        System.out.println("Failed to get line");
        System.exit(-1);
    }

    ByteArrayOutputStream out  = new ByteArrayOutputStream();
    int numBytesRead;
    byte[] data = new byte[line.getBufferSize() / 5];

    // Begin audio capture.
    line.start();

    int i = 0;

    // Here, stopped is a global boolean set by another thread.
    while (i<100) {
       // Read the next chunk of data from the TargetDataLine.
       numBytesRead =  line.read(data, 0, data.length);
       // Save this chunk of data.
       out.write(data, 0, numBytesRead);
       i++;
       System.out.println(i);
    }    
TargetDataLine line=null;
AudioFormat格式=新的AudioFormat(16000,16,1,真,真);
DataLine.Info=newdataline.Info(TargetDataLine.class,格式);
如果(!AudioSystem.isLineSupported(信息)){
System.out.println(“不支持行”);
}
试一试{
line=(TargetDataLine)AudioSystem.getLine(info);
line.open();
}捕获(LineUnavailableException e){
System.out.println(“无法获取行”);
系统退出(-1);
}
ByteArrayOutputStream out=新建ByteArrayOutputStream();
int numBytesRead;
字节[]数据=新字节[line.getBufferSize()/5];
//开始音频捕获。
line.start();
int i=0;
//这里,stopped是另一个线程设置的全局布尔值。

(i在最后一个while循环中,您正在一个名为“data”的缓冲变量中收集声音数据。您需要做的是将这些字节组合成可用的DSP值。执行此操作的代码取决于格式。最常见的是16位编码、立体声、小尾端。在这种情况下,您必须将成对的字节组合成值,其中第一个字节为低位,第二个字节为高位。共有七个ral就这一主题发表文章,详细介绍如何处理这一问题

值的范围从-32768到32767(我是从内存中写入的,可能是关闭的,但这是一个短的范围)。很难说您希望阈值在哪里,因为音量不仅取决于绝对值(越大声音越大),还取决于花在较大值上的时间量。可能是“安静”声音的瞬变值非常大。此外,数字与分贝不直接对应,需要一个转换公式


因此,有几个问题需要解决,但是如果你只是进入while循环并解码“数据”,你可能会得到一些快速而肮脏的东西,这些东西工作得“足够好”.

可能重复,因此从该行读取的字节流由2字节值组成。我必须找到一个阈值,以查看对我来说足够大的音量,并将其设置为数字?是和否。(1)如果有立体声,左声道可能为2字节,右声道可能为2字节。(2)你可能想做一些滚动平均,这样你就不会对每一个超过极限的瞬间做出反应。