通过一些额外的转换,您可以将 24 位 WAV 文件与wave
标准库中的模块一起使用。
import wave
import numpy as np
from contextlib import closing
def pcm24to32(data, nchannels=1):
temp = np.zeros((len(data) / 3, 4), dtype='b')
temp[:, 1:] = np.frombuffer(data, dtype='b').reshape(-1, 3)
return temp.view('<i4').reshape(-1, nchannels)
def pcm2float(sig, dtype=np.float64):
sig = np.asarray(sig) # make sure it's a NumPy array
assert sig.dtype.kind == 'i', "'sig' must be an array of signed integers!"
dtype = np.dtype(dtype) # allow string input (e.g. 'f')
# Note that 'min' has a greater (by 1) absolute value than 'max'!
# Therefore, we use 'min' here to avoid clipping.
return sig.astype(dtype) / dtype.type(-np.iinfo(sig.dtype).min)
with closing(wave.open('my_24bit_input.wav')) as w:
framerate = w.getframerate()
nframes = w.getnframes()
nchannels = w.getnchannels()
width = w.getsampwidth()
data = w.readframes(nframes)
assert width == 3
pcm = pcm24to32(data, nchannels)
# You can also use np.float64, if you prefer:
normalized = pcm2float(pcm, np.float32)
我创建了一个包含更多信息的 IPython 笔记本。
当然,您也可以使用scikits.audiolab
,但请注意,当前(版本 0.11.0)在使用!以外的类型时存在错误( https://github.com/cournape/audiolab/issues/3 )np.float64
您也可以尝试https://github.com/bastibe/PySoundFile,但我自己(还)没有尝试过。