使用scipy读取wav文件时如何修复“Incomplete wav chunk”错误

3

我的问题

我正在尝试适配一个(机器学习)模型,该模型接收音频文件(.wav)并从中预测情感(多标签分类)。
我正在尝试从文件中读取采样率和信号,但是当调用 scipy.io.wavfile 中的 read(filename) 时,我得到了 ValueError:不完整的wav块。

我尝试过的

  1. 我尝试从scipy.read()切换到librosa.read()
    它们都输出信号和采样率,但由于某种原因librosa所需的时间是scipy的指数倍,对我的任务来说不实用。

  2. 我尝试了建议heresr,y = scipi.io.wavfile.read(open(filename, 'r')),但没有成功。

  3. 我尝试查看我的文件并检查可能导致问题的原因:
    在所有2084个wav文件中,有1057个是好的(=scipy能够读取它们),而1027个是坏的(=引发了错误)。
    我似乎找不到任何指向文件通过或失败的原因,但无论如何,这是一个奇怪的结果,因为所有文件都来自同一origin数据集。

  4. 我听说人们说我可以使用一些软件将文件重新导出为wav,并且应该可以解决问题。
    我没有尝试这个方法,因为a)我没有任何音频处理软件,而且它似乎过度kill, b)我想理解实际问题而不是贴上创可贴。

最小、可重复的示例

假设 filenames 是我的所有音频文件的子集,其中包含 fn_goodfn_bad ,其中 fn_good 是一个被处理的实际文件,而 fn_bad 是一个会引发错误的实际文件。

def extract_features(filenames):
    for fn in filenames:
        sr, y = scipy.io.wavfile.read(fn)
        print('Signal is: ', y)
        print('Sample rate is: ', sr)

附加信息

使用VLC时,似乎scipy.io.wavfile支持编解码器,但两个文件都有相同的编解码器,所以它们没有产生相同的效果是很奇怪的... 好的文件的编解码器: enter image description here

坏的文件的编解码器: enter image description here

2个回答

3

我不知道为什么scipy.io.wavfile无法读取该文件——可能存在其他阅读器忽略的无效块。注意,即使使用scipy.io.wavfile读取“好”文件时,也会生成警告信息(WavFileWarning:未理解块(非数据),跳过它。):

In [22]: rate, data = wavfile.read('fearful_song_strong_dogs_act10_f_1.wav')                              
/Users/warren/mc37/lib/python3.7/site-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it.
  WavFileWarning)

我创建了一个名为wavio的软件包,它使用Python标准库中的wave函数,并结合NumPy数组,可以读取'fearful_song_strong_dogs_act06_f_0.wav'音频文件(源代码在github上:wavio)。

In [13]: import wavio                                                                                     

In [14]: wav = wavio.read('fearful_song_strong_dogs_act06_f_0.wav')                                       

In [15]: wav                                                                                              
Out[15]: Wav(data.shape=(198598, 1), data.dtype=int16, rate=48000, sampwidth=2)

In [16]: plot(np.arange(wav.data.shape[0])/wav.rate, wav.data[:,0])                                       
Out[16]: [<matplotlib.lines.Line2D at 0x117cd9390>]

plot


非常感谢!正如您推荐的那样,我尝试使用wavio,它似乎运行得很好。 (我仍然想知道为什么scipy会这样做,所以不接受此答案...) - Alon Emanuel
3
没问题。如果您有时间,可以在scipy的github页面上创建一个问题(https://github.com/scipy/scipy/issues;点击绿色的“New issue”按钮)。解释一下问题,并且包含指向这个stackoverflow问题和“好”的和“坏”的wav文件例子的链接。 - Warren Weckesser

0
我通过在wavefile.py文件中更改这个数字"4"为"1"来解决问题,在以下代码条件下:
- len(chunk_id) < 1
   if not chunk_id:
            raise ValueError("Unexpected end of file.")
        elif len(chunk_id) < 1:
            raise ValueError("Incomplete wav chunk.")

但这只是凭直觉和好运,现在我想知道为什么它有效以及可能的原因是什么? image


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接