菜单

音频处理

相关源文件

本页面详细介绍了 Whisper 中的音频处理流程,说明了音频文件如何转换为模型输入的梅尔频谱图。音频处理系统位于原始音频输入和 Whisper 模型编码器组件之间。有关模型架构本身的信息,请参阅 模型架构,有关处理后的音频如何解码为文本的详细信息,请参阅 解码系统

概述

Whisper 的音频处理流程将各种格式和采样率的音频转换为模型可以处理的标准表示。该系统执行多项关键操作,包括:

  1. 加载和重采样音频
  2. 填充或修剪到固定长度
  3. 计算梅尔频谱图
  4. 特征归一化

这些操作确保无论输入音频源如何,模型都能接收到具有预期维度和特征的一致输入。

来源: whisper/audio.py1-158

音频处理流程

图示:音频处理流程

来源: whisper/audio.py13-22 whisper/audio.py25-62 whisper/audio.py65-88 whisper/audio.py91-107 whisper/audio.py110-157

音频常量

Whisper 在整个处理流程中使用了固定的一组音频超参数。这些常量定义了音频处理和特征提取的特性。

常量描述
SAMPLE_RATE16000音频采样率(单位:Hz,16 kHz)
N_FFT400频谱图的 FFT 窗口大小
HOP_LENGTH160连续帧之间的采样数
CHUNK_LENGTH30最大音频块长度(单位:秒)
N_SAMPLES48000030 秒音频块中的采样数(16000 × 30)
N_FRAMES3000生成的梅尔频谱图中的帧数
FRAMES_PER_SECOND100每 10 毫秒一个音频帧(16000/160)
TOKENS_PER_SECOND50每 20 毫秒一个输出 token

这些常量定义了提供给模型的音频特征的维度和特性。特别是标准的 30 秒音频长度,这是模型一次可以处理的最大上下文。

来源: whisper/audio.py13-22

关键组件

音频加载

load_audio() 函数负责从文件加载音频并进行标准化。

图示:音频加载过程

该函数使用 ffmpeg 作为外部依赖来执行以下操作:

  • 从各种格式加载音频
  • 转换为单声道(单个通道)
  • 重采样到 16 kHz
  • 转换为 16 位 PCM 格式
  • 返回归一化的 float32 NumPy 数组

这种方法允许 Whisper 在不依赖其他 Python 库的情况下处理 ffmpeg 支持的几乎任何音频格式。

来源: whisper/audio.py25-62

音频填充与修剪

pad_or_trim() 函数确保音频输入的长度一致。

图示:音频填充与修剪过程

此函数

  • 修剪长度超过 30 秒的音频(取前 30 秒)
  • 用零填充较短的音频,使其达到精确的 30 秒
  • 支持 NumPy 数组和 PyTorch 张量
  • 当存在时,保持批处理维度

标准化长度可确保模型接收到具有一致维度的输入。

来源: whisper/audio.py65-88

梅尔频谱图计算

log_mel_spectrogram() 函数将波形转换为梅尔频谱图。

图示:梅尔频谱图计算过程

该函数执行以下操作:

  1. 根据需要将输入转换为 PyTorch 张量
  2. 应用带有 Hann 窗口的短时傅里叶变换
  3. 计算功率频谱图(幅度平方)
  4. 使用滤波器组投影到梅尔尺度
  5. 应用对数变换和归一化

输出是一个对数梅尔频谱图,维度为 (n_mels, n_frames),其中 n_mels 通常是 80 或 128。

来源: whisper/audio.py110-157

梅尔滤波器

mel_filters() 函数加载预计算的梅尔滤波器组矩阵。

图示:梅尔滤波器加载过程

关键方面:

  • 使用 @lru_cache 以实现高效的重复访问
  • 支持两种滤波器配置:80 和 128 个梅尔频段
  • 从资源文件中加载预计算的滤波器矩阵
  • 在指定的设备上返回 PyTorch 张量

预计算的滤波器消除了对 librosa 的依赖,并确保了跨环境的一致处理。

来源: whisper/audio.py91-107 whisper/assets/mel_filters.npz1-32

模型管线输入

图示:Whisper 管线中的音频处理

上图显示了音频处理流程如何连接到 Whisper 模型的编码器组件。梅尔频谱图是音频处理系统和模型编码器之间的接口。

来源: whisper/audio.py110-157

技术实现细节

音频波形加载

load_audio() 函数使用 ffmpeg 命令行工具来处理音频文件加载。

ffmpeg -nostdin -threads 0 -i <file> -f s16le -ac 1 -acodec pcm_s16le -ar <sample_rate> -

这种方法

  • 支持多种音频格式
  • 一步完成转换和重采样
  • 以字节流形式返回 16 位 PCM 数据
  • 将值归一化到 [-1.0, 1.0] 范围

该函数接受 ffmpeg 可以解码的任何文件格式,使其功能强大且通用。

来源: whisper/audio.py25-62

滤波器组设计

mel_filters.npz 中的预计算梅尔滤波器组包含两个矩阵:

过滤器尺寸目的
mel_80(80, 201)80 个梅尔频段,用于标准模型变体
mel_128(128, 201)128 个梅尔频段,用于大型模型变体

这些滤波器:

  • 从线性频率 bin(STFT 后)映射到梅尔频率 bin
  • 使用 librosa 的梅尔滤波器设计进行预计算
  • 以压缩 numpy 数组形式存储,以避免运行时依赖

80 个梅尔频段和 128 个梅尔频段的选择取决于所使用的模型变体。

来源: whisper/audio.py91-107 whisper/assets/mel_filters.npz1-32

性能考量

  • mel_filters() 上的 @lru_cache 装饰器确保滤波器组在每个配置下只加载一次。
  • 音频处理步骤支持 NumPy 数组和 PyTorch 张量,从而可以在适当的情况下启用 GPU 加速。
  • 标准化处理确保了训练和推理之间的一致性。
  • 预计算的滤波器组避免了对其他库的运行时依赖。

这些优化确保了高效的音频处理,同时在不同环境之间保持兼容性。

来源: whisper/audio.py91-107

与模型架构集成

音频处理流程的输出直接馈入 Whisper 模型的编码器组件。音频处理创建了一个标准化的表示,该表示:

  1. 无论输入音频长度如何,都具有一致的维度
  2. 包含与语音识别相关的频率信息
  3. 已归一化到模型的预期范围
  4. 与模型训练期间使用的特征匹配

有关这些特征如何被模型处理的更多详细信息,请参阅 模型架构

来源: whisper/audio.py110-157