首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修正读取wav时出现的“不完全wav块”错误

如何修正读取wav时出现的“不完全wav块”错误
EN

Stack Overflow用户
提问于 2019-06-19 11:51:40
回答 2查看 6.4K关注 0票数 3

我的问题

我试图建立一个机器学习(机器学习)模型,它接受音频(.wav),并从它(多标签分类)中预测情感。

我试图读取文件中的采样率和信号,但是当从scipy.io.wavfile调用scipy.io.wavfile时,我得到了ValueError: Incomplete wav chunk.

我试过的

  1. 我尝试过从scipy.read()切换到librosa.read()。 它们都输出信号和采样率,但由于某种原因,librosa花费的时间比scipy长得多,对我的任务来说是不切实际的。
  2. 我试过了sr, y = scipi.io.wavfile.read(open(filename, 'r')),如建议的这里,但没有结果。
  3. 我试着查看我的文件,并检查可能导致这种情况的原因: 在所有的2084个wav文件中,1057个文件是好的(=error设法读取它们),1027是坏的(=引发错误)。 我似乎找不到任何东西指向文件传递或失败的原因,但这仍然是一个奇怪的结果,因为所有文件都是从同一个原点中从同一个数据集中获取的。
  4. 我听说有人说我可以用一些软件把文件重新导出为wav,它应该能工作。 我没有尝试,因为我没有任何音频处理软件,这似乎是一个过头,和( b)我想了解实际的问题,而不是在它的绷带。

最小的,可复制的例子

假设filenames是我所有音频文件的子集,其中包含好的坏的,其中fn_good是要处理的实际文件,fn_bad是引发错误的实际文件。

代码语言:javascript
运行
复制
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似乎支持这些编解码器,但是在任何一种情况下,这两个文件都有相同的编解码器,所以它们没有相同的效果是很奇怪的.良好文件的编解码器:

坏文件的编解码器:

EN

回答 2

Stack Overflow用户

发布于 2019-06-19 14:39:29

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

代码语言:javascript
运行
复制
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)

我可以使用'fearful_song_strong_dogs_act06_f_0.wav' ( github:wavio上的源代码)阅读wavio,这是我创建的一个包,它用理解NumPy数组的函数包装了Python的标准wave库:

代码语言:javascript
运行
复制
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>]

票数 3
EN

Stack Overflow用户

发布于 2020-04-11 04:32:08

在代码的以下条件下,我通过将文件"4“更改为"1"来解决这个问题:

  • len(chunk_id) < 1
代码语言:javascript
运行
复制
   if not chunk_id:
            raise ValueError("Unexpected end of file.")
        elif len(chunk_id) < 1:
            raise ValueError("Incomplete wav chunk.")

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56667042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档