1

我知道 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)
4

1 回答 1

2

librosa.load可以采用类似文件的对象,作为文件路径的替代。返回的对象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)
于 2019-12-20T17:38:44.933 回答