在遇到大批量的音频格式转化问题时,网络上的免费转换服务有数量和网速的限制。Python 中的 pydub库依赖于 ffmpeg 工具可以方便地在不同格式之间转换,且方便批量操作。
安装
安装 pydub 库:
pip install pydub
如果 Python 版本不低于 3.13,还需要安装 audioop-lts 库,否则在导入 pydub 库会遇到 ModuleNotFoundError: No module named 'pyaudioop'。 这是因为从 3.13 版本开始,audioop 库从 stdlib 中被移除,参考 Fix pyaudioop fallback so pydub imports on Python 3.13。
加载音频
pydub 库提供了一个不可变对象 AudioSegment 可以加载音频文件:
from pydub import AudioSegmentsong = AudioSegment.from_wav("input.wav")
pydub 支持所有 ffmpeg 支持的格式,常见的有:
wav 格式: wav_version = AudioSegment.from_wav("input.wav");mp3 格式: mp3_version = AudioSegment.from_mp3("input.mp3");ogg 格式: ogg_version = AudioSegment.from_ogg("input.ogg");flv 格式: flv_version = AudioSegment.from_flv("input.flv");mp4 格式: mp4_version = AudioSegment.from_file("input.mp4", format="mp4");wma 格式: wma_version = AudioSegment.from_file("input.wma", format="wma");aac 格式: aac_version = AudioSegment.from_file("input.aac", format="aac")。
保存音频
保存音频同样依靠 ffmpeg 的支持,采用 AudioSegment 对象的 export 方法,保存为指定的格式:
song.export("output.mp3", format="mp3")
结合 os 系统库,保存原有的文件名不变,可以导出不同的格式,实现音频格式转换:
import osfrom pydub import AudioSegmentwav_filename = "example.wav"wav_version = AudioSegment.from_wav(wav_filename)mp3_filename = os.path.splitext(os.path.basename(wav_filename))[0] + ".mp3"mp3_version = wav_version.export(mp3_filename, format="mp3")
再结合 glob 库批量获取源文件,从而可以批量转换音频格式:
import globimport osfrom pydub import AudioSegmentoutput_dir = "mp3"os.makedirs(output_dir, exist_ok=True)for filename in glob.glob("oggs/*.ogg"): basename = os.path.splitext(os.path.basename(filename))[0] audio = AudioSegment.from_ogg(filename) output_file = f"{output_dir}/{basename}.mp3" audio.export(output_file, format="mp3") print(f"Converted {filename} to {output_file}.")
元数据
对于音频文件,一般会有 title、artist 和 album 等元数据,这些元数据在导出保存的时候可以 通过 tags 字典参数传入,例如
from pydub import AudioSegmenttags = {"title": "audio","artist": "artist","album": "album"}AudioSegment.from_mav("input.mav").export("output.mp3", format="mp3", tags=tags)
如果想要获取原音频文件中的信息,可以使用 mutagen 库,利用获取 ogg 格式文件的 title、artist 和 album 信息:
from mutagen.oggvorbis import OggVorbisaudio = OggVorbis("input.ogg")artist = audio.get("artist", ["未知艺术家"])[0]title = audio.get("title", ["未知标题"])[0]album = audio.get("album", ["未知专辑"])[0]
因此,将这些数据组成 tags 字典传入 export 方法,就可以将原音频的元数据也保存到新音频中。
以上便是可以在不同音频格式下批量转换的方法,但音频过多时速度比较慢,可以考虑利用多线程加速。