这是我的第一篇文章,所以我会尝试在逻辑上对其进行格式化。我主要使用 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\x00\x13\x00\x11\x00 \x11\x00\x10\x00\x0f\x00\x10\x00\x11\x00\x0f\x00\x0c\x00\x0c\x00\x0b\x00\x08\x00\x06\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\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\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.ndarray,但它们以 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 中的整数如何,新的字节数组往往几乎完全由零组成,并且 write 函数会输出响亮的噼啪声。
如果我能提供更多信息来帮助解决这个问题,请告诉我,这让我有点发疯!:( 提前谢谢你的帮助!
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 字节数据的一半的整数转换回 Int16s 但 xx 中的 Int 基本上是由 Int8 创建的,因为我正在使用其他整数?Tl;Dr 为什么输出np.ndarray.tobytes(xx)
为零?