我有一个来自some.npy
文件的numpy数组,该数组包含以.wav
格式编码的音频文件的数据
some.npy
是用sig = librosa.load(some_wav_file, sr=22050)
和np.save('some.npy', sig)
创建的
我想转换这个numpy数组,就好像它的内容是用.mp3
编码的一样。
不幸的是,由于两个原因,我被限制使用内存中的文件对象
- 我有很多
.npy
文件。它们是预先缓存的,如果有那么多"缓存";真实的";实际运行应用程序时的I/O - 在服务器上执行应用程序的人员的访问权限存在冲突
首先,我正在寻找一种直接转换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))