python - 如何修复使用 scipy 读取 wav 时出现 'Incomplete wav chunk' 错误

标签 python machine-learning audio scipy

我的问题

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

我尝试过的

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

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

  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 文件的编解码器: enter image description here

BAD 文件的编解码器: enter image description here

最佳答案

我不知道为什么scipy.io.wavfile无法读取该文件——其中可能存在无效 block ,而其他读取器只是忽略了该 block 。请注意,即使我读取了带有 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)

我可以阅读'fearful_song_strong_dogs_act06_f_0.wav'使用 wavio (github上的源代码: wavio ),我创建的一个包,包装了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>]

plot

关于python - 如何修复使用 scipy 读取 wav 时出现 'Incomplete wav chunk' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56667042/

相关文章:

python - 使用python map等功能工具

machine-learning - Libsvm 模型文件格式 无型号

algorithm - 机器学习算法的实际用例

javascript - Javascript按钮多个音频源

java - 使用 MediaPlayer 作为源在 Android 上录制音频?

audio - 使用 ffmpeg 将音频文件的指定部分静音

python - 使用 scipy.optimize.minimize 查找全局最小值

python - 使用 Pandas 将csv文件读取为字典

python - 如何在多级数据帧上正确使用 .loc?

java - 如何使用我构建的模型在 Weka 中测试单个实例?