1

我正在尝试使用文件输出流将 Short[] 写入 wav 音频文件,但该文件仅包含刮擦声。我使用 short[] 而不是 byte[] 的原因是因为我正在尝试使用提供Voice Activity Detection的外部库。我确实将Android 音频记录中提供的 wav 标头添加到 wav并且我尝试使用将 Short 数组从音频记录转换为字节数组将 Short [] 转换为 byte [] 而不会降低音频质量?但以上链接都无法帮助我。这是我的代码:

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));
            }

        });
    }
}
4

0 回答 0