指定在Python中录制音频的最小触发频率



我正在使用pyaudio为Python中的声音激活录制编写一个脚本。我想在声音超过预先指定的音量和频率后触发5s录音。我已经设法使音量部分工作,但不知道如何指定最小触发频率(例如,我希望它在10kHz以上的频率下触发(:

import pyaudio
import wave
from array import array
import time

FORMAT=pyaudio.paInt16
CHANNELS=1
RATE=44100
CHUNK=1024
RECORD_SECONDS=5
audio=pyaudio.PyAudio() 
stream=audio.open(format=FORMAT,channels=CHANNELS, 
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
nighttime=True
while nighttime:
data=stream.read(CHUNK)
data_chunk=array('h',data)
vol=max(data_chunk)
if(vol>=3000):
print("recording triggered")
frames=[]
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("recording saved")
# write to file
words = ["RECORDING-", time.strftime("%Y%m%d-%H%M%S"), ".wav"]
FILE_NAME= "".join(words) 
wavfile=wave.open(FILE_NAME,'wb')
wavfile.setnchannels(CHANNELS)
wavfile.setsampwidth(audio.get_sample_size(FORMAT))
wavfile.setframerate(RATE)
wavfile.writeframes(b''.join(frames))
wavfile.close()
# check if still nighttime
nighttime=True 

stream.stop_stream()
stream.close()
audio.terminate()

我想在if(vol>=3000):行中添加类似if(vol>=3000 and frequency>10000):的内容,但我不知道如何设置frequency。如何做到这一点?

要检索信号的频率,可以计算傅立叶变换,从而切换到频域(代码中的freq(。您的下一步是计算信号的相对振幅(amp(。后者与音量成正比。

spec = np.abs(np.fft.rfft(audio_array))
freq = np.fft.rfftfreq(len(audio_array), d=1 / sampling_freq)
spec = np.abs(spec)
amp = spec / spec.sum()

请注意,3000也不是音量。当信号被数字化时,真实的音量信息丢失了。现在你只使用相对数,所以你可以检查一帧中1/3的能量是否在10khz以上。

这里有一些代码来说明这个概念:

idx_above_10khz = np.argmax(freq > 10000)
amp_below_10k = amp[:idx_above_10khz].sum()
amp_above_10k = amp[idx_above_10khz:].sum()

现在,您可以指定从amp_below_10k / amp_above_10k的某个比例,您应该触发您的程序。

最新更新