因此,我试图使librosa可以使用麦克风输入而不是仅使用wav文件,并且遇到了一些问题。最初,我使用pyaudio库连接到麦克风,但无法转换此数据供librosa使用。关于应该如何处理的任何建议,或者甚至可能吗?
我尝试过的一些事情包括从pyaudio麦克风接收数据,将其解码为浮点数组并将其传递给librosa(从文档中可以看出,这是librosa对带有.load的wav文件所做的工作),但它不能像它产生以下错误:
“librosa.util.exceptions.ParameterError:音频缓冲区不是到处都是有限的”
FORMAT = pyaudio.paInt16
RATE = 44100
CHUNK = 2048
WIDTH = 2
CHANNELS = 2
RECORD_SECONDS = 5
stream = audio.open(format=FORMAT,
channels = CHANNELS,
rate = RATE,
input=True,
output=True,
frames_per_buffer=CHUNK)
while True:
data = stream.read(CHUNK)
data_float = np.fromstring(data , dtype=np.float16)
data_np = np.array(data_float , dtype='d')
# data in 1D array
mfcc = librosa.feature.mfcc(data_np.flatten() , 44100)
print(mfcc)
最佳答案
您可以使用callback
中的pyaudio
函数来完成此操作。我认为使用类(class)更容易。
在构造函数__init__
中,定义所有需要的常量,并将FORMAT设置为pyaudio.paFloat32
,以便以后将其与librosa
结合使用。
然后在start
方法中,打开音频流。 stream_callback
中的.open()
参数使您可以指定实现函数的方式。callback
方法采用in_data, frame_count, time_info, flag
作为参数,然后您以二进制形式接收in_data
。因此,您需要使用np.frombuffer(in_data, dtype=np.float32)
将它们转换为numpy数组。
完成此操作后,您可以像使用librosa一样正常使用numpy.ndarray
我认为可以对其进行优化,但是该解决方案对我来说效果很好,希望对您有所帮助:)
import numpy as np
import pyaudio
import time
import librosa
class AudioHandler(object):
def __init__(self):
self.FORMAT = pyaudio.paFloat32
self.CHANNELS = 1
self.RATE = 44100
self.CHUNK = 1024 * 2
self.p = None
self.stream = None
def start(self):
self.p = pyaudio.PyAudio()
self.stream = self.p.open(format=self.FORMAT,
channels=self.CHANNELS,
rate=self.RATE,
input=True,
output=False,
stream_callback=self.callback,
frames_per_buffer=self.CHUNK)
def stop(self):
self.stream.close()
self.p.terminate()
def callback(self, in_data, frame_count, time_info, flag):
numpy_array = np.frombuffer(in_data, dtype=np.float32)
librosa.feature.mfcc(numpy_array)
return None, pyaudio.paContinue
def mainloop(self):
while (self.stream.is_active()): # if using button you can set self.stream to 0 (self.stream = 0), otherwise you can use a stop condition
time.sleep(2.0)
audio = AudioHandler()
audio.start() # open the the stream
audio.mainloop() # main operations with librosa
audio.stop()
关于python - 带麦克风输入的Python Librosa,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59056786/