我们听到的声音,从语音到音乐,都以连续的气压波形式存在。然而,计算机处理的是离散的数字数据。为了弥合这一差异,我们必须将表示为时间函数 $x(t)$ 的连续模拟音频信号,转换为离散的数字序列 $x[n]$。这一转换过程是所有数字音频处理的基础,主要包含两个步骤:采样和量化。采样:在时间中获取信号第一步是采样,它涉及到在固定且规律的时间间隔内测量模拟音频波的幅度。可以把它想象成在一段时间内对波的高度进行一系列的“快照”。这些“快照”的获取速率称为采样率或采样频率,单位是赫兹 (Hz)。语音识别中常用的采样率是 16,000 Hz(或 16 kHz),这意味着我们每秒音频会获取 16,000 个数值,即样本。对于CD音质的音乐,使用更高的 44,100 Hz (44.1 kHz) 速率。为什么是这些特定的数字?采样率的选择由奈奎斯特-香农采样定理决定。该定理指出,要准确还原信号,采样率必须至少是信号中最高频率成分的两倍。这个最小速率被称为奈奎斯特速率。由于人类语音中最主要的频率低于 8 kHz,因此 16 kHz 的采样率足以获取所需信息,而不会造成明显损失。采样率低于奈奎斯特速率会导致一种称为混叠的效应,即高频被错误地表示为低频,从而使信号失真。{"data":[{"x":[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2],"y":[0,0.58,0.95,0.95,0.58,0,-0.58,-0.95,-0.95,-0.58,0,0.58,0.95,0.95,0.58,0,-0.58,-0.95,-0.95,-0.58,0],"mode":"lines","name":"模拟信号","line":{"color":"#a5d8ff","width":2}},{"x":[0,0.2,0.4,0.6,0.8,1,1.2,1.4,1.6,1.8,2],"y":[0,0.95,0.58,-0.58,-0.95,0,0.95,0.58,-0.58,-0.95,0],"mode":"markers","name":"样本","marker":{"color":"#228be6","size":8}}],"layout":{"title":{"text":"模拟信号采样"},"xaxis":{"title":"时间 (毫秒)","showgrid":false},"yaxis":{"title":"幅度"},"legend":{"x":1,"y":1,"xanchor":"right"}}}连续的蓝线表示原始模拟声波。深蓝色点表示在规则时间间隔内获取的离散样本。采样后,我们不再拥有连续函数 $x(t)$。取而代之的是,我们在离散时间步长上获得了一系列幅度值。然而,这些幅度值仍然是实数,可以在其范围内取任意值。量化:幅度离散化下一步是量化。这个过程将每个样本的连续幅度值映射到一组有限的离散级别。可用级别的数量由音频的位深决定。位深指定了用于表示每个样本幅度的比特数。更高的位深允许更多的量化级别,从而更准确地表示原始幅度,并降低量化误差或噪声。例如:8 位音频:每个样本使用 8 比特,提供 $2^8 = 256$ 个离散级别。16 位音频:每个样本使用 16 比特,提供 $2^{16} = 65,536$ 个离散级别。这是大多数 ASR 应用和 CD 音质音频的标准。可以把量化想象成在采样幅度上放置一个网格,并将每个样本的值“对齐”到最近的网格线。更精细的网格(更高的位深)意味着对齐后的值更接近原始值,保留了更多细节。{"data":[{"x":[0,1,2,3,4,5,6,7,8,9,10],"y":[0.05,0.95,0.6, -0.55,-0.93,0.02,0.9,0.55, -0.6,-0.9,0.04],"mode":"markers","name":"原始样本","marker":{"color":"#228be6","size":10,"symbol":"circle"}},{"x":[0,1,2,3,4,5,6,7,8,9,10],"y":[0,1,0.5,-0.5,-1,0,1,0.5,-0.5,-1,0],"mode":"markers","name":"量化样本","marker":{"color":"#fa5252","size":10,"symbol":"x"}}],"layout":{"shapes":[{"type":"line","x0":-0.5,"y0":1,"x1":10.5,"y1":1,"line":{"color":"#ced4da","width":1,"dash":"dash"}},{"type":"line","x0":-0.5,"y0":0.5,"x1":10.5,"y1":0.5,"line":{"color":"#ced4da","width":1,"dash":"dash"}},{"type":"line","x0":-0.5,"y0":0,"x1":10.5,"y1":0,"line":{"color":"#ced4da","width":1,"dash":"dash"}},{"type":"line","x0":-0.5,"y0":-0.5,"x1":10.5,"y1":-0.5,"line":{"color":"#ced4da","width":1,"dash":"dash"}},{"type":"line","x0":-0.5,"y0":-1,"x1":10.5,"y1":-1,"line":{"color":"#ced4da","width":1,"dash":"dash"}}],"title":{"text":"样本幅度量化"},"xaxis":{"title":"样本编号","showgrid":false},"yaxis":{"title":"幅度","tickvals":[-1,-0.5,0,0.5,1],"range":[-1.1,1.1]},"legend":{"x":1,"y":1,"xanchor":"right"}}}原始样本幅度(蓝色圆圈)被映射到最近的可用离散级别(虚线),从而得到量化值(红色叉号)。采样和量化完成后,我们的音频信号就完全数字化了。它现在是一个整数序列,这是计算机可以存储和处理的格式。编码:存储数字数据采样和量化后得到的原始数字序列称为脉冲编码调制 (PCM) 数据。这是音频信号最直接的数字表示形式。为了存储这些数据,我们使用一种音频文件格式,通常称为容器。最常见的未压缩格式是 WAV (.wav)。WAV 文件通常包含一个带有元数据(采样率、位深、通道数)的头部,后面跟着原始 PCM 数据。对于 ASR,使用未压缩的 WAV 文件或无损压缩文件(如 FLAC)是更优选择,因为这保证了不会丢失信息,否则可能会损害模型性能。像 MP3 这样的有损压缩格式会丢弃一些音频信息以减小文件大小,通常不太适合训练高保真 ASR 模型。整个数字化流程将物理现象转化为结构化的数字阵列,使其适合进行分析和建模。digraph G { rankdir=TB; node [shape=box, style="filled,rounded", fontname="sans-serif", color="#4263eb", fillcolor="#bac8ff"]; edge [fontname="sans-serif", color="#495057"]; analog [label="模拟信号\nx(t)"]; sampled [label="采样信号"]; quantized [label="量化信号"]; digital [label="数字信号\nx[n] (PCM 数据)"]; analog -> sampled [label="采样\n(例如 16 kHz)"]; sampled -> quantized [label="量化\n(例如 16 位)"]; quantized -> digital; }将模拟信号转换为数字信号的过程。随着音频现在以数字序列 $x[n]$ 的形式表示,我们有了一种格式,Python 库可以加载它,并且我们的深度学习模型可以将其用作输入。下一步是将这个原始数字序列转换为能够更好体现语音语音特征的特性。