这是我关于音频深度学习系列的第三篇文章。到目前为止,我们已经了解了声音是如何被数字化表示的,也知道深度学习模型通常使用声音的“声谱图(Spectrogram)”作为输入特征。我们还学习了如何在 Python 中预处理音频数据以生成 梅尔声谱图(Mel Spectrogram)。
本篇文章将更进一步,通过调整超参数(Hyper-parameters)来增强梅尔声谱图的表现力,并介绍音频数据的“数据增强(Data Augmentation)”方法。这两者都是数据准备的关键步骤,有助于提升音频深度学习模型的性能。
下面是整个系列计划的快速概览。我的目标不仅是理解“它如何工作”,更重要的是理解“为什么这样工作”。
- 1.前沿技术(本文)(什么是声音?声音是如何被数字化的?音频深度学习解决了我们日常生活中的哪些问题?什么是声谱图以及它为什么这么重要?)
- 2.为什么梅尔声谱图性能更佳(在 Python 中处理音频数据、什么是梅尔声谱图以及如何生成梅尔声谱图?)
- 3.功能优化和增强(通过超参数调整和数据增强来增强声谱图的功能,从而获得最佳性能)
- 4.音频分类(对普通声音进行分类的端到端的示例和架构、适用于多种场景的基础应用)
- 5.自动语音识别(语音转文本算法和架构、使用 CTC Loss 和解码来对齐序列)
- 6.集束搜索(语音转文本和 NLP 应用中常用的用来增强预测的算法)
通过超参数优化声谱图
在第二篇中,我们已经了解了梅尔声谱图是什么,以及如何使用 Python 库函数生成它。但如果希望深度学习模型性能达到最佳,就需要针对具体任务来优化声谱图的生成参数。
这涉及多个可调超参数。要理解这些参数的意义,我们需要先了解声谱图是如何构建的。(我会尽量保持简单直观!)
(1) 快速傅里叶变换(FFT)
计算傅里叶变换的一种方法是使用一种称为离散傅里叶变换 (DFT) 的技术,但DFT计算成本非常高。因此在实际应用中,我们通常使用 “快速傅里叶变换算法(FFT)”,这是 DFT 的高效实现。
不过,FFT 只会给出整个音频信号的总体频率成分,无法展示这些频率在音频信号中是如何随时间变化的。例如,你无法看到音频的前半段包含较多高频,而后半段包含更多低频的信息。
(2)短时傅里叶变换(STFT)
为了获得更精细的视图以及查看随时间变化的频率信息,我们使用 STFT算法(短时傅里叶变换)。STFT 是傅里叶变换的另一种变体,它使用滑动窗口将音频信号分解成多个短时间片段,并对每个片段分别执行 FFT,然后再将它们组合起来。这样我们就能捕捉到频率随时间变化的趋势。

STFT 沿着信号滑动一个重叠窗口,并对每个段进行傅里叶变换
换句话说,STFT 通过一个重叠的滑动窗口沿信号移动,对每个片段进行傅里叶变换。 这就能让我们在时间轴上看到信号的局部频率特征变化。这不仅沿着时间轴将信号划分为多个片段,同时还沿着频率轴将信号划分为多个频带。算法会把整个频率范围(在梅尔尺度上)划分为若干等间距的频带,然后计算每个时间片段中每个频带的幅值。
让我们用一个例子来解释一下,假设我们有一段 1 分钟的音频,频率范围是 0–10000 Hz。假设现在使用梅尔声谱图算法:
- 将音频分为 20 个时间片段;
- 将频率范围分成 10 个频带(0–1000Hz、1000–2000Hz…9000–10000Hz)。
该算法的最终输出是一个形状为 (10, 20) 的 2D Numpy 数组,其中:
- 每一列代表一个时间片段的 FFT 结果;
- 每一行代表一个频带的幅值。
我们来看第一列,它是第一个时间段的FFT。它有10行。
- 第一行是 0–1000 Hz 之间第一个频带的振幅。
- 第二行是 1000–2000 Hz 之间的第二个频带的振幅。
- …
也就是说,这个二维数组的每一列都成为我们梅尔声谱图中的一个“竖条”。
梅尔声谱图的主要超参数(以 Librosa 为例)
这就是生成梅尔声谱图时可调节的超参数集合。下面列出 Librosa(常用音频处理库)中使用的参数名称(其他库有等价参数)
频率轴相关参数
- fmin:最低频率
- fmax:最高频率
- n_mels:梅尔频带数量(决定声谱图高度)
时间轴相关参数
- n_fft:每个时间片段窗口的长度
- hop_length:窗口滑动的步长(以采样点为单位),影响声谱图的宽度
- 声谱图的宽度约为:总样本数 ÷ hop_length
调整这些超参数时,应结合音频类型与具体任务(如音乐分析 vs 语音识别)来决定。
MFCC(适用于语音任务)
对于大多数音频任务,梅尔声谱图已足够出色。但在处理人类语音任务(如语音识别)时,MFCC(梅尔频率倒谱系数,Mel Frequency Cepstral Coefficients) 往往表现更佳。
MFCC 是在梅尔声谱图的基础上,进一步提取和压缩频率特征的结果,重点保留了人类语音最常见的频率区间特征。
例如:某音频的梅尔声谱图维度为 (128, 134),而相应的 MFCC 维度为 (20, 134)。后者仅保留了更小但更具代表性的特征集合,更有效地捕捉了声音的核心特征。

从音频生成的 MFCC(作者提供的图片)
数据增强(Data Augmentation)
当训练数据不足时,可以通过人工扩充样本来提升模型泛化能力。我们通过对现有样本进行轻微的修改来实现这一点。这一思想在图像领域很常见,以图像为例,我们可以旋转、裁剪、缩放、调整颜色或光照、加入噪声等。由于这些变化不会改变图像的语义,因此原始样本的标签仍然适用于增强样本。例如,一张标注为“猫”的图片,即使经过这些变换,仍然是一只“猫”。从模型的角度来看,这些修改后的图像就像新的样本一样,有助于模型更好地泛化。
音频数据同样可以用类似思路增强。音频增强既可以在原始音频上进行,也可以在生成声谱图之后进行。
实践经验表明,对声谱图进行增强通常效果更好。
(1)声谱图增强(SpecAugment)
图像增强的常规操作(如翻转、旋转)并不适用于声谱图,因为这会严重改变音频语义。
我们通常使用 SpecAugment 技术,即在声谱图上“遮挡”部分区域来实现增强,主要有两种方式:
- 频率遮挡(Frequency Mask):随机屏蔽一段连续频率区间,在图上表现为水平条纹。
- 时间遮挡(Time Mask):随机屏蔽一段连续时间区间,在图上表现为垂直条纹。
这种增强方式可以让模型在部分特征缺失的情况下仍然保持稳定性能。

(图片由作者提供)
(2)原始音频增强
在原始音频层面,也有多种增强方法可选:
时间平移(Time Shift):将音频整体向左或右平移一定样本长度。
对于如海浪、交通声这类没有固定时间顺序的声音,可以采用“循环包裹”的方式;

时间偏移增强(作者提供的图片)
对于人类语音这类有时序意义的声音,则可以用静音填充空白部分。
音高变换(Pitch Shift):随机调整音频的频率,使其音高上移或下移。

通过音调变化进行增强(图片来自作者)
时间伸缩(Time Stretch):随机放慢或加快音频播放速度。

通过时间拉伸进行增强(图片由作者提供)
加噪声(Add Noise):在音频中加入随机噪声,提高模型的抗干扰性。

通过添加噪声进行增强(作者提供的图片)
这些增强方法让模型“听到”更多变化,从而在面对新样本时表现更稳健。
结论
我们现在已经了解了如何对音频数据进行预处理和准备,以输入到深度学习模型中。这些方法是大多数音频应用的通用步骤。
在下一篇文章中,我们将动手构建一个完整的音频分类(Sound Classification)模型,并看看这些技术如何在实践中发挥作用。
原文作者 Ketan Doshi