В общем, для «прослушивания чего-либо» со своей звуковой карты вам придется использовать какой-либо звуковой инструментарий / модуль, и обычно вы в конечном итоге настраиваете процедуру записи-воспроизведения-воспроизведения (вы можете пропустить воспроизведение курс)
Если ваше приложение не является жестким в режиме реального времени (т.е. вы можете позволить себе пропустить несколько сэмплов из входных данных), вы можете начать с примера PyAudio «Записать несколько секунд аудио и сохранить его в файл» из их сайт .
Так что в вашем случае вы бы:
- Запись в буфер
- Обработка
- Если условие завершения не выполнено, вернитесь к (1).
Но в этом случае
(Возможно, вы заметили) Во время обработки вы пропустите сэмплы на входе, потому что в это время вы ничего не записываете.
В зависимости от вашего приложения это может сойти с рук ... Это особенно актуально для PyAudio, потому что на данный момент он поддерживает только режим блокировки, поэтому, если вы хотите работать в режиме реального времени (ish), вам придется использовать потоки.
Если ваши спецификации в реальном времени более строгие (то есть вы не можете позволить себе потерять даже несколько сэмплов из своего ввода), вы все равно будете использовать процедуру «запись-процесс-воспроизведение», но на этот раз вам потребуется сделать это в потоке и связать его с вашим основным процессом через стек LIFO (Last In First Out или Deque ).
Это будет выглядеть примерно так:
Тема записи:
- Запись в буфер
- Нажмите данные на Deque
- Повторить с (1)
Основной процесс:
- Если в Deque есть буферы, то
- Вытащить буфер из Deque
- Обработка
- Повторить с (1)
Таким образом, ваша обработка может продолжаться в своем собственном темпе, пока поток записи продолжает заполнять буферы и помещать их в Deque.
Хорошая новость в случае Python заключается в том, что Deque является поточно-ориентированным, поэтому у вас не возникнет проблем с синхронизацией, когда ваш основной процесс и поток попытаются одновременно получить доступ к Deque.
Опять же,
В зависимости от вашего приложения вам также может потребоваться перейти на более быстрое оборудование, например, на основе протокола ASIO .
В конце концов,
Вам также нужно будет немного изменить свои алгоритмы обработки, чтобы учесть, что вы сейчас работаете с кадрами, а не с одним буфером ... Поэтому, чтобы все было гладко, вам нужно будет сохранять состояние ваших операций от одного кадра до следующий. Для получения дополнительной информации вы можете увидеть метод "overlap-add"
Всего наилучшего