1. 语音信号基础:声音的物理特性与数字信号处理入门
各位同学,欢迎来到《语音算法核心原理解析》的第一章。
说实话,做语音算法这些年,我见过太多人一上来就扎进深度学习模型里,结果连最基本的采样率、量化位数都搞不清楚。嗯,这就像盖楼不打地基——迟早要塌。今天我们就从最底层开始,把声音的物理本质和数字化的过程彻底讲明白。
1.1 声音的物理三要素:频率、振幅、相位
声音是什么?说白了就是空气的振动。这种振动传到我们耳朵里,大脑就把它解读成了声音。描述这种振动,只需要三个物理量:频率、振幅、相位。
核心概念速查:
- 频率(Frequency):每秒振动的次数,单位 Hz。频率决定音高。人耳能听到的范围大约是 20 Hz ~ 20 kHz。
- 振幅(Amplitude):振动的幅度大小,决定音量(响度)。振幅越大,声音越响。
- 相位(Phase):振动在某个时刻所处的状态,单位是角度(°)或弧度(rad)。相位本身人耳不敏感,但多路声音的相位差会影响叠加效果。
我记得刚入行时,有个项目要做多麦克风阵列的波束成形。当时怎么调都调不好,最后发现是相位计算差了 180 度——两个麦克风的信号直接抵消了。你想想看,如果连相位都搞不清楚,这种问题你排查三天都未必能找到原因。
1.2 从模拟到数字:采样、量化、编码
现实世界的声音是连续的模拟信号,但计算机只能处理离散的数字信号。怎么把连续的变成离散的?三步走:采样、量化、编码。
1.2.1 采样(Sampling)
采样就是每隔一段时间,记录一次信号的瞬时值。这个时间间隔的倒数就是采样率。
我的经验:语音算法里最常见的采样率是 16 kHz(每秒 16000 个采样点)。为什么是 16 kHz?因为人声的主要能量集中在 8 kHz 以下,根据奈奎斯特定理,采样率至少要是最高频率的两倍。16 kHz 刚好覆盖 8 kHz 带宽,留了点余量。
这里有个经典问题:采样率太低会怎样?——混叠(Aliasing)。高频信号会被错误地映射成低频信号,听起来就是失真。我曾经在一个语音唤醒项目里,因为 ADC 的采样率设置错了,导致“你好”的“好”字高频部分全被折叠到了低频,模型死活识别不出来。排查了整整两天,最后发现是采样率配置少了个 0。
1.2.2 量化(Quantization)
采样得到了时间上离散的点,但每个点的幅度还是连续的。量化就是把连续的幅度值,映射到有限个离散的等级上。
量化位数(Bit Depth)决定了等级数量:
| 量化位数 | 等级数 | 动态范围(dB) | 典型应用 |
|---|---|---|---|
| 8 bit | 256 | ~48 dB | 早期电话、对讲机 |
| 16 bit | 65536 | ~96 dB | CD 音质、语音算法标准 |
| 24 bit | 16777216 | ~144 dB | 专业录音、后期制作 |
避坑指南:量化位数不是越高越好。16 bit 对于语音算法来说已经足够。我曾经见过有人用 24 bit 做语音识别,结果模型训练时间翻倍,精度几乎没有提升。算力是有成本的,别浪费在不需要的地方。
1.2.3 编码(Encoding)
量化之后,每个采样点就是一个整数。编码就是把这些整数按照某种格式存储或传输。最常见的格式是 PCM(脉冲编码调制),也就是直接把量化后的数值按顺序存起来。
举个例子,一段 16 kHz、16 bit、单声道的 PCM 音频,每秒的数据量就是:
16000 采样/秒 × 2 字节/采样 × 1 声道 = 32000 字节/秒 ≈ 31.25 KB/s
这个数据量其实不小。所以后来才有了各种压缩编码,比如 μ-law、A-law、Opus 等。但那是后面章节的内容,今天先把 PCM 搞明白。
1.3 时域与频域:看声音的两个视角
同一个声音信号,我们可以从两个完全不同的角度去看它:时域和频域。
- 时域(Time Domain):横轴是时间,纵轴是幅度。我们看到的是一条随时间变化的波形曲线。
- 频域(Frequency Domain):横轴是频率,纵轴是幅度(或能量)。我们看到的是信号由哪些频率成分组成。
时域直观,但信息量有限。比如一段语音里混入了 50 Hz 的工频噪声,你在时域波形上几乎看不出来,但在频域里一目了然——50 Hz 处会多出一根明显的谱线。
怎么从时域变到频域?最核心的工具就是傅里叶变换(Fourier Transform)。
一句话理解傅里叶变换:任何一个时域信号,都可以分解成若干个不同频率、不同幅度、不同相位的正弦波的叠加。傅里叶变换就是帮我们找出这些正弦波的“配方”。
实际算法里,我们用的是离散傅里叶变换(DFT)和它的快速版本 FFT。FFT 把计算复杂度从 O(N²) 降到了 O(N log N),这才让实时语音处理成为可能。
我建议你记住这个公式(不用背,理解就行):
X[k] = Σ x[n] · e^(-j·2π·k·n / N) (n = 0 to N-1)
其中 x[n] 是时域采样点,X[k] 是频域的第 k 个频率分量。N 是 FFT 点数,通常取 512、1024 或 2048。
1.4 本章知识体系总览
下面这张图,把本章的核心知识点串在了一起。我建议你多看几遍,把每个节点之间的关系理清楚。
1.5 本章小结
这一章我们讲了三个核心内容:
- 声音的物理三要素:频率、振幅、相位。这是理解一切语音算法的基础。
- 数字化的三个步骤:采样、量化、编码。记住 16 kHz / 16 bit / PCM 这个黄金组合。
- 时域与频域:两个视角看信号,FFT 是连接它们的桥梁。
说实话,这些内容看起来简单,但真正吃透的人并不多。我见过不少做了两三年语音算法的工程师,遇到噪声问题还是只会调模型参数,根本想不到先去频域看看噪声的分布。嗯,基础打牢了,后面的路才能走得稳。