package audio // Copied from VoxInput import ( "encoding/binary" "io" ) // WAVHeader represents the WAV file header (44 bytes for PCM) type WAVHeader struct { // RIFF Chunk (12 bytes) ChunkID [4]byte ChunkSize uint32 Format [4]byte // fmt Subchunk (16 bytes) Subchunk1ID [4]byte Subchunk1Size uint32 AudioFormat uint16 NumChannels uint16 SampleRate uint32 ByteRate uint32 BlockAlign uint16 BitsPerSample uint16 // data Subchunk (8 bytes) Subchunk2ID [4]byte Subchunk2Size uint32 } func NewWAVHeader(pcmLen uint32) WAVHeader { header := WAVHeader{ ChunkID: [4]byte{'R', 'I', 'F', 'F'}, Format: [4]byte{'W', 'A', 'V', 'E'}, Subchunk1ID: [4]byte{'f', 'm', 't', ' '}, Subchunk1Size: 16, // PCM = 16 bytes AudioFormat: 1, // PCM NumChannels: 1, // Mono SampleRate: 16000, ByteRate: 16000 * 2, // SampleRate * BlockAlign (mono, 2 bytes per sample) BlockAlign: 2, // 16-bit = 2 bytes per sample BitsPerSample: 16, Subchunk2ID: [4]byte{'d', 'a', 't', 'a'}, Subchunk2Size: pcmLen, } header.ChunkSize = 36 + header.Subchunk2Size return header } func (h *WAVHeader) Write(writer io.Writer) error { return binary.Write(writer, binary.LittleEndian, h) }