Как записать Short [] в выходной файл WAV в Android? - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь записать Short [] в аудиофайл wav, используя поток вывода файла, но файл содержит только царапающий звук . Причина, по которой я использую short [], а не byte [], заключается в том, что я пытаюсь использовать внешнюю библиотеку, которая обеспечивает Voice Activity Detection . Я добавил заголовок wav, предоставленный в Android Audio Record, в wav , и я попытался преобразовать Short [] в byte [], используя Преобразование Short массива из Audio Record в Byte array без ухудшения качества звука? но ни одна из вышеперечисленных ссылок не смогла мне помочь. Вот мой код:

private class ProcessVoice implements Runnable {

    @Override
    public void run() {
        File fl = new File(filePath, AUDIO_RECORDING_FILE_NAME);
        try {
            os = new BufferedOutputStream(new FileOutputStream(fl));
        } catch (FileNotFoundException e) {
            Log.w(TAG, "File not found for recording ");
        }
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO);

        while (!Thread.interrupted() && isListening && audioRecord != null) {
            short[] buffer = new short[vad.getConfig().getFrameSize().getValue() * getNumberOfChannels() * 2];
            audioRecord.read(buffer, 0, buffer.length);

            isSpeechDetected(buffer);
        }
    }


    private void isSpeechDetected(final short[] buffer) {
        vad.isContinuousSpeech(buffer, new VadListener() {

            @Override
            public void onSpeechDetected() {
                callback.onSpeechDetected();
                bytes2 = new byte[buffer.length * 2];
                ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(buffer);
                //Log.w(TAG, String.valueOf(buffer));
                try {
                    // // writes the data to file from buffer
                    // // stores the voice buffer
                    os.write(header, 0, 44);
                    working = true;
                    os.write(bytes2, 0, bytes2.length);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onNoiseDetected() {
                callback.onNoiseDetected();
                if(working == true){
                    working = false;
                    try {
                        doneRec();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                //Log.w(TAG, String.valueOf(bytes2));
            }

        });
    }
}
...