使用python进行实时音频信号处理

新手上路,请多包涵

我一直在尝试使用 python 中的“pyAudio”模块进行实时音频信号处理。我所做的是一个从麦克风读取音频数据并通过耳机播放的简单案例。我尝试使用以下代码(Python 和 Cython 版本)。认为它有效,但不幸的是它停滞而且不够流畅。我怎样才能改进代码,使其顺利运行。我的电脑是 i7、8GB 内存。

蟒蛇版本

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()

原文由 Sajil C K 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

我相信您缺少 CHUNK 作为 player.write 调用的第二个参数。

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

另外,不确定它的格式错误。但是 player.write 需要跳转到 for 循环

And per pyaudio site you need to have RATE / CHUNK * RECORD_SECONDS and not RECORD *RATE/CHUNK as python * multiplication before / division .

 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()

Finally, you may want to increase rate to 44100 , CHUNK to 1024 and CHANNEL to 2 为了更好的保真度。

原文由 Anil_M 发布,翻译遵循 CC BY-SA 3.0 许可协议

下面的代码将采用默认输入设备,并将记录的内容输出到默认输出设备。

 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 是将处理后的数据发送回输出设备的地方。

注意块的默认参数为 1024,如 PyAudio 文档中所述: http ://people.csail.mit.edu/hubert/pyaudio/docs/#pyaudio.PyAudio.open

原文由 kckaiwei 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏