Я пытаюсь записать данные со своего микрофона, а затем воспроизвести их через динамики в реальном времени и с некоторыми задержками, но у меня с этим возникают некоторые проблемы. Я решил использовать python и alsaaudio, и мой текущий скрипт, с которым у меня возникли проблемы, можно найти здесь. Это работает с тем, что у меня есть до сих пор (не с задержкой), но производит некоторые щелчки. В документах alsaaudio есть это, чтобы сказать:
Наиболее распространенная причина проблем с воспроизведением звука PCM заключается в том, что запись на устройства PCM должна точно соответствовать скорости передачи данных устройства.
Если на устройство будет записано слишком мало данных, оно будет недогружено, и будут слышны некрасивые щелчки. И наоборот, если в устройство записывается слишком много данных, функция записи либо блокируется (режим PCM_NORMAL), либо возвращает ноль (режим PCM_NONBLOCK).
Кажется, я неправильно понимаю документы, там говорится о write():
PCM.запись(данные)
Записывает (воспроизводит) звук в данные. Длина данных должна быть кратна размеру кадра и должна быть точно равна размеру периода.
период в моем сценарии равен 160.
это говорит о read():
В режиме PCM_NORMAL эта функция блокируется до тех пор, пока не будет доступен полный период, а затем возвращает кортеж (длина, данные), где длина — это количество кадров захваченных данных, а данные — это захваченные звуковые кадры в виде строки. Длина возвращаемых данных будет равна размеру периода * размеру кадра в байтах.
в моем скрипте period_size*frame_size также должно быть равно 160, но когда я печатаю длину (часть возврата кортежа read()), я получаю 940. Очевидно, я не передаю нужное количество данных наружу. write(), но я не уверен, куда идти. Я собрал этот код в основном с помощью найденных мной примеров, и я только начал работать с alsaaudio/sound, пытаясь собрать несколько интересных проектов, так что я еще не очень много знаю.
Я также хотел записать вживую с микрофона, а затем воспроизвести с задержкой в 100 мс, отсюда и закомментированный time.sleep(). Если я раскомментирую его, длина, кажется, многократно увеличивается от 940 до -32, что в конечном итоге приводит к тому, что out.write() выдает исключение (недостаточно данных).
Может ли кто-нибудь сказать мне, как (или что не так с моим сценарием) я буду записывать и воспроизводить звуковые данные в реальном времени и с задержкой 100 мс?