我已经将我的问题隔离到了最低限度:读取WAV文件,并立即将其写回。输出是噪音,尽管输入是音乐。这让我很困惑。这是代码:
import scipy.io.wavfile as wavfile
rate, data = wavfile.read("myinput.wav")
wavfile.write("myoutput.wav", rate, data)
据推测,我做的事非常愚蠢。有人可以告诉我如何让它发挥作用吗?
P.S。在读入和写出之间添加“打印数据”会产生......
[ 889195140 456589342 2605824 ..., 221785355 1292756287 873860659]
答案 0 :(得分:1)
通过一些额外的转换,您可以使用标准库中wave
模块的24位WAV文件。
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 notebook with some more information。
当然,您也可以使用scikits.audiolab
,但在使用np.float64
以外的类型时,请注意当前(版本0.11.0)存在错误(https://github.com/cournape/audiolab/issues/3)!
你也可以试试https://github.com/bastibe/PySoundFile,但我自己还没试过(还)。
答案 1 :(得分:0)
感谢您提供了许多有用的评论。
我不知道24位问题,但搜索我看到很多线程和建议的修复程序与此问题相关。对我来说,我会按照用户LMO在link中描述的方式使用scikits.audiolab,我在Mac上通过MacPorts和easy_install使用Python 2.7。
sudo port install libsndfile; sudo easy_install-2.7 scikits.audiolab
然后最终代码使用audiolab进行读入(可以使它在写入时也一样)...
import scipy.io.wavfile as wavfile
import numpy as np
from scikits.audiolab import Sndfile
f = Sndfile("myinput.wav", 'r')
data = np.array(f.read_frames(f.nframes), dtype=np.float64)
f.close()
rate = f.samplerate;
wavfile.write("myoutput.wav", rate, data)
这适用于有问题的文件和许多其他文件。