Добавить данные в звуковой файл волны без загрузки его текущего содержимого - PullRequest
3 голосов
/ 09 мая 2019

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

Согласно документации по pysoundfile, когда SoundFile открывается с дескриптором файла, он должен писать без усечения, так что я сейчас и делаю

    fd = open('foo.wav',mode='ab')
    with sf.SoundFile(fd, mode = 'w', samplerate = self._samplerate,channels = self._channels, format = 'wav') as wfile:
        wfile.seek(0,sf.SEEK_END)
        wfile.write(self._samples)
        wfile.close()
    fd.close()

Когда я использую волновой тип файла, возникает следующая ошибка:

RuntimeError: Error opening <_io.BufferedWriter name='../datasets/emddf_clean/qcoisa.wav'>: Unspecified internal error.

Но с файлом, отформатированным в w64, это работает как-то ... Если бы кто-то мог пролить свет на меня, это было бы удивительно, Заранее спасибо!

1 Ответ

1 голос
/ 10 мая 2019

Мне удалось сделать именно то, что я хочу, без явного использования дескриптора файла:

    with sf.SoundFile(path['full_path'], mode = 'r+') as wfile:
        wfile.seek(0,sf.SEEK_END)
        wfile.write(self._samples)

Если файл находится в режиме r+ (чтение / запись), он поддерживает поиск, то есть мы можемуказать на конец файла, позволяющего добавить.Единственная проблема в том, что если файл еще не существует, он выдаст ошибку, но вы можете легко исправить это, выполнив что-то вроде следующего:

    if(self.mode == my_utils.APPEND and os.path.isfile(path['full_path'])):
        with sf.SoundFile(path['full_path'], mode = 'r+', samplerate = samplerate) as wfile:
            wfile.seek(0,sf.SEEK_END)
            wfile.write(self.file.getSamples())
    else:
        sf.write(path['full_path'], self.file.getSamples(), samplerate,format=path['extension']) # writes to the new file 
    return

Надеюсь, я был ясен и помог кому-то!

...