语音识别模型不能直接从一长串波形中轻易看出某个音素在何时、哪些频率上出现。常见做法是把一维声音切成短帧,再把每帧变换到频域,得到随时间变化的频谱。对数幅度语谱图保留较密集的频率格点,不额外通过Mel滤波器和离散余弦变换压缩,让后续神经网络自行学习哪些局部时频形状有用。
先从时间刻度推导矩阵尺寸
以16kHz采样率为例,25毫秒窗口包含400个采样点,10毫秒步长对应160个采样点。窗口从波形起点向后滑动,每次取得400点,邻近两帧会重叠240点。重叠不是重复浪费,它让短暂语音变化不会刚好落在帧边界而消失,也为模型提供更连续的时间轨迹。
- 检查采样率、声道和样本类型,必要的重采样应在特征函数之外明确完成。
- 根据窗长和步长计算可完整取出的帧数,约定尾部不足一帧时丢弃还是补零。
- 每帧乘汉明窗,降低截断边缘造成的频谱泄漏。
- 执行快速傅里叶变换并取复数幅度,只保留实信号对称频谱的一半。
- 对幅度加一个稳定项后取对数,输出时间帧乘频率格点的二维矩阵。
若输入是单声道数组,矩阵第一维通常对应帧序号,第二维对应频率位置。400点FFT具有共轭对称性,示例实现保留前200个幅度值。每个频率格点间隔约为采样率除以FFT长度,也就是40Hz。具体是否包含直流与奈奎斯特端点,要由实现约定并在训练和推理中保持一致。

汉明窗处理的是“截断假象”
直接截取25毫秒波形,相当于把帧外样本突然设为零。如果帧首尾不连续,FFT会把这种突变解释成额外频率成分,能量向邻近频点扩散。汉明窗让帧两端平滑减弱,从而减少泄漏,但也改变了幅度尺度。训练数据与线上数据必须使用相同窗函数和归一化,否则模型看到的分布会偏移。
| 处理环节 | 保留的信息 | 引入的取舍 |
|---|---|---|
| 分帧与重叠 | 短时间内近似稳定的声学形态 | 时间分辨率与计算量增加 |
| 汉明窗 | 主要频率结构更清晰 | 边缘样本权重降低 |
| FFT幅度 | 线性频率上的能量分布 | 相位通常不进入该特征 |
| 对数变换 | 弱能量区域更易观察 | 必须处理零值与数值范围 |
为什么使用log幅度
语音能量跨度很大,强频率成分可能压住较弱细节。对数变换压缩动态范围,使相对变化更突出,也更接近许多声学任务的表示习惯。示例中的log(x+1)通过加一避免零值产生负无穷;其他实现也可能加入很小的epsilon。稳定项不同会改变数值范围,所以不能在训练后随意替换。
frame = waveform[start:start + 400]
windowed = frame * hamming400
spectrum = abs(fft(windowed))
half = spectrum[:200]
feature[t] = log(half + 1.0)
幅度是否除以窗长、整段波形长度或某个常数,也需要固定。比例在取对数后会变成偏移,模型或归一化层可能对此敏感。更稳妥的做法是把预处理参数写入模型配置,并为若干固定波形保存“金标准”特征,升级数值库后逐点比较。
它与FBank、MFCC的分界在频率压缩
FBank通常在功率谱之后应用Mel滤波器组,把线性频率格点汇聚为较少的感知频带,再取对数;MFCC还会在此基础上进行离散余弦变换,得到更紧凑的倒谱系数。对数幅度语谱图去掉这些手工压缩,保留更细的线性频率结构,代价是特征维度更高、训练计算更多,也更依赖模型自己学会筛选无关信息。
不能因此断言语谱图在所有任务上都优于MFCC或FBank。数据规模较小、算力有限或传统模型结构固定时,经过经验设计的压缩特征可能更稳定;深度网络和充足训练数据则更有机会从高分辨率表示中学习有效滤波。应在相同数据划分、相同模型预算和相同增强条件下比较,而不是只比较单次准确率。
保留更多原始信息扩大了模型的选择空间,也扩大了噪声、混响和设备差异进入模型的通道。
实现里最容易错的是形状和归一化
Python数组可能采用“声道乘样本”或“样本乘声道”布局,切片前必须确认轴。帧数计算要与尾部策略一致,不能多分配一行零特征。旧代码中的np.float等别名在新版本环境中可能不可用,应使用明确浮点类型。输入为整数PCM时,是否先缩放到固定范围也要统一。
批处理还会加入补齐和长度掩码。补齐值经过对数和归一化后未必仍为零,模型若没有正确掩码,就会把尾部填充当成声音。特征缓存应记录采样率、窗口、步长、FFT长度、窗函数、对数稳定项和归一化版本,避免不同配置的矩阵混在同一训练集。
四类信号足以做第一轮验收
- 全零信号:特征应有限、稳定,不出现NaN或无穷。
- 单频正弦:主要能量集中在预期频点附近,可观察窗函数造成的展宽。
- 短脉冲:检查帧边界、重叠和时间位置是否正确。
- 固定语音片段:与保存的基准矩阵比较形状、均值、方差与最大误差。
随后再做端到端验证:同一段音频经过离线与线上管道后特征应一致;多线程批处理不应改变帧顺序;异常采样率应明确报错或走已批准的重采样路径。可视化几张矩阵能帮助发现转置、全黑、全亮和时间轴反向,但自动测试仍需数值断言。
对数幅度语谱图的核心并不神秘:它把短时波形转换成较完整的线性时频画面,把进一步筛选交给神经网络。真正决定可用性的,是每一个细节是否在训练、评估和部署中保持一致。把窗长、步长、频率格点、数值尺度和填充策略写成可测试契约,模型看到的才始终是同一种“声音地图”。
本文《让神经网络看到更完整的声音:对数幅度语谱图的生成路线》由 xkmchenmu 发布于 xkmchenmu Blog。 转载请保留原文链接并注明出处。
支付宝扫一扫