[英]Reading realtime audio data into numpy array
如何將實時音頻讀入 numpy 數組並使用 matplotlib 進行繪圖?
現在我正在wav
文件上錄制音頻,然后使用scikits.audiolab.wavread
將其讀入數組。 有沒有辦法可以直接實時執行此操作?
您可以使用PyAudio
錄制音頻並使用np.frombuffer
將其轉換為 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
有一個名為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.wavfile as wav
wav.write('out.wav',RATE,numpydata)
這些行會將您的numpydata
寫入“out.wav”。 播放文件以檢查數據。
PS:這是我在 StackOverflow 中的第一個回復。 希望能幫助到你。
import librosa
file = 'audio/a1.wav'
signal, _ = librosa.load(file)
print(type(signal))
這個答案類似於這里的第一個答案,但我已經包含了繪制音頻數據的缺失部分。
import pyaudio
import wave
import numpy as np
import noisereduce as nr
#This library helps us in plotting the audio
import matplotlib.pyplot as plt
def plotAudio2(output):
fig, ax = plt.subplots(nrows=1,ncols=1, figsize=(20,4))
plt.plot(output, color='blue')
ax.set_xlim((0, len(output)))
plt.show()
CHUNK = 22050
FORMAT = pyaudio.paFloat32
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 20
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
data_sample = np.frombuffer(data, dtype=np.float32)
print("data sample")
plotAudio2(data_sample)
stream.stop_stream()
stream.close()
p.terminate()
我已經測試了上面的代碼片段,這對我來說非常好。
注意:此代碼片段在 Windows 中進行了測試, matplotlib在 MacOS 中可能存在一些問題(不過我不確定)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.