本页面详细介绍了 Whisper 中的音频处理流程,说明了音频文件如何转换为模型输入的梅尔频谱图。音频处理系统位于原始音频输入和 Whisper 模型编码器组件之间。有关模型架构本身的信息,请参阅 模型架构,有关处理后的音频如何解码为文本的详细信息,请参阅 解码系统。
Whisper 的音频处理流程将各种格式和采样率的音频转换为模型可以处理的标准表示。该系统执行多项关键操作,包括:
这些操作确保无论输入音频源如何,模型都能接收到具有预期维度和特征的一致输入。
图示:音频处理流程
来源: whisper/audio.py13-22 whisper/audio.py25-62 whisper/audio.py65-88 whisper/audio.py91-107 whisper/audio.py110-157
Whisper 在整个处理流程中使用了固定的一组音频超参数。这些常量定义了音频处理和特征提取的特性。
| 常量 | 值 | 描述 |
|---|---|---|
SAMPLE_RATE | 16000 | 音频采样率(单位:Hz,16 kHz) |
N_FFT | 400 | 频谱图的 FFT 窗口大小 |
HOP_LENGTH | 160 | 连续帧之间的采样数 |
CHUNK_LENGTH | 30 | 最大音频块长度(单位:秒) |
N_SAMPLES | 480000 | 30 秒音频块中的采样数(16000 × 30) |
N_FRAMES | 3000 | 生成的梅尔频谱图中的帧数 |
FRAMES_PER_SECOND | 100 | 每 10 毫秒一个音频帧(16000/160) |
TOKENS_PER_SECOND | 50 | 每 20 毫秒一个输出 token |
这些常量定义了提供给模型的音频特征的维度和特性。特别是标准的 30 秒音频长度,这是模型一次可以处理的最大上下文。
load_audio() 函数负责从文件加载音频并进行标准化。
图示:音频加载过程
该函数使用 ffmpeg 作为外部依赖来执行以下操作:
这种方法允许 Whisper 在不依赖其他 Python 库的情况下处理 ffmpeg 支持的几乎任何音频格式。
pad_or_trim() 函数确保音频输入的长度一致。
图示:音频填充与修剪过程
此函数
标准化长度可确保模型接收到具有一致维度的输入。
log_mel_spectrogram() 函数将波形转换为梅尔频谱图。
图示:梅尔频谱图计算过程
该函数执行以下操作:
输出是一个对数梅尔频谱图,维度为 (n_mels, n_frames),其中 n_mels 通常是 80 或 128。
mel_filters() 函数加载预计算的梅尔滤波器组矩阵。
图示:梅尔滤波器加载过程
关键方面:
@lru_cache 以实现高效的重复访问预计算的滤波器消除了对 librosa 的依赖,并确保了跨环境的一致处理。
来源: whisper/audio.py91-107 whisper/assets/mel_filters.npz1-32
图示:Whisper 管线中的音频处理
上图显示了音频处理流程如何连接到 Whisper 模型的编码器组件。梅尔频谱图是音频处理系统和模型编码器之间的接口。
load_audio() 函数使用 ffmpeg 命令行工具来处理音频文件加载。
ffmpeg -nostdin -threads 0 -i <file> -f s16le -ac 1 -acodec pcm_s16le -ar <sample_rate> -
这种方法
该函数接受 ffmpeg 可以解码的任何文件格式,使其功能强大且通用。
mel_filters.npz 中的预计算梅尔滤波器组包含两个矩阵:
| 过滤器 | 尺寸 | 目的 |
|---|---|---|
mel_80 | (80, 201) | 80 个梅尔频段,用于标准模型变体 |
mel_128 | (128, 201) | 128 个梅尔频段,用于大型模型变体 |
这些滤波器:
80 个梅尔频段和 128 个梅尔频段的选择取决于所使用的模型变体。
来源: whisper/audio.py91-107 whisper/assets/mel_filters.npz1-32
mel_filters() 上的 @lru_cache 装饰器确保滤波器组在每个配置下只加载一次。这些优化确保了高效的音频处理,同时在不同环境之间保持兼容性。
音频处理流程的输出直接馈入 Whisper 模型的编码器组件。音频处理创建了一个标准化的表示,该表示:
有关这些特征如何被模型处理的更多详细信息,请参阅 模型架构。