2. 声学基础

做音频算法,第一步不是写代码,而是搭环境。这事儿看着简单,但我在项目里见过太多人因为库版本冲突、读写格式不对、采样率不一致,白白浪费一整天。今天咱们就把这几个主流库——librosa、soundfile、pydub、scipy.io.wavfile——掰开揉碎讲清楚。

2.1 环境准备:先装好Python和pip

嗯,这步其实没什么好说的。Python 3.8以上版本都行,我建议直接用3.10或3.11,兼容性最好。装好之后,确认一下pip版本:

python --version
pip --version

如果你用的是Anaconda,那更省事,很多科学计算库已经预装了。不过我个人习惯用原生Python + venv,轻量,好管理。

小技巧: 建议为每个项目创建独立的虚拟环境,避免库之间的依赖冲突。我吃过这个亏——有一次升级librosa,结果把soundfile的底层依赖搞崩了,排查了俩小时。

2.2 四大库的安装与核心定位

咱们一个一个来。先看安装命令,再看它们各自擅长什么。

库名 安装命令 核心定位
librosa pip install librosa 音频分析与特征提取的瑞士军刀
soundfile pip install soundfile 高性能读写WAV/FLAC/OGG
pydub pip install pydub 音频编辑与格式转换的便捷工具
scipy.io.wavfile pip install scipy 轻量级WAV读写,无需额外依赖

你可能会问:为什么需要四个库?一个不够用吗?

说实话,每个库都有自己的脾气。librosa功能最全,但依赖重、加载慢;soundfile读写快,但功能单一;pydub做音频拼接、格式转换特别顺手;scipy.io.wavfile最轻量,适合快速验证。我在实际项目中,通常是混合使用——用librosa做特征提取,用soundfile做底层IO,用pydub做预处理。

2.3 各库的详细对比

2.3.1 librosa:音频特征提取的王者

librosa是我用得最多的库。它内置了MFCC、梅尔频谱、色度特征、节奏特征等几十种声学特征提取函数。安装时它会自动拉取numba、scikit-learn等依赖,所以第一次安装会慢一些。

import librosa

# 加载音频,自动重采样到22050Hz
y, sr = librosa.load('speech.wav', sr=22050)

# 提取MFCC特征
mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
print(mfcc.shape)  # (13, 帧数)
注意: librosa的load函数默认会做两件事:一是将音频转为单声道,二是重采样到22050Hz。如果你需要保留原始采样率或多声道信息,记得设置sr=None和mono=False。我曾经因为这个默认行为,在做一个立体声定位项目时,数据全变成了单声道,白跑了一轮实验。

2.3.2 soundfile:高性能IO,格式支持广

soundfile底层基于libsndfile,读写速度非常快。它支持WAV、FLAC、OGG等格式,而且能直接返回numpy数组。我一般用它来做数据加载的底层引擎。

import soundfile as sf

# 读取音频,返回数据和采样率
data, sr = sf.read('speech.wav')

# 写入音频
sf.write('output.wav', data, sr)

它比librosa的load函数快不少,尤其是在批量处理大量音频文件时。如果你只需要读写,不涉及特征提取,soundfile是首选。

2.3.3 pydub:音频编辑的瑞士军刀

pydub的API设计非常人性化,适合做音频剪辑、拼接、音量调整、格式转换。它依赖ffmpeg来处理非WAV格式,所以需要额外安装ffmpeg。

from pydub import AudioSegment

# 加载音频
audio = AudioSegment.from_file('speech.mp3')

# 截取前10秒
segment = audio[:10000]  # 单位是毫秒

# 调整音量 +3dB
louder = segment + 3

# 导出为WAV
louder.export('segment.wav', format='wav')
避坑指南: 我曾经用pydub做批量格式转换,结果发现它默认的采样率是44100Hz,而我的模型需要16000Hz。后来在export时加了parameters=["-ar", "16000"]才解决。记住:pydub不会自动重采样,你得手动指定。

2.3.4 scipy.io.wavfile:轻量级选择

这个库是SciPy的一部分,不需要额外安装。它只支持WAV格式,但胜在轻量、无依赖。适合在嵌入式环境或快速原型中使用。

from scipy.io import wavfile

# 读取WAV
sr, data = wavfile.read('speech.wav')

# 写入WAV
wavfile.write('output.wav', sr, data)

注意:它读取的数据类型是int16(16位PCM),而librosa和soundfile默认返回float32。这个差异容易踩坑,我见过有人直接把int16数据送进模型,结果梯度爆炸了。

2.4 选型对比:什么时候用哪个?

下面这张表是我在实际项目中的经验总结,你直接拿去用就行。

场景 推荐库 理由
特征提取(MFCC、梅尔谱) librosa 内置函数最全,一行代码搞定
批量读写WAV/FLAC soundfile 速度快,格式支持好
音频剪辑、拼接、格式转换 pydub API直观,适合预处理流水线
快速验证、嵌入式环境 scipy.io.wavfile 零依赖,代码最简
需要同时做IO和特征提取 soundfile + librosa soundfile读,librosa算,各取所长

2.5 知识体系总览

下面这张SVG图帮你理清这四个库的关系和适用场景。你可以把它当作选型时的快速参考。

Python音频处理库选型框架 音频文件 librosa soundfile pydub scipy.io.wavfile 特征提取 MFCC/梅尔谱/色度 高性能IO WAV/FLAC/OGG 音频编辑 剪辑/拼接/格式转换 轻量读写 仅WAV/零依赖 声学特征分析 数据加载流水线 预处理/增强 快速原型验证 选型原则:按场景选库,不盲目追求功能全 实际项目中常混合使用2~3个库

2.6 安装常见问题与避坑

最后,我把自己踩过的坑和学员常问的问题整理一下。

  • librosa安装失败: 多半是numba版本冲突。试试 pip install numba==0.56.4 再装librosa。
  • soundfile报错"libsndfile not found": Windows下需要安装libsndfile二进制文件,或者用conda安装:conda install -c conda-forge libsndfile。
  • pydub无法读取MP3: 没装ffmpeg。去ffmpeg官网下载,或者用 conda install -c conda-forge ffmpeg。
  • scipy.io.wavfile读取的音频是int16: 记得归一化到float32:data = data.astype(np.float32) / 32768.0。

核心建议: 新手入门,我建议先装librosa和soundfile这两个。librosa做特征提取,soundfile做数据IO,基本覆盖了90%的声学特征提取场景。等遇到音频编辑需求时,再补上pydub。别一口气装一堆,容易出依赖问题。