将实时音频数据读入numpy阵列

2024-04-20 09:09:44 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将实时音频读入numpy数组并使用matplotlib进行绘图?

现在我正在一个wav文件上录制音频,然后使用scikits.audiolab.wavread将其读入数组。 有没有一种方法可以直接实时完成?


Tags: 文件方法numpy绘图matplotlib数组音频scikits
2条回答

有一个名为PyAudio的库。你可以用它来实时记录。另外,在numpy.fromstring()numpy.hstack()的帮助下,您可以获得所需的输出。请注意,下面的代码片段用于MONO-CHANNEL

import pyaudio
import numpy

RATE=16000
RECORD_SECONDS = 2.5
CHUNKSIZE = 1024

# initialize portaudio
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, input=True, frames_per_buffer=CHUNKSIZE)

frames = [] # A python-list of chunks(numpy.ndarray)
for _ in range(0, int(RATE / CHUNKSIZE * RECORD_SECONDS)):
    data = stream.read(CHUNKSIZE)
    frames.append(numpy.fromstring(data, dtype=numpy.int16))

#Convert the list of numpy-arrays into a 1D array (column-wise)
numpydata = numpy.hstack(frames)

# close stream
stream.stop_stream()
stream.close()
p.terminate()

这是一个经过测试的代码。它应该有魅力。为了检查记录的数据是否在numpydata中正确可用,可以在前面的代码之后添加以下代码片段。

import scipy.io.wavefile as wav
wav.write('out.wav',RATE,numpydata)

这些行将把您的numpydata写入“out.wav”。播放文件以检查数据。

这是我在StackOverflow中的第一个响应。希望有帮助。

您可以使用^{}录制音频,并使用^{}将其转换为numpy数组。

import pyaudio
import numpy as np
from matplotlib import pyplot as plt

CHUNKSIZE = 1024 # fixed chunk size

# initialize portaudio
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=CHUNKSIZE)

# do this as long as you want fresh samples
data = stream.read(CHUNKSIZE)
numpydata = np.frombuffer(data, dtype=np.int16)

# plot data
plt.plot(numpydata)
plt.show()

# close stream
stream.stop_stream()
stream.close()
p.terminate()

如果要录制立体声而不是单声道,则必须将channels设置为2。然后你得到一个有交错通道的阵列。你可以这样重塑它:

frame = np.frombuffer(data, dtype=numpy.int16)       # interleaved channels
frame = np.stack((frame[::2], frame[1::2]), axis=0)  # channels on separate axes

相关问题 更多 >