Обнаружение и запись звука с помощью 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
Вы должны установить пороговую переменную и сравнить ее со средним значением (амплитудой) или другим соответствующим параметром в данных каждый раз, когда он считывается в цикле.
У вас может быть два вложенных цикла, первый из которых запускает запись, а другой - для сохранения звуковых данных после этого.