我试图检测静音,以便停止录制麦克风的音频。我当前的代码是:

public byte[] getRecord() throws AudioException {
    try {
        // Reset the flag
        stopped = false;

        // Start a new thread to wait during listening
        Thread stopper = new Thread(() -> {
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                br.readLine();
                stopped = true;
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            stop();
        });

        // Start the thread that can stop the record
        stopper.start();

        return record();
    } catch (Exception e) {
        throw new LineUnavailableException("Unable to record your voice", e);
    }
}

private byte[] record() throws LineUnavailableException {
    AudioFormat format = AudioUtil.getAudioFormat(audioConf);
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);

    // Checks if system supports the data line
    if (!AudioSystem.isLineSupported(info)) {
        return null;
    }

    microphone = (TargetDataLine) AudioSystem.getLine(info);
    microphone.open(format);
    microphone.start();

    System.out.println("Listening, tap enter to stop ...");

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

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

    // Here, stopped is a global boolean set by another thread.
    while (!stopped) {
        // Read the next chunk of data from the TargetDataLine.
        numBytesRead = microphone.read(data, 0, data.length);
        // Save this chunk of data.
        byteArrayOutputStream.write(data, 0, numBytesRead);
    }

    return byteArrayOutputStream.toByteArray();
}

目前,我使用shell停止录制,但是我想知道如何在while循环中停止录制。

最佳答案

经过大量尝试,现在似乎可以正常工作。这是更新的代码:

private byte[] record() throws LineUnavailableException {
    AudioFormat format = AudioUtil.getAudioFormat(audioConf);
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);

    // Checks if system supports the data line
    if (!AudioSystem.isLineSupported(info)) {
        return null;
    }

    microphone = (TargetDataLine) AudioSystem.getLine(info);
    microphone.open(format);
    microphone.start();

    System.out.println("Listening, tap enter to stop ...");

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    int numBytesRead;
    byte[] data = new byte[microphone.getBufferSize() / 5];
    short[] shorts = new short[data.length / 2];
    long startSilence = 0;
    boolean pause = false;

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

    // Here, stopped is a global boolean set by another thread.
    while (!stopped) {
        // Read the next chunk of data from the TargetDataLine.
        numBytesRead = microphone.read(data, 0, data.length);
        ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);

        // Save this chunk of data.
        byteArrayOutputStream.write(data, 0, numBytesRead);

        double rms = 0;
        for (int i = 0; i < shorts.length; i++) {
            double normal = shorts[i] / 32768f;
            rms += normal * normal;
        }
        rms = Math.sqrt(rms / shorts.length);
        System.out.println("Listening, rms is " + rms);
        if (rms < 0.1) {
            long now = System.currentTimeMillis();
            if (now - startSilence > 5000 && pause)
                break;
            if (!pause) {
                startSilence = now;
                System.out.println("Listening, new silence at " + startSilence);
            }
            pause = true;
        } else
            pause = false;
    }

    return byteArrayOutputStream.toByteArray();
}

关于java - 检测静音以通过语音获取用户输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43822266/

10-10 04:59