Как исправить ошибку «Incomplete WAV Chunk» при чтении WAV с Scipy - PullRequest
1 голос
/ 19 июня 2019

Моя проблема

Я пытаюсь подобрать модель (машинного обучения), которая берет аудиофайл (.wav) и предсказывает эмоции из него (классификация по нескольким меткам).
Я пытаюсь прочитать частоту дискретизации и сигнал из файла, но при вызове read(filename) из 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 были хорошими (= scipy удалось их прочитать), и 1027 были плохими (= подняли ошибку).
    Кажется, я не нашел ничего, что указывало бы на то, что делает файл пропущенным или неудачным, но, тем не менее, это странный результат, поскольку все файлы взяты из одного и того же набора данных из одного origin .

  4. Я слышал, как люди говорили, что я могу просто повторно экспортировать файлы как wav, используя какое-то программное обеспечение, и оно должно работать.
    Я не пробовал этого, потому что а) у меня нет программного обеспечения для обработки звука, и это кажется излишним, и б) я хочу понять реальную проблему, а не навязывать ее.

Минимальный воспроизводимый пример

Предположим, filenames - это подмножество всех моих аудиофайлов, содержащее fn_good и fn_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, но в любом случае оба файла имеют одинаковый кодек, поэтому странно, что они не имеют одинакового эффекта ... Кодек ХОРОШЕГО файла: enter image description here

Кодек файла BAD: enter image description here

1 Ответ

1 голос
/ 19 июня 2019

Я не знаю, почему 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)

Я могу прочитать '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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...