我正在尝试编写一个程序来分析我的计算机录制的音频块。我希望能够将音频分成大约5秒钟(大约220500个样本)的块,如果没有可用的5秒样本,只需留下任何剩余的(例如,如果记录为32)几秒钟,我想将流分成6段,长5秒,最后段2秒。我使用Pyaudio录制音频
stream=p.open(format=pyaudio.paInt16,channels=1,rate=RATE,input=True,
input_device_index=1, output_device_index=6,frames_per_buffer=1500, stream_callback = callback)
使用每1500个样本调用一次的回调函数。回调函数检查音频是否存在,如果存在,则将1500个样本写入队列。
q = Queue.Queue()
def callback(in_data, frame_count, time_info, status):
in_data = array('h', in_data)
if is_silent(in_data) == False:
in_data = trim(in_data)
in_data = np.fromstring(in_data, dtype=np.int16)
q.put(in_data)
return (in_data, pyaudio.paContinue)
检测到音频后,我的程序进入以下循环:
r = array('h')
while 1:
if q.empty() == False:
snd_data = q.get()
r.extend(snd_data)
if len(r) > 220500 or q.empty() == True:
print len(r)
r = []
r = array('h')
我希望while循环运行直到队列为空,并检查if语句是否记录了大约5秒的音频数据并存在于r中。如果队列是空的,我想分析r中剩下的任何东西(在这种情况下,只是打印留在屏幕上的任何东西),然后结束循环,但是我在制作一个可以做到这一点的循环时遇到了麻烦提前结束或无限期地运行。有没有人有任何想法如何改变代码以实现我的目标?