Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修复';不完整的wav块';使用scipy读取wav时出错 我的问题_Python_Machine Learning_Audio_Scipy - Fatal编程技术网

Python 如何修复';不完整的wav块';使用scipy读取wav时出错 我的问题

Python 如何修复';不完整的wav块';使用scipy读取wav时出错 我的问题,python,machine-learning,audio,scipy,Python,Machine Learning,Audio,Scipy,我正在尝试拟合一个(机器学习)模型,该模型接收音频文件(.wav)并从中预测情感(多标签分类)。 我试图从文件中读取采样率和信号,但从scipy.io.wavfile调用read(filename)时,我得到了ValueError:不完整的wav块。 我试过的 我已尝试从scipy.read()切换到librosa.read() 它们都输出信号和采样率,但由于某种原因,librosa比scipy花费的时间呈指数级增长,对于我的任务来说是不切实际的 我按照建议尝试了sr,y=scipi.io.wa

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

我试过的
  • 我已尝试从
    scipy.read()
    切换到
    librosa.read()

    它们都输出信号和采样率,但由于某种原因,
    librosa
    scipy
    花费的时间呈指数级增长,对于我的任务来说是不切实际的

  • 我按照建议尝试了
    sr,y=scipi.io.wavfile.read(open(filename,'r'))
    ,但没有成功

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

  • 我听到有人说我可以使用一些软件将文件重新导出为wav,它应该可以工作。
    我没有尝试这样做,因为a)我没有任何音频处理软件,这似乎有点过分,b)我想了解实际问题,而不是给它贴上绷带

  • 最小的、可重复的示例 假设
    filenames
    是我所有音频文件的子集,其中
    fn_good
    是一个实际处理的文件,而
    fn_bad
    是一个引发错误的实际文件

    def extract_功能(文件名):
    对于文件名中的fn:
    sr,y=scipy.io.wavfile.read(fn)
    打印('信号为:',y)
    打印('采样率为:',sr)
    
    附加信息 使用VLC时,似乎
    scipy.io.wavfile
    支持编解码器,但在这两种情况下,两个文件都有相同的编解码器,所以奇怪的是它们没有相同的效果。。。 好文件的编解码器:

    坏文件的编解码器:

    我不知道为什么
    scipy.io.wavfile
    无法读取该文件——其中可能有一个无效的块,其他读者可以忽略它。请注意,即使我使用
    scipy.io.wavfile
    读取“良好”文件,也会生成警告(
    WavFileWarning:Chunk(非数据)未理解,跳过它。
    ):

    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)
    
    我可以使用(github上的源代码:)阅读
    'fearful\u song\u strong\u dogs\u act06\u f\u 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>]
    
    [13]中的
    :导入wavio
    在[14]中:wav=wavio.read('fear\u song\u strong\u dogs\u act06\u f\u 0.wav'))
    In[15]:wav
    Out[15]:Wav(data.shape=(198598,1),data.dtype=int16,rate=48000,sampwidth=2)
    在[16]中:绘图(np.arange(wav.data.shape[0])/wav.rate,wav.data[:,0])
    Out[16]:[]
    

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

       if not chunk_id:
                raise ValueError("Unexpected end of file.")
            elif len(chunk_id) < 1:
                raise ValueError("Incomplete wav chunk.")
    
    如果不是chunk\u id:
    raise VALUERROR(“文件意外结束”)
    elif len(区块id)<1:
    raise VALUERROR(“不完整的wav块”)
    
    但这只是凭直觉和运气,现在我想知道为什么会这样,可能的原因是什么?

    非常感谢!正如您所建议的,我尝试使用了
    wavio
    ,效果似乎很好。(不接受这个答案,因为我仍然想知道为什么scipy会这样做…)没问题。如果您有时间,可以在scipy github页面上创建一个问题(单击绿色的“新问题”按钮)。解释该问题,并包括指向此stackoverflow问题以及“好”和“坏”wav文件示例的链接。