40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
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}") |