簡體   English   中英

帶有麥克風輸入的 Python Librosa

[英]Python Librosa with Microphone input

所以我試圖讓 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)

您可以使用pyaudio callback函數來pyaudio 我認為使用類更容易。

在構造函數__init__您定義了所需的所有常量,並將 FORMAT 設置為pyaudio.paFloat32 ,以便您以后可以將它與librosa一起使用。

然后在start方法中我打開音頻流。 .open()stream_callback參數可讓您指定實現函數的方式。

callback方法將in_data, frame_count, time_info, flag作為參數in_data, frame_count, time_info, flag然后您會收到二進制文件中的in_data 所以你需要使用np.frombuffer(in_data, dtype=np.float32)將它們轉換成一個 numpy 數組。

完成此操作后,您可以像通常使用numpy.ndarray一樣使用 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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