Обнаружить и записать звук с Python - PullRequest
11 голосов
/ 19 апреля 2010

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

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

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

Ответы [ 3 ]

11 голосов
/ 19 апреля 2010

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

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

# 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

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

Изменить:

Вы можете использовать встроенный пакет 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
5 голосов
/ 19 апреля 2010

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

1 голос
/ 19 апреля 2010

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

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

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

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

...