首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有麦克风输入的Python Librosa

带有麦克风输入的Python Librosa
EN

Stack Overflow用户
提问于 2019-11-27 01:52:42
回答 1查看 3.6K关注 0票数 5

因此,我正在尝试让librosa使用麦克风输入,而不仅仅是wav文件,并且已经运行了一些问题。最初,我使用pyaudio库来连接麦克风,但在翻译这些数据以供librosa使用时遇到了问题。有没有关于如何实现这一点的建议,或者这是可能的吗?

我尝试过的一些事情包括从pyaudio麦克风接收数据,将其解码为一个浮点数组,并将其传递给librosa (从文档中,这就是librosa使用.load对wav文件所做的),但它没有工作,因为它产生了以下错误:"librosa.util.exceptions.ParameterError:音频缓冲区不是到处都是有限的“

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-17 21:09:48

您可以使用pyaudio中的callback函数来完成此操作。我认为使用一个类会更容易。

在构造函数__init__中,您定义了所需的所有常量,并将格式设置为pyaudio.paFloat32,这将使您稍后能够在librosa中使用它。

然后在start方法中打开音频流。.open()中的stream_callback参数允许您指定实现函数的方式。

callback方法以in_data, frame_count, time_info, flag作为参数,然后你会收到二进制形式的in_data。因此,您需要使用np.frombuffer(in_data, dtype=np.float32)将它们转换为numpy数组。

完成后,您就可以像使用librosa一样使用numpy.ndarray了。

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

代码语言:javascript
运行
复制
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()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59056786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档