我一直在尝试使用python中的“pyAudio”模块进行实时音频信号处理。我所做的只是一个简单的例子,从麦克风读取音频数据并通过耳机播放。我尝试了以下代码(Python和Cython版本)。我以为它能用,但不幸的是它太慢了,不够光滑。我该如何改进代码,使其能够顺利运行。我的电脑是i7,8GB内存。
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()
下面的代码将采用默认输入设备,并将记录的内容输出到默认输出设备中。
这将持续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
我正在做一个类似的项目。我修改了你的代码,现在摊位都不见了。大块越大,延迟越大。所以我把它放低了。
我相信您缺少
CHUNK
作为player.write
调用的第二个参数。另外,不确定它的格式是否有错误。但是
player.write
需要被标记到for
循环中每pyaudio site需要
RATE / CHUNK * RECORD_SECONDS
,而不是RECORD *RATE/CHUNK
,因为python
在/
除法之前执行*
乘法。最后,您可能需要将
rate
增加到44100
,将CHUNK
增加到1024
,并将CHANNEL
增加到2
以获得更好的保真度。相关问题 更多 >
编程相关推荐