Повторно создайте файл wav, считанный в буфер двойных значений (JAVA) - PullRequest
0 голосов
/ 05 июня 2019

Я использовал следующий код (на основе кода, найденного на этом сайте: http://www.labbookpages.co.uk/audio/javaWavFiles.html) для чтения файла wav и создания буфера двойных значений (аудиокадров):

    // Open the wav file specified as the first argument
        WavFile wavFile = WavFile.openWavFile(new File("recording_1536059009.wav"));

        sampleRate = (int) wavFile.getSampleRate();

        System.out.println("SR " + sampleRate);

        // Display information about the wav file
        wavFile.display();


        System.out.println("");

        // Create a variable that stores number of frames in file.
        int numFrames = (int) wavFile.getNumFrames();

        double duration = numFrames/sampleRate;

        System.out.println("duration is  " + duration);


        // Get the number of audio channels in the wav file
        int numChannels = wavFile.getNumChannels();

        // Create a buffer of frames
        double[] buffer = new double[numFrames * numChannels];

        int framesRead;

        do {
            // Read frames into buffer
            framesRead = wavFile.readFrames(buffer, numFrames);

        } while (framesRead != 0);

Затем я разделяю буфер на порции секций высокой энергии на основе порогового значения: (порции - это группы последовательных кадров (двойные значения), которые выше этого порога, они будут выглядеть примерно так).

                      3.0517578125E-5
                      9.1552734375E-5
                      3.0517578125E-5
                      9.1552734375E-5

Это код, который я использовал для разделения буфера двойных значений на эти «чанки», составляющие значимое событие.

    ArrayList<Double> significantEvent = new ArrayList<Double>();

    ArrayList<ArrayList<Double>> significantEventCollect = new ArrayList<ArrayList<Double>>();

    for (int loop = 0; loop <  buffer.length; loop++) {


        if (buffer[loop] >= threshold) {
            significantEvent.add(buffer[loop]);
             System.out.println(buffer[loop]);

        } else if (buffer[loop] < threshold && significantEvent.size() > 0) {
             System.out.println("");



            significantEventCollect.add(significantEvent);



            significantEvent = new ArrayList<Double>();

Я бы хотел превратить эти чанки обратно в их собственный файл WAV, чтобы они моглибудет воспроизведено.

До сих пор я не нашел возможности добиться этого с помощью одних только этих данных.

Любые указания относительно моих следующих шагов для этого были бы весьма признательны.

...