gpt4 book ai didi

android - 如何将 float 缓冲区写入到wav文件android?

转载 作者:行者123 更新时间:2023-12-02 22:15:24 25 4
gpt4 key购买 nike

我在Android中使用AudioRecord在PCM float 32中进行录制,需要将其保存到wave文件中,如何将音频的float数组转换为wave文件?

这是我的录音设置:

private AudioRecord audioRecord;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_FLOAT;
private int bufferSize;

public CoughAudioRecord(int samplingRate, String MODEL_FILE){
//load and configure audio recorder
bufferSize = 2 * AudioRecord.getMinBufferSize(samplingRate, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, samplingRate,
RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSize);
}

以及当前我如何阅读音频:
final int readSize = audioRecord.read(audioData, 0, audioData.length, AudioRecord.READ_BLOCKING);

最佳答案

没有内置的解决方案/库,这太奇怪了。如果某人有空余时间来创造一天,那应该很棒。此解决方案是Internet上某些方面的组合。

  • Create 32bit float wav file in python?
  • https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1/core/java/android/speech/srec/WaveHeader.java
  • http://soundfile.sapp.org/doc/WaveFormat/

  • 编码:
    import java.io.OutputStream

    class WaveFileWriter(
    private val out: OutputStream,
    private val sampleRate: Int,
    private val numChannels: Short,
    ) {

    fun write(waveform: FloatArray) {
    val mNumBytes = 4 * waveform.size
    val audioFormat: Short = 3
    val bitPerSample: Short = 32

    writeHeader(mNumBytes, audioFormat, bitPerSample)
    waveform.map(Float::toRawBits).forEach(this::writeInt)

    out.flush()
    out.close()
    }


    private fun writeHeader(numBytes: Int, audioFormat: Short, bitPerSample: Short) {
    val bytePerSample = bitPerSample / 8
    val byteRate = numChannels * sampleRate * bytePerSample
    val blockAlign = (numChannels * bytePerSample).toShort()

    /* RIFF header */
    writeId("RIFF")
    writeInt(36 + numBytes)
    writeId("WAVE")
    /* fmt chunk */
    writeId("fmt ")
    writeInt(16)
    writeShort(audioFormat)
    writeShort(numChannels)
    writeInt(sampleRate)
    writeInt(byteRate)
    writeShort(blockAlign)
    writeShort(bitPerSample)
    /* data chunk */
    writeId("data")
    writeInt(numBytes)
    }

    private fun writeId(id: String) = id.map(Char::toInt).forEach(out::write)

    private fun writeInt(i: Int) {
    out.write(i shr 0)
    out.write(i shr 8)
    out.write(i shr 16)
    out.write(i shr 24)
    }


    private fun writeShort(i: Short) {
    out.write(i.toInt() shr 0)
    out.write(i.toInt() shr 8)
    }
    }

    关于android - 如何将 float 缓冲区写入到wav文件android?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62394849/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com