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

How can I convert a .wav to .mp3 in-memory?

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

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

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

  1. 我有很多 .npy 个文件。它们是预先缓存的,当实际 运行 应用程序时,拥有那么多“真实”I/O 将是非常低效的。
  2. 在服务器上执行应用程序的人员的访问权限冲突。

首先,我一直在寻找直接将numpy数组中的数据转换的方法,但似乎没有库函数。那么有没有一种简单的方法可以使用内存中的文件对象来实现这一点?

注意: 我发现了这个问题 How to convert MP3 to WAV in Python 及其解决方案在理论上可以进行调整,但这不在内存中。

您可以使用 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()

您可以使用 答案在 AudioSegments 和 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())

存在一个包装程序包 (audiosegment),可以将最后一行转换为:

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