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是非常低效的注意:我发现这个问题及其解决方案在理论上可以调整,但这不在内存中。您可以使用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
数组?