Как воспроизвести звуковые сэмплы Wav по памяти

Для моего последнего проекта в колледже я работаю с Wav Files и Python и балуюсь с ними. Я хотел бы иметь возможность воспроизводить звуковые образцы из памяти, а не записывать звуковые образцы в файл WAV, прежде чем я смогу их услышать.

Я искал несколько недель в Интернете и нашел PyMedia, PySound, PyGame и т. Д., И ни один из них, похоже, не работает для меня. Каждый пакет дает мне ошибки.

Есть ли другие библиотеки, которые мне не хватает, которые помогли бы мне это сделать? Или я просто тупой и не могу заставить другие пакеты работать.

Именно то, что я хочу сделать, находится в соответствии с этим:

    #open file and get parameters
    wavfile = Wave.open("file.wav", "r")
    params = wfile.getparams()
    nframes = params[3]

    #get sound samples in a list
    samples = []
    for i in range(nframes):
        samples.append(wfile.readframes(1))

    playsound(samples)

    changedSamples = makeChangeTo(samples)

    playsound(changedSamples)

И я хотел бы иметь возможность иметь это в цикле, чтобы я мог редактировать и слышать правки, пока программа все еще работает, без необходимости записывать сэмплы в файл wav, прежде чем я смогу их прослушать, поскольку это занимает слишком много времени.

Какие-либо предложения ? Ваше здоровье !


person ConorSpn    schedule 21.02.2017    source источник
comment
попробовать SSDD или виртуальные RAM-диски? файлы, интерфейсы потоковой передачи могут скрывать задержки, которые могут вызвать перерывы в воспроизведении/записи, что ожидается при использовании интерпретируемого языка со сборкой мусора, такого как Python.   -  person f5r5e5d    schedule 22.02.2017
comment
Вы не предоставили никакой информации об ошибках, с которыми вы столкнулись при работе с любой из этих библиотек. pygame, безусловно, может создать объект Sound из 'from аудиофайл OGG или из несжатого WAV».   -  person Alex Taylor    schedule 22.02.2017


Ответы (1)


Вы должны четко разделить эти две проблемы:

  1. Чтение/запись файлов WAV (или других аудиофайлов)

  2. Воспроизведение/запись звуков

Здесь, на SO, есть несколько вопросов и ответов на обе темы.

Это моя личная (и, конечно, предвзятая) рекомендация:

Вы должны использовать NumPy для управления звуками, это намного проще, чем обработка простых буферов Python. Если по какой-то причине вы не можете использовать NumPy, вы все равно можете сделать все это, но это будет немного больше работы.

Для чтения/записи звуковых файлов я рекомендую модуль звуковой файл (полное раскрытие: я соавтор ).

Для воспроизведения/записи звуков я рекомендую модуль sounddevice (полное раскрытие: я его основной автор ).

При использовании этих модулей ваш пример, вероятно, станет примерно таким:

import soundfile as sf
import sounddevice as sd

samples, samplerate = sf.read('file.wav')
sd.play(samples, samplerate)
sd.wait()
changed_samples = make_change_to(samples)
sd.play(changed_samples, samplerate)
sd.wait()

Если вы работаете в интерактивной подсказке Python, вам, вероятно, не нужны вызовы sd.wait(), вы можете просто дождаться окончания воспроизведения. Или, если вам надоест слушать это, вы можете использовать:

sd.stop()

Если вы знаете, что какое-то время будете использовать одну и ту же частоту дискретизации, вы можете установить ее по умолчанию:

sd.default.samplerate = 48000

После этого вы можете отбросить аргумент samplerate при использовании play():

sd.play(samples)

Если вы хотите сохранить измененный звук в файл, вы можете использовать что-то вроде этого:

sf.write('changed_file.wav', changed_samples, samplerate)

Дальнейшее чтение:

person Matthias    schedule 22.02.2017
comment
Круто, выглядит хорошо, я попробую и посмотрю, что произойдет. Спасибо, чувак, я ценю это! - person ConorSpn; 22.02.2017