【问题标题】:How to fix 'Incomplete wav chunk' error when reading wav with scipy使用 scipy 读取 wav 时如何修复“不完整的 wav 块”错误
【发布时间】:2019-11-02 03:45:22
【问题描述】:

我的问题

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

我尝试过的

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

  2. 我已经按照here 的建议尝试了sr, y = scipi.io.wavfile.read(open(filename, 'r')),但无济于事。

  3. 我已尝试查看我的文件并检查可能导致它的原因:
    在所有 2084 个 wav 文件中,有 1057 个是好的(=scipy 设法读取它们),并且 1027 错误(=引发错误)。
    我似乎找不到任何关于是什么使文件通过或失败的东西,但尽管如此,这是一个奇怪的结果,因为所有文件都是从同一个 origin 的同一个数据集中获取的。

  4. 我听说有人说我可以使用某些软件将文件重新导出为 wav,它应该可以工作。
    我没有尝试这个,因为 a) 我没有任何音频处理软件,这似乎有点矫枉过正,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支持编解码器,但无论哪种情况,两个文件都有相同的编解码器,所以很奇怪它们没有相同的效果...... GOOD 文件的编解码器:

BAD 文件的编解码器:

【问题讨论】:

    标签: python machine-learning audio scipy


    【解决方案1】:

    我通过在文件wavefile.py文件中将这个数字“4”改为“1”来解决问题, 在这种情况下的代码:
    - len(chunk_id)

       if not chunk_id:
                raise ValueError("Unexpected end of file.")
            elif len(chunk_id) < 1:
                raise ValueError("Incomplete wav chunk.")
    

    但这只是凭直觉和好运,现在我想知道为什么会这样,可能的原因是什么?

    【讨论】:

      【解决方案2】:

      我不知道为什么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',这是我创建的一个包,其中包含 Python 的标准 wave 库以及可以理解 NumPy 数组的函数:

      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>]
      

      【讨论】:

      • 非常感谢!正如你所推荐的,我尝试使用wavio,它似乎工作得很好。 (不接受这个作为答案,因为我仍然想知道为什么 scipy 会那样做......)
      • 没问题。如果您有时间,您可以在 scipy github 页面上创建一个问题(github.com/scipy/scipy/issues;单击绿色的“新问题”按钮)。解释问题,并包含指向此 stackoverflow 问题和“好”和“坏”wav 文件示例的链接。
      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 2011-07-09
      相关资源
      最近更新 更多