许多帖子建议使用ffmpeg
并手动解析其stdout
来读取MP3,这是一项繁琐的任务(因为可能有不同数量的声道等许多特殊情况),因此这里提供了一个使用pydub
的可行解决方案(您需要先pip install pydub
)。
此代码允许读取MP3到numpy数组/将numpy数组写入MP3文件,具有类似于scipy.io.wavfile.read/write
的API:
import pydub
import numpy as np
def read(f, normalized=False):
"""MP3 to numpy array"""
a = pydub.AudioSegment.from_mp3(f)
y = np.array(a.get_array_of_samples())
if a.channels == 2:
y = y.reshape((-1, 2))
if normalized:
return a.frame_rate, np.float32(y) / 2**15
else:
return a.frame_rate, y
def write(f, sr, x, normalized=False):
"""numpy array to MP3"""
channels = 2 if (x.ndim == 2 and x.shape[1] == 2) else 1
if normalized:
y = np.int16(x * 2 ** 15)
else:
y = np.int16(x)
song = pydub.AudioSegment(y.tobytes(), frame_rate=sr, sample_width=2, channels=channels)
song.export(f, format="mp3", bitrate="320k")
注意:
- 目前仅适用于16位文件(即使24位WAV文件相当常见,我很少见到24位MP3文件... 这种存在吗?)
normalized=True
允许使用浮点数数组(每个项目在[-1,1))
使用示例:
sr, x = read('test.mp3')
print(x)
write('out2.mp3', sr, x)
以读取和
export(f, format="mp3", bitrate="320k", tags=tags)`以写入。 - francis