用python检测并录制声音

时间:2010-04-19 15:00:10

标签: python audio detect record

我正在使用这个程序在python中录制声音:

Detect & Record Audio in Python

我想更改程序,以便在声卡输入检测到声音时开始录制。可能应该比较块中的输入声级,但是这是怎么做的?

3 个答案:

答案 0 :(得分:11)

您可以尝试这样的事情:

基于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

您可能希望使用块大小和阈值,直到获得所需的行为。

修改

您可以使用内置的audioop包来查找样本的均方根(rms),这通常是获得该级别的方法。

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

答案 1 :(得分:5)

通常使用某些声音的root mean square(RMS)并将其与您设置的某个阈值(将取决于您的麦克风的敏感程度)进行比较来检测何时没有静音是和其他事情所以你必须调整它)。此外,根据您希望麦克风检测声音的速度,您可能需要降低块大小,或者计算重叠数据块的RMS。

答案 2 :(得分:1)

如何操作请在您提供的链接中注明:

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

每次在循环中读取数据时,您必须设置阈值变量并与数据中的平均值(幅度)或其他相关参数进行比较。

你可以有两个嵌套循环,第一个用于触发录制,另一个用于在此之后连续保存声音数据块。