gpt4 book ai didi

python - SciPy wavfile : music in, 垃圾输出?

转载 作者:太空宇宙 更新时间:2023-11-03 11:53:24 26 4
gpt4 key购买 nike

我已将我的问题隔离为最低限度的问题:读入 WAV 文件,然后立即将其写回。尽管输入是音乐,但输出是噪音。这让我很困惑。这是代码:

import scipy.io.wavfile as wavfile
rate, data = wavfile.read("myinput.wav")
wavfile.write("myoutput.wav", rate, data)

大概我正在做一些非常愚蠢的事情。有人可以告诉我如何让它工作吗?

附言在读入和写出之间添加“打印数据”会产生...

[ 889195140  456589342  2605824 ...,  221785355 1292756287  873860659]

最佳答案

通过一些额外的转换,您可以将 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 notebook with some more information .

当然,您也可以使用 scikits.audiolab,但请注意,当前(版本 0.11.0)在使用 np 以外的类型时存在错误 (https://github.com/cournape/audiolab/issues/3)。 float64!

你也可以试试 https://github.com/bastibe/PySoundFile ,但我自己还没有尝试过。

关于python - SciPy wavfile : music in, 垃圾输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19780983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com