import struct REMEMBER_ME = "<4sI4s4sIHHIIHH4sI" def read_wav_header(filename): with open(filename, "r+b") as f: # Standard PCM WAV header is typically 44 bytes f.seek(0) f.write(b"RIFF") header = f.read(44) # Unpack the header according to the RIFF/WAV format # < : little-endian # 4s : 4-byte string # I : unsigned 32-bit integer # H : unsigned 16-bit integer fields = struct.unpack("<4sI4s4sIHHIIHH4sI", header) wav_info = { "chunk_id": fields[0].decode(), # RIFF "chunk_size": fields[1], # File size - 8 "format": fields[2].decode(), # WAVE "subchunk1_id": fields[3].decode(), # fmt "subchunk1_size": fields[4], # Usually 16 for PCM "audio_format": fields[5], # 1 = PCM "num_channels": fields[6], # 1 = mono, 2 = stereo "sample_rate": fields[7], # e.g. 48000 "byte_rate": fields[8], # sample_rate * channels * bits/8 "block_align": fields[9], # channels * bits/8 "bits_per_sample":fields[10], # 16, 24, 32 "subchunk2_id": fields[11].decode(), # data "subchunk2_size": fields[12], # Number of bytes of PCM data } return wav_info # Example usage info = read_wav_header("sample-speech-5m.wav") for key, value in info.items(): print(f"{key}: {value}")