PyAudio:将paInt16字节数组转换为Int16,然后使用“读取”

时间:2019-02-20 19:29:11

标签: python arrays pyaudio bytearrayoutputstream bytearrayinputstream

这是我的第一篇文章,因此我将尝试对其进行逻辑格式化。我主要使用PyAudio在Python中创建实时(实时)音频调制代码。

首先,我以pyaudio.paInt16格式存储一小部分音频。在代码的稍后部分,我将调制音频,该音频我知道该如何对Int数组进行处理,而不对字节数组进行处理。尽管我将格式设置为pa.Int16,但是变量x保留了一个字节数组,通常如下所示:

  

\ x19 \ x00 \ x1a \ x00 \ x1b \ x00 \ x1c \ x00 \ x1e \ x00   \ x00“ \ x00#\ x00&\ x00)\ x00 * \ x00,\ x00 * \ x00)\ x00&\ x00!\ x00 \ x1e \ x00 \ x1c \ x00 \ x1c \ x00 \ x1c \ x00 \ x1e \ x00 \ x1d \ x00 \ x1e \ x00!\ x00   \ x00!\ x00!\ x00!\ x00   \ x00 \ x1e \ x00 \ x19 \ x00 \ x16 \ x00 \ x14 \ x00 \ x13 \ x00 \ x14 \ x00 \ x13 \ x00 \ x14 \ x00 \ x11 \ x00 \ x11 \ x00 \ x11 \ x00 \ x13 \ x13 \ x00 \ x13 \ x00 \ x11 \ x00 \ x11 \ x00 \ x10 \ x00 \ x0f \ x00 \ x10 \ x00 \ x11 \ x00 \ x0f \ x00 \ x0c \ x00 \ x0 \ x0c \ x00 \ x0b \ x00 \ x00 \ x08 \ x00 \ x00 \ x00 \ x00 \ x02 \ x00 \ x00 \ x00 \ xfe \ xff \ xfe \ xff \ xfb \ xff \ xf8 \ xff \ xf8 \ xff \ xf8 \ xff \ xfa \ xff \ xfb \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ x01 \ x00 \ x00 \ x00 \ x02 \ x00 \ x03 \ x00 \ x02 \ x00 \ x04 \ x00 \ x04 \ x00 \ x04 \ x00 \ x02 \ x00 \ x03 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ xff \ xff \ x00 \ x00 \ x00 \ x00 \ x02 \ x00 \ x02 \ x00 \ x04 \ x00 \ x02 \ x00 \ xfd \ xff \ xfb \ xff \ xf7 \ xff \ xf4 \ xff \ xf4 \ xff \ xef \ xff \ xec \ xff \ xea \ xff \ xe6 \ xff \ xe3 \ xff \ xde \ xff \ xdc \ xff \ xd9 \ xff \ xd4 \ xff \ xd0 \ xff \ xcb \ xff \ xc8 \

然后我使用for循环将字节数组转换为整数版本。 for循环未声明它们是int,pyaudio还是numpy.ndarrays,但它们以ndarray的形式出现。首先,我尝试运行如下的for循环:

for thenew in range(0,CHUNK - 1):
xx[thenew] = x[thenew]  

但是我意识到,由于字节数组将每个整数存储为2个字节(Int16),因此它在某些数据上丢失了。现在,我正在这样做:

for thenew in range(0,CHUNK - 1):
xx[thenew] = x[thenew*2  ]  

存储最高有效字节并将其转换为整数,并且每个整数仅与组成该整数的最高有效字节对齐。 int数组中的值似乎与字节数组中的十六进制值对齐。最后,作为其余代码的概念证明,我尝试将其转换回pyaudio.write()可以听起来很大的字节数组。但是,当我检查通过以下方式输出的值时:

np.ndarray.tobytes(xx)

无论字节xx中的整数如何,新的字节数组都趋于几乎全部由零组成,并且写函数会发出很大的crack啪声。

请让我知道是否能提供更多信息来帮助解决此问题,这让我有些疯狂! :(谢谢您的事先帮助!

CHUNK = 1024  # number of audio samples per frame (1024 samples/ chunk)
FORMAT = pyaudio.paInt16

CHANNELS = 1

RATE = 44100

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, output=True, frames_per_buffer=CHUNK)



while True:

for b in range(0,5): #THIS IS RUN SO THAT X STORES VALUES (0's AT FIRST WHEN STREAM.READ IS CALLED)
    x = stream.read(CHUNK, exception_on_overflow=False)

x = stream.read(CHUNK, exception_on_overflow=False)
xx = np.zeros(CHUNK)

for thenew in range(0,CHUNK - 1):
    xx[thenew] = x[thenew*2  ]  # xx is np array


stream.write(np.ndarray.tobytes(xx))

我想知道问题是否与试图将基于一半Int16字节数据的int转换回Int16有关,但是xx中的Ints本质上是由Int8创建的,因为我互相使用吗? Tl; Dr是为什么np.ndarray.tobytes(xx)的零为输出?

0 个答案:

没有答案