【问题标题】:Download and open file with librosa without writing to filesystem使用 librosa 下载并打开文件而不写入文件系统
【发布时间】:2020-04-13 00:40:10
【问题描述】:

我了解 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)

【问题讨论】:

    标签: python heroku flask librosa


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2022-11-17
      • 2017-08-26
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      相关资源
      最近更新 更多