Python 如何在内存中将.wav转换为.mp3?

Python 如何在内存中将.wav转换为.mp3?,python,numpy,audioformat,Python,Numpy,Audioformat,我有一个来自some.npy文件的numpy数组,其中包含以.wav格式编码的音频文件的数据。 some.npy是使用sig=librosa.load(some\u wav\u文件,sr=22050)和np.save('some.npy',sig)创建的 我想转换这个numpy数组,就好像它的内容是用.mp3编码的一样 不幸的是,出于两个原因,我只能使用内存中的文件对象。 我有许多.npy文件。它们是预先缓存的,在实际运行应用程序时,有这么多“真实”的I/O是非常低效的 在服务器上执行应用程序的

我有一个来自
some.npy
文件的numpy数组,其中包含以
.wav
格式编码的音频文件的数据。

some.npy
是使用
sig=librosa.load(some\u wav\u文件,sr=22050)
np.save('some.npy',sig)
创建的 我想转换这个numpy数组,就好像它的内容是用
.mp3
编码的一样

不幸的是,出于两个原因,我只能使用内存中的文件对象。

  • 我有许多
    .npy
    文件。它们是预先缓存的,在实际运行应用程序时,有这么多“真实”的I/O是非常低效的
  • 在服务器上执行应用程序的人员的访问权限冲突
  • 首先,我正在寻找一种直接转换numpy数组中数据的方法,但似乎没有库函数。那么,有没有一种简单的方法可以通过内存中的文件对象实现这一点呢


    注意:我发现这个问题及其解决方案在理论上可以调整,但这不在内存中。

    您可以使用BytesIO读取和写入内存,如下所示:

    import BytesIO
    
    # Create "in-memory" buffer
    memoryBuff = io.BytesIO()
    
    您可以使用
    pydub
    模块读写MP3:

    from pydub import AudioSegment
    
    # Read a file in
    sound = AudioSegment.from_wav('stereo_file.wav')
    
    # Write to memory buffer as MP3
    sound.export(memoryBuff, format='mp3')
    
    您的MP3数据现在可以在
    memoryBuff.getvalue()上找到


    您可以使用answer在
    音频片段
    和Numpy阵列之间进行转换。

    我终于找到了一个可行的解决方案。这就是我想要的

    from pydub import AudioSegment
    wav = np.load('some.npy')
    with io.BytesIO() as inmemoryfile:
            compression_format = 'mp3'
            n_channels = 2 if wav.shape[0] == 2 else 1 # stereo and mono files
            AudioSegment(wav.tobytes(), frame_rate=my_sample_rate, sample_width=wav.dtype.itemsize,
                         channels=n_channels).export(inmemoryfile, format=compression_format)
            wav = np.array(AudioSegment.from_file_using_temporary_files(inmemoryfile)
                           .get_array_of_samples())
    
    存在一个包装包(),可以使用它将最后一行转换为:

    wav = audiosegment.AudioSegment.to_numpy_array(AudioSegment.from_file_using_temporary_files(inmemoryfile))
    

    我不能直接使用它,因为我需要处理numpy数据,但我在
    audiosegment
    -包装中找到了
    audiosegment.from\u numpy\u数组(nparr,帧率)
    。我现在的问题是
    sound.export(memoryBuff,format='mp3')
    返回一个
    bytestr
    而不是
    numpy
    数组。我尝试了多种方法将其转换为numpy数组(例如
    audiosegment.deserialize(bytestr)
    ,然后是您建议的
    pydub\u to\u np
    ),但我得到了各种各样的错误。我该怎么做?编辑:无论出于何种原因,
    np.frombuffer(bytestr)
    以前不起作用。。现在可以了,对不起,是误传
    np.frombuffer(bytestr)
    确实可以工作,但它会导致非常奇怪的值,这在某种程度上是可以理解的,因为
    返回的bytestring.export
    调用对mp3文件进行编码,并包含头信息等。
    np.frombuffer(bytestr)
    无法以合理的方式解释。如何以正确的方式将
    bytestr
    转换回
    numpy
    数组?