python - 使用 librosa 下载并打开文件,无需写入文件系统

标签 python heroku flask librosa

据我所知,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/

相关文章:

python - 如何用序号替换列表中的值?

python - 如何确定在 Tornado/Flask/Python 上上传 HTTP 请求需要多长时间?

python - 由于导入 current_app,Sphinx 无法记录 Flask 项目

python - 获取 mongoengine 中的第一个对象

python - 为什么 sort() 函数不能应用于列表理解?

python - beautifulsoup 是否有一个功能可以删除所有空格

python - Pandas 聚合然后得到组平均值

java - 单击“打开应用程序”时,heroku 应用程序错误

ruby-on-rails - 在 Heroku 上使用 Postmark API 发送 Rails 电子邮件——连接被对等方重置

python - 如何修改 Procfile 以在 Heroku 上的非标准文件夹中运行 Gunicorn 进程?