librosa.load() 加载(样本)mp3 文件需要太长时间

问题描述 投票:0回答:2

我正在尝试使用

librosa
库通过以下 Python 代码对 mp3 文件进行采样(将模拟转换为数字),但这需要太多时间(一个文件大约需要 4 秒)。我怀疑这是因为
librosa
不支持
mp3
,因此使用较慢的
audioread
来采样
mp3

代码:

import time
import librosa

s = time.time()
for i in mp3_list[:10]: # list of mp3 file paths, doing for 10 files
    y, sr = librosa.load(i)

print('time taken =', time.time() - s)

time taken = 36.55561399459839

我也收到此警告:

UserWarning: "PySoundFile failed. Trying audioread instead."

显然,这对于任何实际应用来说都太长了。我想知道是否有更好的替代方案?

为了比较,采样 10 个相同大小的

1.2
转换总共只花费了大约
wav
秒的时间

python-3.x audio mp3 sampling librosa
2个回答
4
投票

所以警告有点暗示了。 Librosa 开发人员在这个 GitHub 问题中解决了类似的问题:

加载 mp3 时总会出现此警告,因为 libsndfile (目前)不支持 mp3 格式。 Librosa 尝试使用 首先是 libsndfile,如果失败,它将依赖于 audioread 包,它有点慢而且更脆弱,但是 支持更多格式。

这在Librosa代码中得到了确认:

try ... except RuntimeError ...

因此,在这种情况下你可以做的就是实现自己的

load()
,直接使用
audioread
来避免在
librosa.load()
的第一个块中浪费时间,或者你可以使用不同的库,例如pydub。或者,您可以在加载之前使用 ffmpeg 将 mp3 转换为 Wave


0
投票
既然librosa最终使用'audioread'来读取MP3文件,为什么不直接使用'audioread',它是librosa包的一部分?

import librosa import audioread import numpy as np from time import time t = time() y, sr = librosa.load(file) t1 = time()-t t = time() with audioread.audio_open(file) as f: nchannels = f.channels data = f.read_data() ba = bytearray() for block in data: ba.extend(block) y = np.frombuffer(ba, dtype='<i2').reshape(-1, nchannels) t2 = time()-t print("Librosa time:",t1) print("Audioread time:",t2)
结果:
图书馆时间:20.083969354629517
音频阅读时间:0.20102357864379883 快 100 倍!

嗯,这是在新会话开始时,即在缓存 librosa 代码之前。第二次,librosa 时间大约是一半。尽管如此,“有声读物”还是快了 50 倍。事实上,你甚至感觉不到“有声读物”的时间。

您可以使用您的“文件”进行测试。我显示的结果是 183,990 字节、45 秒的 MP3 文件。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.