You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Librosa处理MP3音频:立体声保存及MP3读写问题求助

解决方案

一、用soundfile写入立体声WAV文件

你的代码保存单声道的核心原因是librosa.load默认会将立体声转为单声道(默认参数mono=True),只需修改加载逻辑就能保留立体声,步骤如下:

  1. 加载音频时设置mono=False,此时返回的audio是形状为(声道数, 采样点数)的二维数组
  2. librosa.effects.trim支持多声道输入,返回的裁剪后音频依然是二维数组
  3. 直接用soundfile写入二维数组即可保存立体声

修改后的代码:

import audioread, librosa
import soundfile as sf

filename="../sounds/music.mp3"

audio_file = audioread.audio_open(filename)
# 关键:设置mono=False保留立体声
audio, sr = librosa.load(audio_file, sr=44100, mono=False)
# 多声道下trim依然有效,返回裁剪后的音频和起止索引
clip_audio, _ = librosa.effects.trim(audio, top_db=10)
# 直接写入二维数组,soundfile自动识别为立体声
sf.write('../sounds/output/out.wav', clip_audio, sr, 'PCM_24')

注:soundfile本身不支持直接写入MP3格式,需配合其他库实现(见下文)。

二、支持MP3读写且兼容Librosa的库推荐

1. Pydub

  • 支持直接读写MP3、WAV等多种格式,依赖FFmpeg(需提前安装并配置环境变量)
  • 可与Librosa无缝配合:将Pydub加载的音频转为NumPy数组交给Librosa处理,处理后再转回Pydub对象保存为MP3

示例代码:

from pydub import AudioSegment
import librosa
import numpy as np

# 加载MP3
audio = AudioSegment.from_mp3("../sounds/music.mp3")
# 转为Librosa可用的NumPy数组(形状:(声道数, 采样点数))
samples = np.array(audio.get_array_of_samples()).reshape(-1, audio.channels).T
sr = audio.frame_rate

# Librosa处理:静音裁剪+音量归一化
trimmed_audio, _ = librosa.effects.trim(samples, top_db=10)
normalized_audio = librosa.util.normalize(trimmed_audio)

# 转回Pydub对象并保存为MP3
normalized_samples = (normalized_audio.T * 32767).astype(np.int16).flatten()
output_audio = AudioSegment(
    normalized_samples.tobytes(),
    frame_rate=sr,
    sample_width=audio.sample_width,
    channels=audio.channels
)
output_audio.export("../sounds/output/out.mp3", format="mp3")

2. FFmpeg-Python

  • 直接调用FFmpeg功能,支持几乎所有音频格式的读写与处理
  • 可先通过FFmpeg读取MP3为原始音频数据,交给Librosa处理后,再用FFmpeg写入MP3

3. Torchaudio

  • 基于PyTorch的音频库,支持MP3读写(依赖FFmpeg)
  • 可将音频转为张量后转为NumPy数组交给Librosa处理,处理完成后转回张量保存

内容的提问来源于stack exchange,提问作者ussrback

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 07:45:30