gpt4 book ai didi

带有麦克风输入的 Python Librosa

转载 作者:行者123 更新时间:2023-12-02 22:13:55 24 4
gpt4 key购买 nike

所以我试图让 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()

关于带有麦克风输入的 Python Librosa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59056786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com