นี่คือโซลูชัน Python 3 โดยใช้โมดูลคลื่นในตัว [1] ซึ่งใช้ได้กับ n ช่องทางและ 8,16,24 ... บิต
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
คุณสามารถเปลี่ยนผลลัพธ์ให้เป็นอาร์เรย์ NumPy
import numpy as np
data, rate = read_wav(path)
data = np.array(data)
หมายเหตุฉันพยายามทำให้อ่านได้แทนที่จะเร็ว ฉันพบว่าการอ่านข้อมูลทั้งหมดในครั้งเดียวเร็วขึ้นเกือบ 2 เท่า เช่น
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-soundfileจะเร็วกว่าประมาณ 2 คำสั่ง (ยากที่จะเข้าถึงความเร็วนี้ด้วย CPython บริสุทธิ์)
[1] https://docs.python.org/3/library/wave.html