Python 如何修复';不完整的wav块';使用scipy读取wav时出错 我的问题
我正在尝试拟合一个(机器学习)模型,该模型接收音频文件(.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
我试图从文件中读取采样率和信号,但从
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错误(=引发了错误)。
我似乎找不到任何东西可以说明文件通过或失败的原因,但尽管如此,这是一个奇怪的结果,因为所有文件都是从同一个数据集中的同一个数据集中获取的
我没有尝试这样做,因为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文件示例的链接。