2017-08-09 385 views
2

我正在寫一個程序來檢查計算機記錄的音頻信號中的毛刺。在檢測到音頻後,我想檢查前5秒數據中的毛刺(對應於採樣率爲44.1kHz的220500個採樣),繼續檢查下一個5秒的數據並檢查毛刺,然後接下來的5秒鐘等。我有一個while循環,它在音頻被檢測到後開始,它開始將音頻樣本從一個流中讀取到一個數組中,直到它在數組中有220500個樣本,然後它進入一個if語句開始檢查220500採樣中的毛刺(並在之後刪除陣列中的所有元素)。我的問題是,在發生這種情況時,音頻仍然由計算機錄製,但它並未從流中讀入數組,並且當我退出if語句並重新啓動while循環時,我錯過了幾秒鐘的音頻數據。在Python中的實時音頻處理

while 1: 
    # little endian, signed short 
    snd_data = array('h', stream.read(1500)) 
    if byteorder == 'big': 
     snd_data.byteswap() 
    r.extend(snd_data) 
    if len(r) == 220500 or silent: 
     r = trim(r) 
     data = pack('<' + ('h'*len(r)), *r) 
     data = np.fromstring(data,dtype=np.int16) 

     glitch detection carried out here... 

我使用PyAudio錄製音頻

p=pyaudio.PyAudio() # start the PyAudio class 
stream=p.open(format=pyaudio.paInt16,channels=1,rate=RATE,input=True,input_device_index = 1, output_device_index = 6,frames_per_buffer=1500) 

我想知道有沒有什麼辦法,我繼續從音頻流中讀取到陣列,同時在開展毛刺檢測如果陳述?或者,如果沒有,我還有其他辦法可以解決這個問題嗎?

+2

您是否嘗試過使用多個進程?你可以產生一個進程讀取你的音頻流,另一個進程處理它「毛刺檢測」。看看這個:https://docs.python.org/2/library/multiprocessing.html – ma3oun

+0

謝謝,我會看看它。 – CJF

+0

「音頻仍然被計算機錄製,但它沒有從流中讀入陣列」爲什麼不?流緩衝區是否太小? – Trilarion

回答

0

你的答案是多線程沒有多處理,通過使用Python 線程包和其美妙信號功能,可以實現你想要的。

+0

鏈接到文檔將有所幫助。這個奇妙但神祕的「信號」功能是什麼?你有任何意思[threading.Event](https://docs.python.org/3/library/threading.html#threading.Event)?另一個可能有用的是[queue.Queue](https://docs.python.org/3/library/queue.html)。 – Matthias