在训练模型时我们通常先用卷积网络从音频中提取特征。在数据充足的场景下它的效果一般优于传统方法但计算和存储开销也更大。本文探讨如何用传统信号处理算法替代这一步从而降低资源消耗。本文主要是借鉴RNNoise来做介绍。音频特征Bark 临界频带能量人耳对频率的分辨并不是线性的Zwicker1961就曾提出听觉系统可以近似为一组带通滤波器每个滤波器覆盖一个临界频带落在同一个临界频带内的频率会被听觉系统合并处理这一现象也被称为Bark尺度。他把0-15.5kHz划分为24个临界频带。常用的频率到Bark值的转换如下z ( f ) 26.81 f 1960 f − 0.53 [ Bark ] z(f)\frac{26.81\, f}{1960 f} - 0.53 \quad [\text{Bark}]z(f)1960f26.81f−0.53[Bark]其中f ff为频率(Hz)z zz为对应的Bark值。它在低频接近线性、高频趋于对数与mel尺度相似他们的核心都是掩蔽效应对频率分辨率做感知非线性弯折。当然这里我们就不详细计算了通常通过列表的形式使用。可以看bark 表Bark差分特征其差分特征包括Δ B a r k \Delta BarkΔBark和Δ Δ B a r k \Delta \Delta BarkΔΔBarkBark的临界频带能量描述的是当前帧的静态频谱我们有时还是需要用到动态时序。这个可以类比于速度和加速度当前仅仅是举一个例子说明而已。声音渐强or渐弱基频基频是一个周期信号中频率最低的那个分量,也可以直接理解为声带的振动频率。一个周期为T TT的信号,其基频f 0 1 / T f_0 1/Tf01/T。它可以用来区分浊音与清音:浊音由声带振动产生,有明确基频;清音(如/s/、/f/)没有。此外,男性基频通常较低,女性较高。工程上常用自相关法测基频:在一段范围内寻找使信号与自身延迟版本最相似的延迟τ \tauτ,该处的自相关峰值位置即基频周期,峰值高度则反映音高的稳定程度。本项目在 50–400Hz范围内搜索,输出基频周期和相关度两维。这一维是整组特征里最有先验色彩的:风扇、白噪声这类噪声没有周期性声带振动,基频相关度天然很低,与元音一眼可分。非平稳度非平稳度衡量当前帧频谱相较于历史帧的突变程度。做法是对频带能量做指数平滑,再计算当前帧与平滑值的偏差:S t α S t − 1 ( 1 − α ) E t , nonstat t 1 B ∑ b ∣ E t , b − S t , b ∣ S_t \alpha S_{t-1} (1-\alpha)E_t, \qquad \text{nonstat}t \frac{1}{B}\sum_b |E{t,b} - S_{t,b}|StαSt−1(1−α)Et,nonstattB1b∑∣Et,b−St,b∣平滑常数α \alphaα越大,记忆越长、反应越慢。本项目用四个不同的α \alphaα(0.98 / 0.95 / 0.9 /0.8)同时观察快变与慢变,再对其中最快和最慢两个尺度求差分。语音在元音段相对平稳,而键盘敲击、关门声等突发噪声高度非平稳。因此非平稳度对 VAD 区分语音的自然演变与瞬时噪声冲击至关重要。特征汇总特征维度捕捉什么为什么对 VAD 有用Bark 频带能量22各频段的能量分布人声能量集中在特定频段与噪声的能量分布差异明显ΔBark、ΔΔBark22能量的一阶/二阶变化语音有丰富动态起伏静音或稳态噪声则平坦基频周期 相关度11有无稳定的声带振动浊音有明确基频和高自相关多数噪声没有频谱非平稳度4频谱突变的程度(4种时间尺度)区分钟声等瞬时噪声冲击与语音的自然演变Δ非平稳度2非平稳度本身的变化率精准捕捉语音的起始和结束瞬态总计34为什么使用DSP前端替代卷积神经网络呢回到之前的话题我们常用的蒸馏或者训练一个模型就是将原始波形送进去然后让神经网络学习语音的特征针对不同的任务。通常来说我们蒸馏会使用一个相同的架构的但是更小的模型学生模型来学习教师能力。但是这里我们也可以用传统方法来提取特征这一个地方其实是有借鉴RNNnoise的意思。完全放弃了卷积,改用手工特征。理由如下一、卷积前端很贵。 卷积层要占用大量参数和算力。若学生也用卷积,小就无从谈起更何况silero vad模型已经很小了。手工 DSP 特征的提取是固定数学公式(FFT、取能量、做差分、自相关),零参数、不占模型体积,省下的预算全给后面的神经网络。二、为嵌入式落地铺路。 仙子我们更加希望可以将模型可以部署到嵌入式端而不是仅限于上位机。神经网络前端在 C 里实现既慢又要处理卷积的各种边界;而 FFT、自相关、指数平滑都是经典信号处理算法,C 实现成熟到不能再成熟。选 DSP前端,本质是选了一条能走到底的落地路线。三、手工特征自带先验。 如前所述,这 34 维把人声有基频、频谱在动、能量有起伏这些知识直接编码进了输入。学生不必从零学这些,相当于站在几十年语音信号研究的肩膀上。学生模型与蒸馏本处采用的例子是一个简单的例子当然大的模型也用不上这种方法。16kHz 波形 → 34维 DSP 特征(手工计算,零参数)→ GRU(h32, 2层)→ sigmoid训练时,先用教师 Silero VAD 对音频逐帧打出概率作为软标签,学生则以 DSP 特征为输入去拟合这些软标签。整个可学习部分只有那两层 GRU,共 12,897 个参数,INT8 量化后模型体积 15.3KB。评测与边界在与教师及另一个开源模型 TEN VAD 的对比中:表一:抗噪鲁棒性(不同 SNR 下的帧准确率 %)SNRrnvadSilero VAD v4TEN VADclean干净97.6100.0教师基准94.220 dB97.497.491.910 dB95.895.189.15 dB96.293.787.30 dB93.691.987.4-5 dB90.784.883.2表二:综合对比(补上速度、内存、感受野)指标rnvadSilero VAD v4TEN VAD架构34 DSP 特征 GRU(h32,l2)STFTConvLSTMSepConv2D2×LSTM参数量12,897155,90812×75,5166×体积ONNX52.8 KB628.8 KB308.1 KB量化后体积15.3 KB——运行时内存常驻 ~25 KB纯 C99ONNX Runtime数 MB框架开销ONNX Runtime数 MB框架开销英文帧准确率97.6%100%教师基准94.3%中文对话 F10.8920.9080.909-5dB 准确率90.7%84.8%83.2%运行依赖无纯 C99ONNX RuntimeONNX Runtime总结干净场景:15KB 的学生 F1(0.892)已逼近十几倍大的教师(0.908),证明小没牺牲基本盘;抗噪反超:随 SNR 下降,学生从追平到反超,-5dB 领先教师 5.9 个点——这是全文最有冲击力的结论;诚实归因:这个反超是DSP 先验更鲁棒“教师训练分布没覆盖强噪声两者叠加,不是手工特征天生打败卷积”。再补一句边界:数据/算力充足时卷积也能学到这些先验,本文结论只在受限 硬部署约束下成立。把这个案例拔到可举一反三的高度:蒸馏迁移的是判断不是架构;先验既能从数据端(软标签)注入、也能从表示端(手工特征)注入;部署约束会反向决定架构。一句话收:当强领域先验遇上硬部署约束,缩小教师未必最优。关于这个例子的具体详细数据可以参考rnvad把 VAD 压到 15KB 能用吗与 Silero、TEN VAD 的实测对比