簡體   English   中英

將實時音頻數據讀入 numpy 數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM