2. 语音唤醒基础
做语音唤醒,说白了就是让机器听懂你说的话。但机器听不懂空气振动,它只认0和1。所以,我们得先把声音这种物理信号,变成数字信号。这个过程,就是本章要聊的核心。
我记得刚入行那会儿,总觉得这些基础理论没啥用,直接调库就完了。结果有一次,采样率设错了,唤醒词死活识别不出来,排查了整整两天。嗯,从那以后,我再也不敢小看这些“基础”了。
声音的物理三要素:频率、振幅、相位
声音的本质是振动。你说话时,声带在振动,空气分子被推来推去,形成疏密波。描述这个波,需要三个物理量。
- 频率(Frequency):每秒振动的次数,单位是赫兹(Hz)。频率决定音高。女声频率高,听起来尖细;男声频率低,听起来低沉。人耳能听到的大约是20Hz到20kHz。语音信号的能量,主要集中在300Hz到3.4kHz之间。做唤醒词时,我们通常关注这个频段。
- 振幅(Amplitude):振动的幅度,决定音量大小。振幅越大,声音越响。在数字信号里,振幅对应采样点的数值大小。
- 相位(Phase):描述波形在某个时刻的位置状态,单位是角度或弧度。相位听起来有点抽象。我打个比方:两个人同时拍手,如果拍下去的时刻完全同步,相位差就是0;如果一个人慢半拍,就有相位差。在语音识别里,相位信息对音质影响不大,但对声源定位和某些特征提取很关键。
我的经验:做唤醒词时,频率和振幅是重点关注对象。相位信息在单麦克风方案里经常被忽略,但在麦克风阵列做波束成形时,相位差就是核心参数了。
从模拟到数字:采样与量化
麦克风输出的信号是连续的模拟电压。计算机没法处理连续值,只能每隔一小段时间“拍一张快照”,这就是采样。再把拍到的电压值近似成整数,这就是量化。
采样(Sampling)
采样就是按固定时间间隔,读取信号的瞬时值。这个间隔的倒数,就是采样率。比如采样率16kHz,意味着每秒采样16000次。
量化(Quantization)
采样得到的电压值是连续的,但计算机只能用有限个数字表示。量化就是把连续值映射到离散的等级上。常用的量化精度是16位,也就是把信号范围分成65536个等级。
避坑指南:我曾经在一个项目里,为了省存储空间,把量化精度从16位降到了8位。结果背景噪声明显变大,唤醒率直接掉了十几个点。后来我查资料才发现,量化精度不够,会引入量化噪声。对于语音唤醒,16位是底线,别轻易动它。
奈奎斯特定理:采样的黄金法则
采样率到底设多少才够?奈奎斯特定理给出了答案:采样率必须大于信号最高频率的两倍,才能无失真地重建原始信号。
公式很简单:fs > 2 * fmax
举个例子:人声最高频率大约8kHz,那采样率至少得16kHz。这也是语音领域最常用的采样率。如果你用8kHz采样,那超过4kHz的频率成分就会混叠到低频段,产生失真。
注意:实际应用中,采样率通常取最高频率的2.5到3倍,留点余量。另外,采样前一定要加抗混叠滤波器,把高于fs/2的频率滤掉。我见过有人省了这个滤波器,结果高频噪声混叠进来,怎么调算法都没用。
语音信号的时域与频域表示
同一个语音信号,可以从两个角度看:时域和频域。
时域(Time Domain)
时域就是波形图,横轴是时间,纵轴是振幅。它能直观看到声音的响度变化、静音段、起止点。但时域看不出频率成分。
频域(Frequency Domain)
频域用频谱图表示,横轴是频率,纵轴是能量(或幅度)。它能告诉你声音里包含哪些频率成分,能量分布如何。语音识别里常用的MFCC特征,就是从频域提取的。
时域和频域通过傅里叶变换联系起来。简单说,傅里叶变换能把一段时域波形,分解成不同频率的正弦波之和。
我的习惯:调试唤醒词时,我总会在时域和频域之间来回切换。时域看端点检测有没有切准,频域看特征提取有没有丢信息。两个视角互补,缺一不可。
下面这张图,展示了语音信号从物理世界到数字世界的完整流程,以及时域和频域的关系。
采样率与量化精度怎么选?
做唤醒词开发,这两个参数是绕不开的。我整理了一张表,方便你对照参考。
| 参数 | 常用值 | 适用场景 | 注意事项 |
|---|---|---|---|
| 采样率 | 8 kHz | 电话语音、窄带通信 | 最高频率4kHz,语音清晰度有限 |
| 采样率 | 16 kHz | 语音唤醒、语音识别(主流) | 覆盖人声主要频段,性价比最高 |
| 采样率 | 44.1 kHz | 音乐、高保真录音 | 数据量大,唤醒词场景通常不需要 |
| 量化精度 | 8 bit | 低功耗、低质量场景 | 量化噪声大,不推荐用于唤醒词 |
| 量化精度 | 16 bit | 语音唤醒、语音识别(主流) | 动态范围96dB,满足大部分场景 |
| 量化精度 | 24 bit | 专业录音、高动态范围 | 数据量大,嵌入式设备慎用 |
我的建议:如果你刚开始做唤醒词开发,直接选16kHz采样率、16位量化精度。这是行业标准配置,绝大多数算法库和硬件都支持。等后面遇到具体问题,再针对性调整。
时域与频域的实际应用
在唤醒词开发中,时域和频域各有各的用处。
时域用得最多的地方:
- 端点检测(VAD):通过短时能量和过零率,判断有没有人说话。这完全在时域做,计算量小,适合嵌入式实时处理。
- 音量归一化:调整信号振幅,让不同距离、不同音量的说话人,信号幅度大致一致。
频域用得最多的地方:
- 特征提取:MFCC、FilterBank等特征,都是从频域算出来的。这些特征是唤醒词模型的输入。
- 噪声抑制:在频域里,可以识别并衰减特定频段的噪声,比如空调低频嗡嗡声。
我的经验:有一次,唤醒词在安静环境下表现很好,一到嘈杂环境就失灵。我一看频谱,发现是某个频段的背景噪声把语音特征淹没了。后来在频域做了个简单的带通滤波,只保留300Hz到3.4kHz的语音主频段,唤醒率立刻回升。你看,懂点频域知识,关键时刻能救命。
好了,这一章的内容就这些。声音的物理特性、采样量化、奈奎斯特定理、时域频域表示,这些是语音信号处理的基石。后面讲特征提取和唤醒词模型时,你会反复用到它们。