Как получают звуковой вход от микрофона в Python и обрабатывают его на лету?

Поздравления,

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

Я искал в ТАК и нашел это сообщение: распознавание тона аудио

Я думаю, что библиотека PyAudio соответствовала бы моим потребностям, но я не совсем уверен, как заставить мою программу ожидать звукового сигнала (контроль микрофона в реальном времени), и когда я получил тот, как обработать его (я должен использовать преобразование Фурье как он, был проинструктирован в вышеупомянутом сообщении)?

Заранее спасибо за любую справку Вы могли дать мне.

50
задан Community 23 May 2017 в 01:54
поделиться

2 ответа

Если вы используете LINUX, вы можете использовать pyALSAAUDIO . Для окон у нас есть PyAudio , а также библиотека под названием SoundAnalyse .

Я нашел пример для Linux здесь :

#!/usr/bin/python
## This is an example of a simple sound capture script.
##
## The script opens an ALSA pcm for sound capture. Set
## various attributes of the capture, and reads in a loop,
## Then prints the volume.
##
## To test it out, run it and shout at your microphone:

import alsaaudio, time, audioop

# Open the device in nonblocking capture mode. The last argument could
# just as well have been zero for blocking mode. Then we could have
# left out the sleep call in the bottom of the loop
inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE,alsaaudio.PCM_NONBLOCK)

# Set attributes: Mono, 8000 Hz, 16 bit little endian samples
inp.setchannels(1)
inp.setrate(8000)
inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)

# The period size controls the internal number of frames per period.
# The significance of this parameter is documented in the ALSA api.
# For our purposes, it is suficcient to know that reads from the device
# will return this many frames. Each frame being 2 bytes long.
# This means that the reads below will return either 320 bytes of data
# or 0 bytes of data. The latter is possible because we are in nonblocking
# mode.
inp.setperiodsize(160)

while True:
    # Read data from device
    l,data = inp.read()
    if l:
        # Return the maximum of the absolute value of all samples in a fragment.
        print audioop.max(data, 2)
    time.sleep(.001)
41
ответ дан 7 November 2019 в 11:08
поделиться

... и когда я узнал, как его обрабатывать (нужно ли мне использовать преобразование Фурье, как это было указано в посте выше)?

Если вы хотите "постучать", то я думаю, что вас интересует амплитуда больше, чем частота. Таким образом, преобразования Фурье, вероятно, не являются полезными для вашей конкретной цели. Вы, вероятно, хотите сделать бегущее измерение краткосрочной (скажем, 10 мс) амплитуды входа, и обнаружить, когда она внезапно увеличивается на определенную дельту. Вам нужно настроить параметры:

  • что такое "кратковременное" измерение амплитуды
  • что такое увеличение дельты, которое вы ищете
  • как быстро должно произойти изменение дельты

Хотя я сказал, что вас не интересует частота, вы, возможно, захотите сначала провести некоторую фильтрацию, чтобы отфильтровать особенно низкочастотные и высокочастотные компоненты. Это может помочь вам избежать некоторых "ложных срабатываний". Вы можете сделать это с помощью цифрового фильтра FIR или IIR; Фурье не нужен.

.
6
ответ дан 7 November 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: