你可以使用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()