[英]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.