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



我有一个来自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数组中数据的方法,但似乎没有库函数。那么,有没有一种简单的方法可以通过内存中的文件对象来实现这一点呢?

注意:我发现了这个问题——如何在Python中将MP3转换为WAV及其解决方案在理论上可以进行调整,但这不在内存中。

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

存在一个包装包(音频片段(,使用该包装包可以将最后一行转换为:

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

最新更新