Как мне прочитать в WAV-файлы в .gz? - PullRequest
0 голосов
/ 06 мая 2018

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

import librosa

mono, fs = librosa.load('./small_data/time_series_audio.wav', sr = 44100)

Теперь мне дан gz-файл "music_feature_extraction_test.tar.gz" Я не уверен, что делать сейчас.

Я пытался:

with gzip.open('music_train.tar.gz', 'rb') as f:
    for files in f : 
        mono, fs = librosa.load(files, sr = 44100)

но это дает мне:

TypeError: lstat() argument 1 must be encoded string without null bytes, not str

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вы можете использовать PySoundFile для чтения из сжатого файла. https://pysoundfile.readthedocs.io/en/0.9.0/#virtual-io

import soundfile

with gzip.open('music_train.tar.gz', 'rb') as gz_f:
    for file in gz_f : 
        fs, mono = soundfile.read(file, samplerate=44100)

Может быть, вам также следует проверить, нужно ли вам пересчитывать данные перед их обработкой с помощью librosa: https://librosa.github.io/librosa/ioformats.html#read-specific-formats

0 голосов
/ 06 мая 2018

Происходит несколько вещей:

  • Файл, который вы получили, является сжатым архивом gzipped. Взгляните на tarfile модуль , он может читать файлы, сжатые gzip напрямую. Вы получите итератор для его членов, каждый из которых представляет собой отдельный файл.
  • AFAIKS librosa не может читать из буфера в памяти, поэтому вы должны распаковать tar-члены во временные файлы. tempfile - модуль является вашим другом здесь, NamedTemporaryFile предоставит вам файл для самостоятельного удаления, который вы можете распаковать и предоставить librosa.

Возможно, вы захотите реализовать это как простую функцию генератора, которая принимает имя tarfile-файла в качестве входного, перебирает его члены и yield s, что librosa.load() предоставляет вам. Таким образом, все очищается автоматически.

Следовательно, основной цикл будет

  1. Откройте архив с помощью tarfile -модуля. За каждого участника
  2. Получить новый временный файл, используя NamedTemporaryFile. Скопируйте содержимое tarball-члена в этот файл. Вы можете использовать shutil.copyfileobj, чтобы избежать чтения всего wav-файла в память перед записью его на диск.
  3. У NamedTemporaryFile есть атрибут имени файла. Передайте это librosa.open.
  4. yield возвращаемое значение librosa.open для вызывающей стороны.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...