簡體   English   中英

使用python進行實時音頻信號處理

[英]Real-time audio signal processing using python

我一直在嘗試使用python中的'pyAudio'模塊進行實時音頻信號處理。 我所做的是從麥克風讀取音頻數據並通過耳機播放的簡單案例。 我嘗試使用以下代碼(Python和Cython版本)。 認為它的工作原理,但不幸的是它是攤位,不夠平穩。 如何改進代碼以使其順利運行。 我的電腦是i7,8GB RAM。

Python版本

import pyaudio
import numpy as np

RATE    = 16000
CHUNK   = 256

p               =   pyaudio.PyAudio()

player = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, output=True, 
frames_per_buffer=CHUNK)
stream = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, input=True, frames_per_buffer=CHUNK)

for i in range(int(20*RATE/CHUNK)): #do this for 10 seconds
player.write(np.fromstring(stream.read(CHUNK),dtype=np.int16))
stream.stop_stream()
stream.close()
p.terminate()

Cython版本

import pyaudio
import numpy as np

cdef int RATE   = 16000
cdef int CHUNK  = 1024
cdef int i      
p               =   pyaudio.PyAudio()

player = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, output=True, frames_per_buffer=CHUNK)
stream = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, input=True, frames_per_buffer=CHUNK)

for i in range(500): #do this for 10 seconds
    player.write(np.fromstring(stream.read(CHUNK),dtype=np.int16))
stream.stop_stream()
stream.close()
p.terminate()

我相信你缺少CHUNK作為player.write調用的第二個參數。

player.write(np.fromstring(stream.read(CHUNK),dtype=np.int16),CHUNK)

此外,不確定其格式錯誤。 但是需要將player.writefor循環

並且每個pyaudio站點你需要有RATE / CHUNK * RECORD_SECONDS而不是RECORD *RATE/CHUNK因為python/ division之前執行* multiplication。

for i in range(int(20*RATE/CHUNK)): #do this for 10 seconds
    player.write(np.fromstring(stream.read(CHUNK),dtype=np.int16),CHUNK)

stream.stop_stream()
stream.close()
p.terminate()

最后,您可能希望將rate提高到44100 ,將CHUNK1024 ,將CHANNEL2以獲得更高的保真度。

下面的代碼將采用默認輸入設備,並輸出記錄到默認輸出設備中的內容。

import PyAudio
import numpy as np

p = pyaudio.PyAudio()

CHANNELS = 2
RATE = 44100

def callback(in_data, frame_count, time_info, flag):
    # using Numpy to convert to array for processing
    # audio_data = np.fromstring(in_data, dtype=np.float32)
    return in_data, pyaudio.paContinue

stream = p.open(format=pyaudio.paFloat32,
                channels=CHANNELS,
                rate=RATE,
                output=True,
                input=True,
                stream_callback=callback)

stream.start_stream()

while stream.is_active():
    time.sleep(20)
    stream.stop_stream()
    print("Stream is stopped")

stream.close()

p.terminate()

這將運行20秒並停止。 方法回調是您可以處理信號的地方: audio_data = np.fromstring(in_data, dtype=np.float32)

return in_data是將后處理數據發送回輸出設備的位置。

注意chunk的默認參數為1024,如PyAudio docs中所述: http ://people.csail.mit.edu/hubert/pyaudio/docs/#pyaudio.PyAudio.open

我正在做一個類似的項目。 我修改了你的代碼,現在攤位都沒了。 塊越大,延遲越大。 這就是我保持低調的原因。

import pyaudio
import numpy as np

CHUNK = 2**5
RATE = 44100
LEN = 10

p = pyaudio.PyAudio()

stream = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, input=True, frames_per_buffer=CHUNK)
player = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, output=True, frames_per_buffer=CHUNK)


for i in range(int(LEN*RATE/CHUNK)): #go for a LEN seconds
    data = np.fromstring(stream.read(CHUNK),dtype=np.int16)
    player.write(data,CHUNK)


stream.stop_stream()
stream.close()
p.terminate()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM