0

我有一个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,其解决方案在理论上可以适应,但这不是内存中的。

4

2 回答 2

1

您可以使用 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 数组之间进行转换。

于 2021-06-09T10:28:41.507 回答
0

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

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))
于 2021-06-11T20:48:58.340 回答