Burada n kanal ve 8,16,24 ... bit için çalışan yerleşik dalga modülünü [1] kullanan bir Python 3 çözümü.
import sys
import wave
def read_wav(path):
with wave.open(path, "rb") as wav:
nchannels, sampwidth, framerate, nframes, _, _ = wav.getparams()
print(wav.getparams(), "\nBits per sample =", sampwidth * 8)
signed = sampwidth > 1
byteorder = sys.byteorder
values = []
for _ in range(nframes):
frame = wav.readframes(1)
channel_vals = []
for channel in range(nchannels):
as_bytes = frame[channel * sampwidth: (channel + 1) * sampwidth]
as_int = int.from_bytes(as_bytes, byteorder, signed=signed)
channel_vals.append(as_int)
values.append(channel_vals)
return values, framerate
Sonucu bir NumPy dizisine dönüştürebilirsiniz.
import numpy as np
data, rate = read_wav(path)
data = np.array(data)
Not, hızlı yerine okunabilir hale getirmeye çalıştım. Tüm verileri aynı anda okumanın neredeyse 2 kat daha hızlı olduğunu öğrendim. Örneğin
with wave.open(path, "rb") as wav:
nchannels, sampwidth, framerate, nframes, _, _ = wav.getparams()
all_bytes = wav.readframes(-1)
framewidth = sampwidth * nchannels
frames = (all_bytes[i * framewidth: (i + 1) * framewidth]
for i in range(nframes))
for frame in frames:
...
Python ses dosyası kabaca 2 kat daha hızlı olmasına rağmen (bu hıza saf CPython ile yaklaşmak zordur).
[1] https://docs.python.org/3/library/wave.html