带麦克风输入的 Python Librosa

2023-12-30

因此,我试图让 librosa 使用麦克风输入而不是仅使用 wav 文件,但遇到了一些问题。最初我使用 pyaudio 库连接到麦克风,但我在翻译这些数据以供 librosa 使用时遇到问题。关于如何解决这个问题有什么建议,或者是否可能?

我尝试过的一些事情包括从 pyaudio mic 接收数据,将其解码为浮点数组并将其传递给 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。我认为使用类更容易。

在构造函数中__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 数组。

完成此操作后,您可以使用您的numpy.ndarray就像你通常对 librosa 所做的那样

我认为这可以优化,但这个解决方案对我来说效果很好,希望它有帮助:)

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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带麦克风输入的 Python Librosa 的相关文章

随机推荐