14

我正在尝试使用 scipy 读取 .wav 文件。我这样做:

from scipy.io import wavfile

filename = "myWavFile.wav"
print "Processing " + filename

samples = wavfile.read(filename)

我得到了这个丑陋的错误:

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/io/wavfile.py:121: WavFileWarning: chunk not understood
  warnings.warn("chunk not understood", WavFileWarning)
Traceback (most recent call last):
  File "fingerFooler.py", line 15, in <module>
    samples = wavfile.read(filename)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/io/wavfile.py", line 127, in read
    size = struct.unpack(fmt, data)[0]
struct.error: unpack requires a string argument of length 4

我正在使用 Python 2.6.6、numpy 1.6.2 和 scipy 0.11.0

是导致问题的wav文件。

有什么想法吗?这里有什么问题?

4

5 回答 5

26

这些文件不再可用(9 个月后并不奇怪!),但为了将来参考,最可能的原因是它有 scipy 无法解析的额外元数据。

在我的例子中,它是由 Audacity 添加的默认元数据(版权、曲目名称等)——您可以在 Audacity 中打开文件并使用 File ... Open Metadata Editor 来查看它。然后使用“清除”按钮将其剥离,然后重试。

当前版本的 scipy支持以下 RIFF 块 - 'fmt'、'fact'、'data' 和 'LIST'。 RIFF 上的 Wikipedia 页面有更多关于 WAV 文件结构的详细信息,例如,您的可能包含不受支持但流行的 INFO 块

于 2013-09-23T11:57:46.320 回答
9

我对 WAV 文件格式一无所知,但深入研究scipy它看起来scipy并不熟悉文件末尾出现的块(块 ID 为bext2753632 字节,如果有帮助的话)。该块被声明为 603 字节长,因此它读取过去并期待另一个块 ID 603 字节后 - 它没有找到它(文件用完)并跌倒。

您是否在其他 WAV 文件上成功尝试过?这个是怎么产生的?

于 2013-01-15T23:37:37.693 回答
2

我遇到了同样的错误,并且可以成功转换为它可以读取的内容。

我的原始文件来自 Logic Pro。然后我大胆地阅读了文件。

于 2017-11-10T07:58:26.783 回答
1

由于 Audacity 引入了(大概)元数据,我也遇到了这个错误。我从另一个 DAW(Ableton Live)导出了我的 wav 文件,并且 scipy.io.wavfile 加载它没有错误。

于 2015-09-30T02:47:03.010 回答
0

解决这个问题最简单的方法是使用 SoX 将 wav 文件转换为其他 wav 文件。

$ sox wavfile.wav wavfile2.wav

为我工作!

于 2021-02-23T14:57:16.003 回答