2. 声学基础

说实话,很多做音频算法的同学,最后代码跑不起来,不是算法写错了,而是环境炸了。

我见过太多次了——换了台机器,pip install 一把梭,结果 libsndfile 没装、ffmpeg 路径不对、numpy 版本冲突……一上午就搭进去了。所以这一章,咱们先把地基打牢。

2.1 为什么必须用虚拟环境?

你想想看,一个项目用 librosa 0.9,另一个项目用 0.10。如果全装到系统 Python 里,早晚会出幺蛾子。

虚拟环境说白了就是给每个项目一个独立的 Python 小房间。你在里面随便装,不会影响到别的项目。

核心原则:每个音频项目,单独建一个虚拟环境。别偷懒。

2.2 虚拟环境管理工具对比

我个人习惯用 conda 管理音频环境。为什么?因为 librosa 依赖的 llvmlite、numba 这些底层库,用 pip 装有时候会踩坑,conda 的预编译二进制包省心很多。

工具 适用场景 优点 缺点
venv 纯 Python 项目 内置模块,轻量 不管理非 Python 依赖
conda 音频/数据科学项目 管理 C 库依赖,跨平台 环境体积较大
pipenv Web 项目 自动管理 Pipfile 音频库支持一般

我的建议:做声学特征提取,直接用 conda。省下的时间够你喝两杯咖啡。

2.3 核心音频库安装实战

好,咱们直接上手。以下是我在 Windows / macOS / Linux 上都验证过的安装流程。

2.3.1 创建并激活环境

# 创建 Python 3.9 环境(3.8-3.11 都行,别用 3.12 以上)
conda create -n audio_env python=3.9

# 激活
conda activate audio_env

嗯,这里要注意:Python 3.12 对某些音频库的 C 扩展支持还不完善。我上个月帮一个学员排查问题,就是 3.12 装 librosa 报错,降到 3.10 就好了。

2.3.2 安装 librosa

librosa 是声学特征提取的核心库。它依赖 numba 和 llvmlite,用 conda 装最稳。

conda install -c conda-forge librosa

为什么指定 conda-forge?因为官方频道里的 librosa 版本经常滞后。conda-forge 更新快,而且预编译好了所有底层依赖。

我曾经踩过的坑:直接用 pip install librosa,在 Windows 上遇到了 llvmlite 编译失败。后来换成 conda-forge,一分钟搞定。

2.3.3 安装 soundfile

soundfile 负责读写各种音频格式。它底层依赖 libsndfile 这个 C 库。

conda install -c conda-forge python-soundfile

如果你用 pip:

pip install soundfile

但 pip 版本不会自动装 libsndfile。在 Linux 上你得手动 apt install libsndfile1,在 macOS 上 brew install libsndfile。Windows 用户……嗯,还是用 conda 吧。

2.3.4 安装 pydub

pydub 擅长音频切片、格式转换。它需要 ffmpeg 作为后端。

pip install pydub

然后装 ffmpeg:

  • Windows:下载 ffmpeg 的 exe,加到 PATH 里
  • macOS:brew install ffmpeg
  • Linux:sudo apt install ffmpeg

验证 ffmpeg 是否装好:在终端输入 ffmpeg -version,能看到版本号就对了。

2.3.5 安装 scipy 和其他工具

conda install scipy
pip install matplotlib  # 画频谱图用
pip install jupyter     # 交互式调试

scipy 的 signal 模块提供了很多滤波器函数,后面做预加重、分帧时会用到。

2.4 验证安装

装完了别急着走。跑一下这个脚本,确认所有库都能正常导入:

import librosa
import soundfile as sf
import pydub
import scipy
import numpy as np
import matplotlib.pyplot as plt

print("librosa version:", librosa.__version__)
print("soundfile version:", sf.__version__)
print("scipy version:", scipy.__version__)

# 加载一个测试音频
y, sr = librosa.load(librosa.example('trumpet'), sr=22050)
print(f"音频长度: {len(y)} 采样点, 采样率: {sr} Hz")

# 写回文件
sf.write('test_output.wav', y, sr)
print("文件写入成功!")

如果没报错,恭喜你,环境搭好了。

2.5 常见问题与避坑指南

我整理了几个高频问题,你遇到了直接对照着查:

问题 原因 解决方案
OSError: sndfile library not found libsndfile 未安装 conda install -c conda-forge libsndfile
RuntimeError: numba needs llvmlite llvmlite 版本不匹配 conda install -c conda-forge llvmlite
pydub.exceptions.CouldntDecodeError ffmpeg 未安装或不在 PATH 安装 ffmpeg 并添加到系统环境变量
ImportError: DLL load failed Windows 下 C 运行时缺失 安装 Visual C++ Redistributable

我曾经遇到最离谱的问题:在 macOS 上用 pip 装 librosa,结果 numba 报错说 CPU 不支持某个指令集。后来发现是 conda 的 numba 版本做了 CPU 特性检测,换成 conda-forge 的版本就好了。

2.6 本章知识体系

下面这张图帮你理清整个环境搭建的逻辑:

音频处理环境搭建知识体系 音频处理环境搭建知识体系 Python 音频环境 虚拟环境管理 核心音频库 辅助工具链 conda venv librosa soundfile pydub scipy 环境隔离 / 版本管理 numba / llvmlite libsndfile / ffmpeg matplotlib / jupyter 验证:导入测试 + 读写文件 环境管理 核心库 辅助工具 底层依赖

2.7 小结

环境搭建这件事,看起来琐碎,但值得认真对待。我见过太多人花 80% 的时间在修环境,只有 20% 的时间在写算法。

记住三个要点:

  • 用 conda 管理环境,别嫌它体积大
  • 从 conda-forge 装音频库,省去编译烦恼
  • 装完立刻验证,别等到写代码才发现缺东西