我正在尝试使用
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
秒的时间
所以警告有点暗示了。 Librosa 开发人员在这个 GitHub 问题中解决了类似的问题:
加载 mp3 时总会出现此警告,因为 libsndfile (目前)不支持 mp3 格式。 Librosa 尝试使用 首先是 libsndfile,如果失败,它将依赖于 audioread 包,它有点慢而且更脆弱,但是 支持更多格式。
这在Librosa代码中得到了确认:
try ... except RuntimeError ...
因此,在这种情况下你可以做的就是实现自己的
load()
,直接使用audioread
来避免在librosa.load()
的第一个块中浪费时间,或者你可以使用不同的库,例如pydub。或者,您可以在加载之前使用 ffmpeg 将 mp3 转换为 Wave。
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 文件。