views:

331

answers:

3

I'm using this program to record a sound in python:

http://stackoverflow.com/questions/892199/detect-record-audio-in-python/892293#892293

I want to change the program to start recording when sound is detected by the sound card input. Probably should compare the input sound level in chunk, but how do this?

+1  A: 

Detecting when there isn't silence is usually done by using the root mean square(RMS) of some chunk of the sound and comparing it with some threshold value that you set (the value will depend on how sensitive your mic is and other things so you'll have to adjust it). Also, depending on how quickly you want the mic to detect sound to be recorded, you might want to lower the chunk size, or compute the RMS for overlapping chunks of data.

Justin Peel
+2  A: 

You could try something like this:

based on this question/answer

# 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

You'll probably want to play with your chunk size and threshold values until you get the desired behavior.

Edit:

You can use the built-in audioop package to find the root-mean-square (rms) of a sample, which is generally how you would get the level.

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
tgray
+1  A: 

how to do it is indicated in the link you give:

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

You have to set the threshold variable and compare with the average value (the amplitude) or other related parameter in data each time it is read in the loop.

You could have two nested loops, the first one to trigger the recording and the other to continously save sound data chuncks after that.

joaquin