Попытка записать с микрофона и воспроизвести в реальном времени

Я пытаюсь записать данные с моего микрофона, а затем воспроизвести их через динамики в реальном времени и с некоторыми задержками, но у меня проблемы с этим. . Я решил использовать python и alsaaudio, и мой текущий скрипт, с которым у меня возникают проблемы, можно найти здесь . Это работает с тем, что у меня есть (не с задержкой), но вызывает некоторые щелчки. В alsaaudio docs есть это , где говорится:

Самая распространенная причина проблем с воспроизведением звука PCM заключается в том, что запись на устройства PCM должна точно соответствовать скорости передачи данных устройства.

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

Кажется, я неправильно понимаю документацию, в ней говорится о write ():

PCM.write (data)

Записывает (воспроизводит) звук в данные. Длина данных должна быть кратна размеру кадра и должна быть точно равна размеру периода

период в моем сценарии равен 160.

он говорит о read ():

В режиме PCM_NORMAL , эта функция блокируется до тех пор, пока не будет доступен полный период, а затем возвращает кортеж (длина, данные), где длина - это количество кадров захваченных данных, а данные - это захваченные звуковые кадры в виде строки. Длина возвращаемых данных будет периодом * размер кадра в байтах.

в моем скрипте period_size * frame_size также должен быть равен 160, но когда я печатаю длину (возвращается часть кортежа read ()), я получаю 940 Очевидно, я не передаю нужное количество данных в out.write (), но я не уверен, куда идти. Я собрал этот код в основном с помощью примеров, которые я нашел, и я только начал работать с alsaaudio / sound, пытаясь собрать несколько интересных проектов, поэтому я еще не многого знаю.

Я также хотел записывать живые выступления с микрофон, затем воспроизведение с задержкой 100 мс, отсюда и комментарий time.sleep (). Если я раскомментирую его, длина, кажется, многократно меняется от 940 до -32, что в конечном итоге приводит к тому, что out.write () генерирует исключение (недостаточно данных).

Может кто-нибудь сказать мне, как (или что не так с моим скриптом) Я бы записал и воспроизвел звуковые данные в реальном времени и с задержкой 100 мс?

9
задан src 18 August 2011 в 05:13
поделиться