第二章:语音信号基础
各位同学,欢迎来到第二讲。今天咱们聊聊语音信号最底层的那些事儿。说实话,很多做语音识别的朋友,模型调得飞起,但一问到声音是怎么变成数字的,就有点含糊了。这不行,尤其是咱们要在MCU上落地,这些基础不扎实,后面踩坑都找不到原因。
2.1 声音的物理特性
声音的本质是什么?说白了,就是空气的振动。这种振动传到我们耳朵里,鼓膜也跟着振,大脑就解读成了声音。
描述这种振动,有几个关键参数:
- 频率:每秒振动的次数,单位是赫兹(Hz)。频率越高,音调越高。人耳能听到的大概是20Hz到20kHz。我做过一个项目,采集鸟叫声做识别,鸟鸣的高频成分能到15kHz以上,采样率低了根本不行。
- 幅度:振动的强弱,决定了音量大小。单位是分贝(dB)。
- 相位:振动在某个时刻的位置。这个在单麦克风场景下用得少,但做麦克风阵列波束成形时,相位差就是核心。
你想想看,一个声音信号,其实就是一条随时间变化的曲线——波形图。横轴是时间,纵轴是幅度。
核心要点:声音是连续的模拟信号,而计算机只能处理离散的数字信号。所以,我们必须做一件事——模数转换(ADC)。
2.2 采样定理
这是整个数字信号处理的基石。大名鼎鼎的奈奎斯特采样定理,内容很简单:
采样频率必须大于信号最高频率的两倍。
为什么?我打个比方。你拍一个旋转的车轮,如果快门速度太慢,车轮看起来像在倒转。这就是混叠。采样也是这个道理,频率不够,高频信号会伪装成低频信号混进来,你根本分不清。
举个例子:
- 语音信号,我们关心的是300Hz到3.4kHz(电话语音频段)。那么采样率至少需要 3.4k × 2 = 6.8kHz。实际中常用8kHz。
- 如果是音乐或高保真语音,最高频率到20kHz,采样率就得用44.1kHz(CD标准)或48kHz。
我的经验:在MCU上做语音识别,我一般选16kHz采样率。为什么?因为人声的绝大部分能量集中在8kHz以下,16kHz采样既能保证质量,又不会像48kHz那样产生海量数据,把MCU的内存撑爆。我曾经试过用8kHz采样做唤醒词,结果识别率掉了好几个点,因为有些辅音(比如/s/、/f/)的高频信息被砍掉了。
2.3 量化与编码
采样解决了时间上的离散化,但幅度还是连续的。量化就是解决幅度上的离散化。
简单说,就是把连续的幅度值,用有限个数字等级来表示。比如用16位整数,那就是把幅度范围分成65536个等级。
这里有个关键概念——量化误差。你想想看,真实值和量化值之间肯定有偏差,这个偏差就是噪声,叫量化噪声。
量化位数越高,噪声越小,但数据量也越大。
| 量化位数 | 动态范围(理论) | 典型应用 |
|---|---|---|
| 8位 | 48 dB | 早期电话、对讲机 |
| 16位 | 96 dB | CD音质、语音识别主流 |
| 24位 | 144 dB | 专业录音棚 |
避坑指南:我曾经在一个低功耗项目里,为了省内存,用了8位量化。结果模型在安静环境下还行,一到嘈杂环境,背景噪声和语音混在一起,量化噪声直接把信噪比干到了底,识别率惨不忍睹。所以,除非你的MCU内存实在捉襟见肘,否则老老实实用16位。
编码就更简单了。量化后的数值怎么存?最常见的就是PCM(脉冲编码调制)。直接把每个采样点的幅度值按顺序存下来。比如16位PCM,每个采样点占2个字节。
2.4 常见音频格式
在MCU上,我们打交道最多的就几种格式:
- WAV(PCM):无损格式,数据就是裸采样值。优点是简单、解析快,MCU可以直接处理。缺点是文件大。我99%的项目都用WAV做原始数据采集。
- MP3 / AAC:有损压缩格式。文件小,但解码需要算力。MCU上软解MP3挺吃力的,除非有硬件解码器。
- FLAC / APE:无损压缩。压缩比不错,但解码复杂度比MP3还高,MCU上基本不用。
- ADPCM:自适应差分脉冲编码调制。这是一种轻量级的压缩格式,压缩比4:1左右,解码极其简单,非常适合MCU。我在一个电池供电的录音笔项目里就用过,效果不错。
我的建议:做MCU语音识别,首选WAV(16位、16kHz、单声道)。调试阶段用这个,方便用Audacity等工具直接查看波形。等产品定型了,如果存储空间紧张,再考虑转成ADPCM或者做特征提取后直接存特征。
嗯,这一章的内容就这些。看似基础,但都是后面所有算法的地基。采样率选错了,量化位数选低了,后面模型再牛也救不回来。下一章咱们开始讲预处理,那才是真正动手的开始。