Проанализируйте в настоящее время воспроизведение звука с Python - PullRequest
4 голосов
/ 29 марта 2012

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

Я знаю, что это возможно с DirectShow в Windows, но я не уверен, как использовать его из Python. Однако в идеале я бы хотел кроссплатформенный способ, который не использует DirectX.

1 Ответ

7 голосов
/ 30 марта 2012

В общем, для «прослушивания чего-либо» со своей звуковой карты вам придется использовать какой-либо звуковой инструментарий / модуль, и обычно вы в конечном итоге настраиваете процедуру записи-воспроизведения-воспроизведения (вы можете пропустить воспроизведение курс)

Если ваше приложение не является жестким в режиме реального времени (т.е. вы можете позволить себе пропустить несколько сэмплов из входных данных), вы можете начать с примера PyAudio «Записать несколько секунд аудио и сохранить его в файл» из их сайт .
Так что в вашем случае вы бы:

  1. Запись в буфер
  2. Обработка
  3. Если условие завершения не выполнено, вернитесь к (1).

Но в этом случае
(Возможно, вы заметили) Во время обработки вы пропустите сэмплы на входе, потому что в это время вы ничего не записываете.
В зависимости от вашего приложения это может сойти с рук ... Это особенно актуально для PyAudio, потому что на данный момент он поддерживает только режим блокировки, поэтому, если вы хотите работать в режиме реального времени (ish), вам придется использовать потоки.

Если ваши спецификации в реальном времени более строгие (то есть вы не можете позволить себе потерять даже несколько сэмплов из своего ввода), вы все равно будете использовать процедуру «запись-процесс-воспроизведение», но на этот раз вам потребуется сделать это в потоке и связать его с вашим основным процессом через стек LIFO (Last In First Out или Deque ).

Это будет выглядеть примерно так:

Тема записи:

  1. Запись в буфер
  2. Нажмите данные на Deque
  3. Повторить с (1)

Основной процесс:

  1. Если в Deque есть буферы, то
    1. Вытащить буфер из Deque
    2. Обработка
  2. Повторить с (1)

Таким образом, ваша обработка может продолжаться в своем собственном темпе, пока поток записи продолжает заполнять буферы и помещать их в Deque.

Хорошая новость в случае Python заключается в том, что Deque является поточно-ориентированным, поэтому у вас не возникнет проблем с синхронизацией, когда ваш основной процесс и поток попытаются одновременно получить доступ к Deque.

Опять же, В зависимости от вашего приложения вам также может потребоваться перейти на более быстрое оборудование, например, на основе протокола ASIO .

В конце концов,
Вам также нужно будет немного изменить свои алгоритмы обработки, чтобы учесть, что вы сейчас работаете с кадрами, а не с одним буфером ... Поэтому, чтобы все было гладко, вам нужно будет сохранять состояние ваших операций от одного кадра до следующий. Для получения дополнительной информации вы можете увидеть метод "overlap-add"

Всего наилучшего

...