2013-01-14 34 views
6

我想使用scipy读取.wav文件。我这样做:scipy.io.wavfile给出“WavFileWarning:块不明白”错误

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,1.6.2 numpy的和SciPy的0.11.0

Here's一导致问题的wav文件。

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

+0

尝试'samples = wavfile.read(打开(文件名,'r'))' – Skyler

+0

试过了,仍然有同样的错误... – Eric

+0

你确定你的.wav文件是标准的吗?它是不是压缩或不? – Skyler

回答

6

我对WAV文件格式一无所知,但深入研究scipy代码,它看起来像scipy不熟悉在文件末尾存在的块(块ID为bext,2753632字节在如果有帮助的话)。该块被声明为603个字节长,因此它会读取它,期待另一个块ID为603个字节后 - 它没有找到它(文件不足)并且崩溃。

你有没有试过它在其他WAV文件成功?这是怎么产生的?

+2

确实...这是WAV文件的问题(即使任何音频播放器都可以播放它们)。我试着用另一个程序生成的WAV代码,它的工作。 有问题的wav文件创建于... Apple的Logic Pro,具有标准设置:16bit,44100Hz,Interleaved,无抖动。 – Eric

+1

感谢您的评论。我用sox将我的wav文件“转换”为他们已有的格式。因此sox纠正了错误的wav文件,而音频数据保持不变。请参阅http://stefaanlippens.net/audio_conversion_cheat_sheet –

15

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

在我的情况下,它是由Audacity添加的默认元数据(版权,曲目名称等) - 您可以在Audacity中打开该文件并使用File ...打开元数据编辑器来查看它。然后使用“清除”按钮去除它,然后重试。

current version of scipy支持以下RIFF块 - 'fmt','fact','data'和'LIST'。 The Wikipedia page on RIFF关于如何构建WAV文件有一些更详细的信息,例如你可能包含了一个不受支持但流行的INFO块

+3

使用audacity剥离所有meta标签对我有用。 – lonesword

1

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

1

我有相同的错误,并可以成功转换为它可以读取的内容。

我的原始文件来自Logic Pro。然后我用audacity来读取文件。