2. 声学基础

说实话,音频算法工程化这件事,环境搭不好,后面全是坑。我见过太多同学代码写好了,一跑就报错,最后发现是库版本冲突或者GPU没配上。这一章,咱们就把环境彻底搞定。

你想想看,音频处理依赖的库其实不多,但每个都有自己脾气。librosa依赖soundfile,soundfile又依赖系统音频编解码器。pydub更绝,它只是个壳,底层调的是ffmpeg。嗯,咱们一步步来。

2.1 虚拟环境管理:别让项目互相打架

我个人习惯,每个项目都建独立的虚拟环境。为什么?因为不同项目依赖的库版本可能冲突。比如项目A用librosa 0.9,项目B用librosa 0.10,装在一起就炸了。

Python虚拟环境工具有几个:venv、conda、virtualenv。我推荐conda,尤其做音频处理时,conda能直接装非Python的依赖(比如ffmpeg、libsndfile)。

我的推荐方案

  • 用conda创建环境:conda create -n audio_env python=3.9
  • 激活环境:conda activate audio_env
  • 退出环境:conda deactivate

小技巧:环境名别起太随意。我习惯用项目名+Python版本,比如audio_feat_py39。这样一看就知道是干什么的。

2.2 核心音频库安装与配置

音频处理四大金刚:librosa、soundfile、pydub、scipy.io.wavfile。它们各有侧重,咱们一个一个装。

2.2.1 librosa:音频特征提取的瑞士军刀

librosa是音频特征提取最常用的库。它封装了MFCC、频谱、色谱图等几十种特征。安装很简单:

pip install librosa

但要注意,librosa 0.9以上版本默认用soundfile做后端,不再依赖audioread。如果你用旧版本,可能需要额外装audioread。

我曾经踩过的坑:librosa 0.8.1在Windows上读取mp3会报错,因为底层依赖的ffmpeg没装。后来我升级到0.10.0,改用soundfile后端,问题解决。所以建议直接装最新版。

2.2.2 soundfile:读写音频文件的主力

soundfile是librosa的底层依赖,也支持直接读写wav、flac、ogg等格式。安装:

pip install soundfile

在Linux上,soundfile依赖libsndfile系统库。如果安装失败,先装系统库:

sudo apt-get install libsndfile1  # Ubuntu/Debian
brew install libsndfile           # macOS

2.2.3 pydub:音频剪辑的利器

pydub适合做音频剪辑、拼接、格式转换。但它只是个Python壳,底层调ffmpeg。安装:

pip install pydub

然后必须装ffmpeg。我建议用conda装,省心:

conda install -c conda-forge ffmpeg

验证ffmpeg是否装好:在终端输入ffmpeg -version,能看到版本信息就对了。如果报错,说明ffmpeg没加到PATH里。

2.2.4 scipy.io.wavfile:轻量级wav读写

scipy.io.wavfile是scipy自带的wav读写模块,不需要额外安装。但注意它只支持wav格式,不支持mp3、flac。而且它读出来的数据是int类型,需要手动转float。

from scipy.io import wavfile
sr, data = wavfile.read('audio.wav')
# data是int16,需要转float32
data_float = data.astype('float32') / 32768.0

2.3 库功能对比:选哪个?

这四个库各有适用场景。我整理了一张表,方便你对比:

库名 主要功能 支持格式 依赖 推荐场景
librosa 特征提取、频谱分析 wav, flac, ogg soundfile, numpy, scipy MFCC、频谱、色谱图
soundfile 音频读写 wav, flac, ogg, aiff libsndfile 高性能读写、librosa后端
pydub 音频剪辑、格式转换 mp3, wav, flac, ogg等 ffmpeg 音频预处理、批量转换
scipy.io.wavfile wav读写 wav scipy 轻量级、无额外依赖

说白了,做特征提取用librosa,做音频读写用soundfile,做剪辑用pydub,简单wav读写用scipy。我一般四个都装,各取所长。

2.4 GPU加速环境配置:CUDA + cuDNN

音频算法里,深度学习模型越来越常见。比如用CNN做声学事件检测,用Transformer做语音增强。这些模型在GPU上跑能快10倍以上。

GPU加速需要三件套:NVIDIA驱动、CUDA Toolkit、cuDNN。注意版本必须匹配。

2.4.1 检查NVIDIA驱动

先确认你有NVIDIA显卡。在终端输入:

nvidia-smi

如果能显示GPU信息,说明驱动已装。注意看右上角的CUDA Version,比如显示CUDA Version: 11.8,说明驱动支持CUDA 11.8。

我曾经犯过的错:装CUDA 12.0,但驱动只支持到11.8,结果torch一直报错找不到CUDA。后来我查了nvidia-smi里的CUDA Version,装了匹配的版本,问题解决。所以一定要先看驱动支持的CUDA版本。

2.4.2 安装CUDA Toolkit

去NVIDIA官网下载CUDA Toolkit。我建议用runfile安装,不要用deb包,因为runfile可以自定义安装路径,方便多版本共存。

安装命令示例(以CUDA 11.8为例):

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run

安装时注意:不要装驱动(因为驱动已装),只选CUDA Toolkit和CUDA Samples。

2.4.3 安装cuDNN

cuDNN是深度神经网络的加速库。需要注册NVIDIA开发者账号才能下载。下载后解压,把文件复制到CUDA目录:

tar -xzvf cudnn-linux-x86_64-8.9.0.131_cuda11-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

2.4.4 配置环境变量

把CUDA加到PATH和LD_LIBRARY_PATH里。编辑~/.bashrc:

export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

然后source ~/.bashrc生效。

2.4.5 验证GPU环境

用PyTorch验证:

import torch
print(torch.cuda.is_available())  # 应该输出True
print(torch.cuda.get_device_name(0))  # 显示GPU型号

小提示:如果torch.cuda.is_available()返回False,先检查CUDA版本是否匹配,再检查cuDNN是否装对。我遇到过cuDNN版本不对,torch能检测到CUDA但跑模型报错的情况。

2.5 知识体系总览

下面这张图把本章的知识结构串起来了。你可以看到,从虚拟环境到音频库,再到GPU加速,是一条完整的链路。

音频处理环境搭建知识体系 音频处理环境搭建知识体系 虚拟环境管理 核心音频处理库 librosa(特征提取) soundfile(读写) pydub(剪辑转换) scipy.io.wavfile(轻量) GPU加速环境(CUDA + cuDNN) NVIDIA驱动检查 CUDA Toolkit安装 cuDNN配置

2.6 常见问题与避坑指南

环境搭建过程中,我遇到过不少问题。挑几个典型的说说:

  • librosa读取mp3报错:升级到0.10.0以上,或者用pydub先转wav再读。
  • soundfile安装失败:Linux上先装libsndfile1,macOS上brew install libsndfile。
  • pydub找不到ffmpeg:用conda装ffmpeg,或者手动指定路径:pydub.AudioSegment.ffmpeg = "/usr/local/bin/ffmpeg"。
  • CUDA版本不匹配:先看nvidia-smi里的CUDA Version,再装对应版本的CUDA Toolkit和cuDNN。
  • torch.cuda.is_available()返回False:检查PyTorch版本是否支持你的CUDA版本。比如CUDA 11.8对应torch 1.13以上。

一句话总结:环境搭建的核心是版本匹配。虚拟环境隔离项目依赖,音频库各司其职,GPU加速需要驱动-CUDA-cuDNN-PyTorch四者版本对齐。按这个顺序装,基本不会出大问题。