据我所知,Heroku dynos 是短暂的,文件无法在请求之间存储。我有一个 Flask 应用程序,它应该从 Spotify 获取 MP3,将其传递给 LibROSA 进行分析,然后返回可视化结果。
我有一个在本地运行的脚本,用于使用 urllib.urlopen
下载文件,将其保存到文件中,然后使用 librosa.load
加载该文件。但是,我似乎无法从 Heroku 上的文件系统加载文件。当我无法控制文件系统时,如何加载下载的文件?
song_url = "https://p.scdn.co/mp3-preview/8e29d103eba74b5cef8600722fff3c491e37fc9a.mp3"
sample_30s = urlopen(song_url)
mp3_path = os.path.join(os.path.dirname(__file__), 'static/data/temp.mp3')
output = open(mp3_path, 'wb')
output.write(sample_30s.read())
y, sr = librosa.load(mp3_filepath)
最佳答案
librosa.load
可以拍file-like对象,作为文件路径的替代。对象返回 urlopen
是类似文件的。可以直接传递给librosa。
from urllib.request import urlopen
import librosa
with urlopen(song_url) as response:
y, sr = librosa.load(response)
但是,librosa 仅支持从文件系统加载 MP3 文件。您可以使用 soundfile.available_formats()
查看类文件对象支持哪些格式。 。获取不同格式的文件,或使用诸如 pydub 之类的库将其转换为 WAV。
import io
from urllib.request import urlopen
import librosa
import pydub
wav = io.BytesIO()
with urlopen(mp3_url) as r:
r.seek = lambda *args: None # allow pydub to call seek(0)
pydub.AudioSegment.from_file(r).export(wav, "wav")
wav.seek(0)
y, sr = librosa.load(wav)
关于python - 使用 librosa 下载并打开文件,无需写入文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59426275/