Обнаружение и запись звука с помощью python

Я использую эту программу для записи звука в python:

Обнаружение и запись аудио в Python

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

Ответ 1

Вы можете попробовать что-то вроде этого:

на основе этого вопроса/ответа

# this is the threshold that determines whether or not sound is detected
THRESHOLD = 0

#open your audio stream    

# wait until the sound data breaks some level threshold
while True:
    data = stream.read(chunk)
    # check level against threshold, you'll have to write getLevel()
    if getLevel(data) > THRESHOLD:
        break

# record for however long you want
# close the stream

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

Edit:

Вы можете использовать встроенный audioop пакет, чтобы найти среднеквадратическую (среднеквадратическую) выборку, которая как правило, вы получите уровень.

import audioop
import pyaudio

chunk = 1024

p = pyaudio.PyAudio()

stream = p.open(format=pyaudio.paInt16,
                channels=1,
                rate=44100,
                input=True,
                frames_per_buffer=chunk)

data = stream.read(chunk)

rms = audioop.rms(data, 2)  #width=2 for format=paInt16

Ответ 2

Обнаружение, когда нет молчания, обычно делается с помощью корневого среднего квадрата (RMS) некоторого фрагмента звука и сравнения это с некоторым пороговым значением, которое вы устанавливаете (значение будет зависеть от того, насколько чувствителен ваш микрофон и другие вещи, поэтому вам придется его корректировать). Кроме того, в зависимости от того, насколько быстро вы хотите, чтобы микрофон обнаружил звук, который нужно записать, вы можете уменьшить размер фрагмента или вычислить RMS для перекрывающихся фрагментов данных.

Ответ 3

как это сделать, указывается в ссылке, которую вы даете:

print "* recording"
for i in range(0, 44100 / chunk * RECORD_SECONDS):
    data = stream.read(chunk)
    # check for silence here by comparing the level with 0 (or some threshold) for 
    # the contents of data.
    # then write data or not to a file

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

У вас может быть два вложенных цикла, первый из которых запускает запись, а другой - для сохранения звуковых данных после этого.