【发布时间】:2018-03-05 06:57:44
【问题描述】:
我一直在尝试使用 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()
赛通版本
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()
【问题讨论】:
-
不知道您所说的“摊位”是什么意思以及您的期望。使用 cython 没有任何收获 - 没有 python 计算,一切都由库内的 c 代码完成。你称它为实时,但使用阻塞 IO - 它应该如何工作?使用非阻塞版本people.csail.mit.edu/hubert/pyaudio/docs/…
-
“摊位”是指中间的音频中断。阻塞模式和非阻塞模式有什么区别?,谢谢你的链接。
-
在您的情况下,“阻塞”是指播放时不录制,录制时不播放
-
@ead ,虽然非阻塞可用于将输入(麦克风)直接连接到输出(耳机/扬声器),但您无法对音频进行任何处理,因为您无法访问/控制它.对于任何中流处理,OP 都需要使用阻塞版本(他正在使用)。
-
@SAJIL C K,请检查我的答案以获得解决方案。
标签: python audio signals real-time cython