使用scipy读取wav时,如何解决“不完整的wav块”错误

时间:2019-06-19 11:51:40

标签: python machine-learning audio scipy

我的问题

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

我尝试过的

  1. 我尝试过从scipy.read()切换到librosa.read()
    它们都输出信号和采样率,但是由于某种原因,librosa花费的时间比scipy长得多,因此对于我的任务来说是不切实际的。

  2. 我已按照建议的here尝试过sr, 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是经过处理的实际文件,而{{1} }是引发错误的实际文件。

fn_bad

其他信息

使用VLC,似乎def extract_features(filenames): for fn in filenames: sr, y = scipy.io.wavfile.read(fn) print('Signal is: ', y) print('Sample rate is: ', sr) 支持编解码器,但是在任何一种情况下,两个文件都具有相同的编解码器,所以奇怪的是它们没有相同的效果... GOOD文件的编解码器: enter image description here

BAD文件的

编解码器: enter image description here

2 个答案:

答案 0 :(得分:1)

我不知道为什么scipy.io.wavfile无法读取文件-那里可能有一个无效的块,其他读者只是忽略了该块。请注意,即使我使用scipy.io.wavfile读取“好”文件,也会生成警告(WavFileWarning: Chunk (non-data) not understood, skipping it.):

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(github上的源代码:wavio)来读取'fearful_song_strong_dogs_act06_f_0.wav',这是我创建的一个程序包,该程序包使用理解NumPy数组的函数包装了Python的标准wave库:

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

答案 1 :(得分: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