第二章:语音信号基础

各位同学,欢迎来到第二讲。今天咱们聊聊语音信号最底层的那些事儿。说实话,很多做语音识别的朋友,模型调得飞起,但一问到声音是怎么变成数字的,就有点含糊了。这不行,尤其是咱们要在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或者做特征提取后直接存特征。

嗯,这一章的内容就这些。看似基础,但都是后面所有算法的地基。采样率选错了,量化位数选低了,后面模型再牛也救不回来。下一章咱们开始讲预处理,那才是真正动手的开始。