【发布时间】:2019-12-12 07:44:43
【问题描述】:
我需要尽快绘制频谱图。使用 librosa 计算频谱图,然后使用 matplotlib 绘制。现在这需要大约 50 毫秒,是否可以更快地执行此操作?
我对 matplotlib 和 librosa 很陌生。
这是我的代码:
mel_spec = lb.melspectrogram(y=samples, sr=44100, fmax=8000, n_mels=256)
plt.figure()
plt.subplots(figsize=(0.5, 5))
librosa.display.specshow(librosa.power_to_db(mel_spec, ref=np.max), fmax=8000)
plt.axis('off')
plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
plt.margins(0, 0)
predict_img = io.BytesIO()
plt.savefig(predict_img, format="jpeg")
predict_img.seek(0)
更新:
有关用例的更多详细信息。
这些图像是用 100 毫秒的音频 sn-ps 创建的,并以 base64 编码字符串的形式返回,该字符串被转发到 ML 模型进行预测。我需要此设置以尽可能低的延迟。我对预测的延迟很好,但图像创建的延迟有点慢。
【问题讨论】:
-
尝试删除
plt.figure(),看看它是否会更快。另外,plt.savefig需要一些时间 -
你不能让它更快,至少如果你想得到相同的情节的话。您当然可以更改频谱图的参数;因为绘制更少的像素需要更少的时间。
-
不知道 librosa 或 Mel 规格是什么,但如果您有数据,您可以使用 pcolormesh 并在每次绘制之前更新数据。查看 pcolormesh 返回的四边形网格的 set_array 方法
-
@serafeim 删除 plt.figure() 和 plt.savefig() 减少了延迟。但是当我删除 savefig 时如何获得绘制的图像?
-
第一条评论没有帮助。当然,您需要绘制图形(通过
show或savefig),这需要时间。 @JodyKlymak 的评论可能会有所帮助,如果目的是产生几个数字 - 在这方面,问题可能会更详细地介绍用例。但大多数情况下,它实际上是关于不绘制比需要更多的像素......例如如果您创建一张 500 乘以 50 像素的图片,则绘制具有超过 50 个频率箱和超过 500 个时间箱的图像可能没有意义。
标签: python matplotlib librosa