У меня есть два решения для блочного чтения / потоковой передачи файлов WAV.
Это номер один. Я написал это сам, так что не передавайте это.
def stream_gen(path: str):
WINDOW_s = 10
HEADER = 44
bytes_per_sampling: int
samplerate: int
CHUNk: int
first_block = True
run = True
with open(path, 'rb') as stream:
data = stream.read(HEADER)
samplerate = int.from_bytes(data[24:28], byteorder='little')
bits_per_sampling = int.from_bytes(data[34:36], byteorder='little')
if bits_per_sampling == 16:
dtype = 'int16'
elif bits_per_sampling == 32:
dtype = 'int32'
else:
raise IOError()
CHUNK = WINDOW_s * samplerate * (bits_per_sampling // 8)
while run:
data = stream.read(CHUNK)
if data == b'':
break
yield(np.frombuffer(data, dtype=dtype))
Номер два - очевидный выбор. Это было написано профессионалами.
def soundfile_gen(path):
window_s = 10
samplerate = sf.info(path).samplerate
blocksize = samplerate * window_s
block_gen = sf.blocks(path, blocksize=blocksize)
return block_gen