我有一个运行最新 jessie 的树莓派 3 的设置,其中安装了所有更新,其中我提供了一个 A2DP 蓝牙接收器,我可以在其中连接手机播放一些音乐。
通过pulseaudio,源(电话)被路由到alsa 输出(接收器)。这相当有效。
我现在想使用 python3.4 来分析音频流librosa https://github.com/librosa/librosa我发现了一个有希望的例子pyaudio https://people.csail.mit.edu/hubert/pyaudio/docs/#example-callback-mode-audio-i-o它被调整为使用脉冲音频输入(它神奇地工作,因为它是默认的)而不是 wavfile:
"""PyAudio Example: Play a wave file (callback version)."""
import pyaudio
import wave
import time
import sys
import numpy
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# define callback (2)
def callback(in_data, frame_count, time_info, status):
# convert data to array
data = numpy.fromstring(data, dtype=numpy.float32)
# process data array using librosa
# ...
return (None, pyaudio.paContinue)
# open stream using callback (3)
stream = p.open(format=p.paFloat32,
channels=1,
rate=44100,
input=True,
output=False,
frames_per_buffer=int(44100*10),
stream_callback=callback)
# start the stream (4)
stream.start_stream()
# wait for stream to finish (5)
while stream.is_active():
time.sleep(0.1)
# stop stream (6)
stream.stop_stream()
stream.close()
wf.close()
# close PyAudio (7)
p.terminate()
现在,虽然数据流原则上工作,但调用stream_callback 时存在延迟(缓冲区长度)。由于文档声明
请注意,PyAudio 在单独的线程中调用回调函数。
我假设在回调工作时,缓冲区不断填充主线程。当然,填充缓冲区会有一个初始延迟,之后我希望获得同步流。
我需要缓冲区中有较长的部分(请参阅frames_in_buffer),以便 librosa 能够正确执行分析。
这样的事怎么可能呢?这是树莓派 ARM 软件端口的限制吗?
我找到了其他答案,但是they https://stackoverflow.com/a/32161871/875020 use the https://stackoverflow.com/a/9235752/875020阻塞I/O https://stackoverflow.com/a/24985016/875020。我如何将其包装到一个线程中,以便 librosa 分析(可能需要一些时间)不会阻止缓冲区填充?
这个博客 http://bastibe.de/2012-11-02-real-time-signal-processing-in-python.html似乎与 cython 对抗性能问题,但我不认为延迟是性能问题。Or https://stackoverflow.com/a/41563752/875020 might it http://freshfoo.com/posts/pulseaudio_monitoring/?其他人似乎需要一些ALSA 调整 https://stackoverflow.com/a/39342170/875020但这在使用pulseaudio时会有帮助吗?
谢谢,任何意见表示赞赏!