我见过太多团队在声音分类项目上第一次翻车,翻得最有代表性的方式是这样的:拿到一个音频数据集,把图像分类的代码原封不动搬过来,采样率不管、帧长不管,直接把波形归一化后喂给一个在图像上训过的残差网络,训了三四十轮,验证集准确率卡在六成上下不动,然后开始怀疑是模型不够深。真正的问题往往不在网络,而在输入端——声音这个模态的物理属性、标注粒度、评测协议,和图像完全是两套逻辑。数据增强也是同理,图像上那套随机裁剪加颜色抖动搬到声谱图上,很多时候不但没收益,还会把类别语义破坏掉。
这篇内容想聊的就是这件事:声音分类里的数据增强与深度学习方法,从一个系统综述的视角把它们串起来,但落点放在工程可操作性上。我会讲清楚声音任务到底特殊在哪、四层增强手法各自的适用边界、网络选型的演进逻辑、综述类工作怎么做才不至于变成文献罗列,以及最后从论文结论走到自己项目里那段最容易断掉的路。适合正在做音频分类、环境声识别、异常声音检测的工程师,也适合刚进这个方向、需要快速建立全貌认知的读者。即使你只会一点深度学习基础,跟着读下来也能拿到一套可以直接改参数就用的配置思路。
1. 声音分类任务的真实面貌:它和图像分类差在哪
1.1 采样率、帧长与窗函数:预处理阶段就决定上限
先从一个最容易被忽略但影响最大的参数说起:采样率。图像输入是固定的像素网格,分辨率换一下顶多影响细节;声音换成不同采样率,丢掉的是整段高频频段,而且丢得不可逆。常见环境声数据集里,大量能量集中在低频段,但像玻璃碎裂、金属摩擦、鸟鸣这类类别,判别性信息恰恰在高频。我做过一组对照,同一份数据分别用 16kHz 和 44.1kHz 训练同一个网络,整体准确率差距不大,但把高频敏感的几个类单独拉出来看,16kHz 版本召回率掉了将近十五个点。所以选采样率不是"够用就行",而是要先看你的类别里有多少依赖高频线索。
帧长和帧移是第二个坎。经典的 25ms 帧长配 10ms 帧移,是从语音识别时代沿用下来的经验值,对大部分环境声和乐器声都还算稳。但这里有个绕不开的权衡:窗越长,频率分辨率越高、时间分辨率越低;窗越短则相反。鸟鸣、敲击这类瞬态声音,如果用 50ms 以上的长窗,起音位置会被抹平,时频图上糊成一片;而持续性的机械轰鸣用太短的窗,频谱会碎得看不出谐波结构。我在做一类冲击性声音识别时,最后把窗长压到 20ms、帧移 5ms,配合 128 个 mel 滤波器,效果比默认参数好不少。这不是标准答案,但思路值得借鉴:先看你的类别在时频平面上长什么样,再反推参数,而不是反过来。
还有一个容易被忽略的点是幅度标度。波形转对数 mel 谱之后,要不要做逐样本的均值方差归一化?做了会让不同录音设备的增益差异被拉平,模型更容易收敛;但在异常检测这类任务里,绝对能量本身可能就是判别信号,归一化反而把线索洗掉了。我在两个不同类型的项目上分别验证过:分类任务用逐样本归一化更稳,异常检测任务保留原始对数幅度、只做全局缩放效果更好。这个选择没有通用答案,但它值得你在项目早期就做一次消融。
1.2 标注粒度:clip 级和 event 级是两种完全不同的任务
综述类文章里经常把"声音分类"笼统地当成一个任务,但落到实操层面,标签粒度直接决定了你该用什么网络、什么损失函数、什么增强策略。粗略分两种:一种是片段级标签,一段十秒的音频打一个"狗叫"的标签,至于狗叫发生在第几秒不管;另一种是事件级标签,要标出每个事件的时间区间。
片段级任务相对好做,网络最后做全局池化就行,但它的隐患是标签噪声天然就高。一段城市环境录音里可能同时有车流、人声、鸟叫,标注者只标了其中一个,模型学到的是"这段里有这个类",而不是"这个类长什么样"。事件级任务精度要求高,但标注成本也高,很多公开数据集里事件级标注只覆盖了一部分样本。
这两种任务对数据增强的容忍度完全不同。片段级任务里,时间平移、随机裁剪这类操作基本无害,因为标签是全局的;事件级任务里,你平移一下可能就把事件移出标注框了,增强反而制造了错误监督。我带过一个学生做事件检测,他直接把片段级的增强流水线套过去,训练损失降得很漂亮,验证集 F1 死活上不去,后来发现问题就出在随机时间裁剪上——裁剪后的窗口里事件位置和标签对不上了。这个坑非常隐蔽,因为损失曲线看起来一切正常。
1.3 评测协议:同一个模型差出二十个点并不奇怪
如果你真的去读一批同方向的论文,会发现一个很让人困惑的现象:同一个网络结构,在不同论文里的准确率能差出十几个甚至二十个点。原因通常不在模型,而在评测协议。常见的不一致点有这么几个:
- 数据划分方式。有些数据集是分 fold 的,同一段原始录音切出来的片段必须落在同一个 fold 里,否则训练集和测试集会有信息泄漏。有些论文图省事直接随机划分,指标虚高得很明显。
- 是否用了额外的预训练数据。用大规模音频数据预训练过的模型,和从零训练的模型放在一张表里比,本身就不公平。
- 测试时的集成策略。多裁剪、多模型平均、测试时增强,这些技巧能把指标再往上推几个点,但很多论文不写清楚。
我在复现一份综述里提到的某个方法时,就吃过这个亏。论文报的准确率比我复现的高了九个点,我一度以为是自己实现有问题,逐层对比之后发现,差别在于他们把训练集和验证集做了多次随机划分然后取平均,而我只跑了一次固定划分。换成分折平均之后,差距缩到两个点以内,剩下的差异来自学习率调度。这件事给我的教训是:读综述里的对比表格时,先看协议,再看数字,不然很容易得出错误结论。
| 常见协议差异 | 对指标的影响量级 | 处理建议 |
|---|---|---|
| 随机划分 vs 分折划分 | 3 到 10 个点 | 优先报告分折结果 |
| 是否使用外部预训练 | 5 到 15 个点 | 表格里单列一栏注明 |
| 单次划分 vs 多次平均 | 1 到 4 个点 | 至少跑三次取均值方差 |
| 测试时增强 | 1 到 3 个点 | 明确标注是否启用 |
2. 数据增强在声音领域的四层操作面
2.1 波形层增强:成本最低,误用代价也最大
波形层增强是在时域信号上直接动手,实现简单、计算便宜,是最先该上的一层。常见操作包括加性噪声、增益扰动、时间平移、重采样、音高偏移、时长拉伸,以及用房间冲激响应做卷积模拟混响。
加性噪声的难点在信噪比控制。你不能简单地按固定比例叠加,因为不同样本的原始能量差异很大。稳妥的做法是先算样本的均方根能量,再按目标信噪比反推噪声幅度。我给的一个经验区间是 5dB 到 20dB,低于 5dB 时很多类别的判别线索会被彻底淹没,高于 20dB 又几乎不产生正则效果。做异常声音检测时这个区间要更保守,因为异常本身可能就体现在低信噪比条件下,你把噪声加太狠,模型学到的是"能听清的就是正常"。
音高偏移要格外小心。在语音任务里做音高扰动是常规操作,因为语义不变;但在环境声和乐器声任务里,音高变化可能直接改变类别。比如某些鸟类叫声的基频就是判别依据,你把音高上下移两个半音,类间边界就模糊了。我的做法是只在明确知道该类别对音高不敏感时才启用,而且幅度控制在一个半音以内。
混响卷积这一层经常被忽略,但它在真实部署场景里价值很高。训练数据往往是在安静环境近距离录的,部署时的麦克风可能在房间角落,混响很重。用一批不同混响时间的冲激响应做卷积,能显著提升模型对远场录音的鲁棒性。代价是需要一套冲激响应库,公开可用的资源不少,选的时候注意匹配你目标场景的房间尺寸和材质。
# 按目标信噪比叠加噪声的参考实现 import numpy as np def add_noise_at_snr(waveform, noise, snr_db): signal_rms = np.sqrt(np.mean(waveform ** 2) + 1e-9) noise_rms = np.sqrt(np.mean(noise ** 2) + 1e-9) target_noise_rms = signal_rms / (10 ** (snr_db / 20.0)) scaled_noise = noise * (target_noise_rms / noise_rms) return waveform + scaled_noise这段代码看着简单,但有两个细节容易写错:一是分母上加的那个极小值,防止静音片段算出除零;二是噪声长度要至少和波形一样长,不够就循环拼接,直接截断会让尾部变成纯信号,模型可能学到这个虚假边界。
2.2 时频表示层增强:SpecAugment 家族的真实收益曲线
转到对数 mel 谱上做增强,最有代表性的是时间掩蔽、频率掩蔽和时间扭曲这一族方法。它的思路很直白:在时频图上盖掉若干矩形块,强迫模型不要过度依赖某几个局部区域。这个想法在语音识别上验证得很充分,但搬到声音分类上,收益曲线并不总是向上的。
我做过一组比较系统的消融,在同一份十类环境声数据上,从零增强开始逐项加:
| 增强配置 | 验证准确率 | 相对基线 |
|---|---|---|
| 无增强 | 78.4 | 基线 |
| 仅频率掩蔽 | 80.1 | +1.7 |
| 仅时间掩蔽 | 79.6 | +1.2 |
| 频率加时间掩蔽 | 81.3 | +2.9 |
| 再加时间扭曲 | 80.8 | +2.4 |
可以看到,时间扭曲在这里是负收益。原因我后来想明白了:时间扭曲会非线性地拉伸局部时间轴,对语音这种语速可变但结构稳定的信号有帮助,对冲击性环境声则破坏了起音包络,而包络恰恰是关键线索。这提醒我一件事:SpecAugment 不是一个整体,要拆开逐项验证,尤其时间扭曲这一项,在非语音任务上要谨慎。
掩蔽的宽度也是超参。频率掩蔽如果太宽,可能把整段谐波结构盖掉;时间掩蔽太宽,可能把整个事件盖掉。我的经验是频率掩蔽单块不超过总 mel 通道的八分之一,时间掩蔽单块不超过总帧数的十分之一,块数控制在两到三块。这个范围在几个不同数据集上都还算稳。
还有一点是掩蔽值的选取。填零(对应最小对数能量)是最常见做法,但也有填均值或者填随机值的变体。填零相当于告诉模型"这里是静音",而真实静音在数据里可能是稀少的,长期下来模型会对静音区域产生奇怪的先验。填训练集均值更温和一些,我在小数据集上通常选这个。
2.3 混合类增强:Mixup 在声音上为什么会"变味"
Mixup 在图像上几乎是默认配置,两条样本按比例线性混合,标签也按同样比例混合。搬到声音上,波形直接线性叠加是物理上成立的——真实场景里声音本来就会叠加。但问题出在标签端:两个不同类别的声音叠在一起,标签按比例插值,这个假设在声音上未必合理。
举个具体的例子。一段狗叫和一段雨声按 7:3 混合,图像 mixup 的做法是标签设成 0.7 的狗叫加 0.3 的雨声。但人耳听到的是什么?是"下雨天有狗在叫",这两个事件是并存的,不是某种中间态。标签插值隐含的假设是"混合样本处在两类之间的连续空间",而声音的语义往往是并集关系。这个差别在类别数少、类间差异大的时候不明显,类别一多、类间有层次结构时就会出问题。
更贴合声音特性的做法是混入背景而不是混入另一个前景类。把目标事件和一段随机背景噪声按一定比例混合,标签保持不变。这样既扩充了样本多样性,又不破坏标签语义。我在几个项目上都用这个替代了标准 mixup,稳定性明显更好。
当然,如果你的任务是音频事件检测,多个事件同时存在是常态,那标签就该是多标签而不是插值。这时候混合反而是合理的增强,前提是你用的是多标签损失而不是 soft 交叉熵。
2.4 生成式与仿真增强:什么时候值得付出这个成本
用生成模型造音频样本这个方向这几年热度不低,从早期的生成对抗网络到后来的扩散模型都有尝试。但落到工程上,我的态度比较保守:在你把前面三层做扎实之前,不要碰这一层。
原因很实际。生成音频的质量评估本身就是个难题,你很难自动判断生成样本是不是保真,主观听测又不可扩展。而且生成模型容易复制训练集的模式,多样性提升有限。我试过用一批生成样本扩充一个样本量偏少的类别,验证集指标提升不到一个点,但训练时间翻了三倍,调参复杂度也上去了。
真正值得考虑生成式方法的场景,是某些类别在现实中极难采集。比如某些设备故障声,你不可能为了收集数据去人为制造几百次故障。这种情况下,基于物理仿真合成声音是一条可行路径——用设备的结构参数和故障机理去正演声音信号。这类方法的好处是可解释、可控,缺点是建模成本高,而且仿真和真实的域差距需要仔细校准。
我的建议是分层推进:波形层增强先跑通,时频层增强做消融,混合类增强按任务类型选用,生成式方法只在前面都榨干了、样本量确实是瓶颈时才考虑。这个顺序不代表后面的技术不先进,而是投入产出比决定的。
3. 深度网络在声音分类上的选型逻辑
3.1 从 CNN 到 CRNN:时序建模的第一次正式补课
纯卷积网络处理对数 mel 谱,本质上是把时频图当成一张灰度图。这个思路能work,因为局部时频模式确实包含大量判别信息,而且卷积的归纳偏置和声音的局部相关性匹配得不错。但它的短板也很明显:卷积的感受野是局部的,要覆盖整段音频的时间跨度,要么堆很多层,要么用很大的池化,前者参数多,后者丢时间分辨率。
循环结构加进来就是为了解决这个。典型结构是几层卷积做局部特征提取,接一个双向门控循环单元或者长短期记忆网络做时序聚合,最后接注意力池化而不是简单取平均。注意力池化的作用是让模型自己决定哪些时间片段更重要,这对片段级标签的任务特别有用——一段十秒录音里事件可能只出现两秒,平均池化会把这两秒的信号稀释掉。
我在一个包含十类城市环境声的项目上做过对比,同样的卷积主干,接平均池化是 79.2,接注意力池化是 82.6,再接一层双向门控循环单元到 84.1。这个提升幅度不算小,代价是参数量和推理延迟都上去了。如果你的部署环境是嵌入式设备,这个代价要仔细权衡;如果是在服务端,那基本可以放心用。
还有一个变体是一维卷积直接在波形上做,跳过时频变换。它的好处是端到端、没有手工特征的信息损失,坏处是训练数据需求量大,小数据集上很难训起来。我一般把它当成一个对照基线,而不是首选方案。
3.2 注意力与 Transformer:长程依赖到底需不需要
把 Transformer 搬到声谱图上,核心动机是捕获长程时频依赖。这个动机在语音任务上很成立,因为语音的语义确实依赖较长的上下文。但在环境声分类上,我对它的必要性持保留态度。
原因在于,声音事件的判别信息大多集中在局部。玻璃碎裂的判别特征是那一下瞬态的能量分布,不需要看前后三秒。真正需要长程建模的,是"这段时间里发生了什么序列"这类任务,比如音频场景分类,判断这是地铁站还是咖啡馆,靠的是多种声音的组合模式。
不过实际效果上,基于 Transformer 的音频频谱模型在这几年的公开评测里确实表现很强,一个重要原因是它们用了图像领域的预训练权重做初始化。声谱图在统计特性上和自然图像有相似之处,这种跨模态迁移效果意外地好。我在样本量中等的数据集上试过,用图像预训练权重初始化,相比随机初始化,收敛速度快了将近一倍,最终指标高了三到五个点。
但要注意一个前提:预训练时的输入归一化方式要和你的预处理对齐。图像预训练模型的输入通常按图像的均值方差归一化,而声谱图的数值分布完全不同。直接套用会导致第一层激活饱和。稳妥做法是把你自己的声谱图统计量算出来,做一次适配性的归一化,或者干脆只加载除第一层之外的所有权重。
3.3 自监督预训练:小样本场景下的实际收益曲线
自监督在音频领域的价值,我觉得被低估了,尤其是在标注稀缺的场景。核心思路是不用标签,让模型从大量无标注音频里学表征,常见的是对比学习那一套——同一段音频的两个增强视图互为正样本,批次内其他样本为负样本。
这里有个有意思的细节:增强策略的选择直接决定自监督学到什么。在图像上常用的颜色抖动、灰度化,在音频上对应的就是频谱扰动和时频掩蔽。但如果你只做时间平移作为增强,模型学到的表征会对时间位置不敏感,这对分类是好事,对事件定位就是灾难。所以做自监督之前要先想清楚下游任务是什么。
实际收益曲线我观察到的是这样:当标注样本在一千条以下时,自监督预训练带来的提升非常显著,能到十个百分点以上;样本量到五千条左右,提升收窄到三到五个点;到两万条以上,收益就不太明显了,甚至和充分训练的监督模型打平。这个曲线的拐点位置和任务难度有关,但整体趋势比较稳定。
代价是预训练阶段的计算开销。如果你的场景标注数据充足,直接监督训练可能更划算。如果标注数据少,那自监督基本是必选项。
# 一个简化的对比学习训练目标示意 import torch import torch.nn.functional as F def contrastive_loss(z1, z2, temperature=0.1): batch_size = z1.size(0) z = torch.cat([z1, z2], dim=0) z = F.normalize(z, dim=1) sim = z @ z.t() / temperature mask = torch.eye(2 * batch_size, dtype=torch.bool) sim = sim.masked_fill(mask, float('-inf')) labels = torch.cat([ torch.arange(batch_size) + batch_size, torch.arange(batch_size) ]) return F.cross_entropy(sim, labels)温度系数这个参数对结果影响很大。设得太高,负样本区分度不够;设得太低,训练不稳定。我一般从 0.07 开始试,0.1 和 0.2 作为备选。批次大小也很关键,负样本越多越有效,显存允许的话尽量往大了设。
| 标注样本规模 | 自监督增益 | 推荐策略 |
|---|---|---|
| 小于 1 千条 | 10 个点以上 | 优先自监督预训练 |
| 1 千到 5 千条 | 3 到 10 个点 | 视计算预算决定 |
| 5 千到 2 万条 | 1 到 3 个点 | 可用图像权重初始化替代 |
| 大于 2 万条 | 接近持平 | 直接监督训练 |
4. 系统综述这类工作怎么做才不流于形式
4.1 检索式与纳入排除标准:综述可信度的地基
一份综述的可信度,八成压在前期的检索和筛选上。这一步做虚了,后面写得再漂亮也是空中楼阁。
检索式要解决的是"召回"和"精确"的平衡。关键词组合通常按三层来搭:任务层(声音分类、音频事件识别、声学场景分类)、方法层(数据增强、深度学习、卷积网络、自监督)、应用层(环境声、工业异常、生物声学)。三层之间用逻辑与连接,层内用逻辑或。限定条件一般包括时间范围、语言、是否同行评议。
这里有个实操建议:不要只用一组检索式跑完全部数据库。不同数据库的索引词体系不一样,同一个概念在不同库里的规范表述可能差别很大。我通常准备两到三套变体,跑完之后做去重,再去重后的结果里抽样检查召回率——随机抽二十篇该领域的关键文献,看看有几篇落在你的检索结果里。如果低于八成,说明检索式有漏洞,要回去补关键词。
纳入排除标准要在检索之前就定好,不能边看边改。典型的标准包括:是否提出了明确的增强方法或网络结构、是否在所声明的数据集上做了定量评测、是否报告了足以复现的实验设置。排除项包括纯工程报告、缺少定量结果、重复发表。这个阶段最容易犯的错是标准模糊,导致两个评审者对同一篇文献给出相反判断。解决办法是在正式筛选前先做一轮一致性校准,两个人各自独立筛五十篇,算一下一致性系数,低于可接受阈值就回去重新对齐标准。
4.2 分类维度设计:横切与纵切的选择
综述写得好不好看,很大程度取决于分类维度设计。维度选错,整篇综述就会变成"这篇用了卷积加循环网络,那篇用了 Transformer"这种流水账。
我的经验是先想清楚读者想从综述里拿到什么。如果你面向的是刚入场的工程师,维度应该围绕"任务类型加方法适配"来搭,让人能按自己的任务去查对应的方法。如果你面向的是研究者,维度应该围绕"方法演进脉络加未解决问题"来搭。
一个比较实用的设计是双维度交叉:一个轴是增强方法的作用层级,另一个轴是任务类型,交叉格子里填该组合下的代表性工作和典型结论。这样做的好处是能直接暴露研究空白——某个格子里如果只有两三篇,那就是明显的机会点。
还有一种常见的切法是按数据集组织。这种切法读起来顺,但风险是把方法讨论碎片化了,同一个方法在不同数据集上出现多次,读者很难拼出全貌。我的建议是数据集作为辅助维度嵌在方法维度下面,而不是作为主维度。
4.3 证据强度分级与常见偏差
综述里最容易被忽视但最重要的部分是证据强度评估。把一堆论文的结论平行罗列,等于默认它们同等可信,这显然不成立。
我一般从三个角度评估:一是实验设计的严谨程度,有没有做消融、有没有多次重复、有没有报告方差;二是评测协议的规范性,数据划分是否合理、是否避免了信息泄漏、是否说明了预训练数据来源;三是可复现性,代码和超参是否公开、增强参数是否写全。
常见的偏差类型,我在整理过程中遇到过这么几类:
第一类是数据集偏差。某个方向的研究高度集中在两三个公开数据集上,模型在这些数据集上刷分刷得很高,但换一个采集条件不同的数据集就崩了。这不是模型的问题,是研究生态的问题。综述里应该明确指出这一点,而不是把高指标当成普适结论。
第二类是发表偏差。负结果基本发不出来,所以你看到的增强方法都是"有效"的,但很可能有大量无效尝试没被记录。这个偏差无法完全消除,但可以在综述里做提示。
第三类是超参不对等。比较两种方法时,如果一种调过参一种没调,结论就不可信。我筛选文献时会留意作者是否说明了调参预算。
| 偏差类型 | 识别信号 | 综述中的处理方式 |
|---|---|---|
| 数据集集中 | 八成文献只用两三个数据集 | 单列小节讨论泛化性 |
| 发表偏差 | 几乎无负结果报告 | 明确提示结论可能有偏 |
| 超参不对等 | 基线描述极简 | 标注"调参情况未说明" |
| 协议不一致 | 同类任务指标差异巨大 | 统一换算或分组对比 |
5. 从综述结论到工程落地的距离
5.1 复现时最先崩掉的三件事
综述里读起来顺理成章的方法,自己动手复现时会遇到一堆没写在论文里的事。我统计过自己踩过的坑,最有代表性的有三个。
第一件是随机种子和数据加载顺序。声音数据集的样本时长往往不一致,padding 和 batch 组织方式会影响最终结果。有些实现按长度分桶,有些直接截断补齐,这两种在指标上能差一两个点。更麻烦的是,分桶策略和增强策略耦合在一起——你先分桶再增强和先增强再分桶,结果不一样。我的做法是在配置文件里把这块明确写死,并且固定种子,"差不多就行"这种态度在音频任务上会让你多花一周时间。
第二件是归一化统计量。训练集算出来的均值和标准差,要用到验证集和测试集上。但很多人忘了增强之后统计量会漂移——如果你先做增益扰动再算归一化,那归一化本身就是不稳定的。正确顺序是先固定归一化参数,再做随机增强。这个顺序颠倒过来,模型会学到增益不变的假象,部署时换个麦克风就失效。
第三件是早停和模型选择。声音分类的验证曲线经常不是单调的,中期会出现一个明显的高点然后回落。如果你只按最后一轮保存模型,很容易拿到次优解。按验证集指标做早停、并且保留最佳检查点,这是基本功,但真有人忘。
5.2 一套可以直接改参数用的增强配置模板
我把前面几层的经验收敛成一套配置,在几个不同规模的项目上都跑过,可以作为起点。核心思路是分层开关,逐项验证,不要一次性全开。
audio: sample_rate: 32000 duration: 5.0 n_mels: 128 n_fft: 1024 hop_length: 320 normalize: per_sample augment: waveform: gain_db: [-6, 6] time_shift_max: 0.5 noise: enabled: true snr_db: [5, 20] probability: 0.5 reverb: enabled: false probability: 0.3 spectrogram: freq_mask: num_masks: 2 max_width_ratio: 0.125 time_mask: num_masks: 2 max_width_ratio: 0.1 time_warp: enabled: false mix: background_mix: enabled: true probability: 0.3 max_ratio: 0.4 train: epochs: 60 batch_size: 32 lr: 3.0e-4 scheduler: cosine early_stopping_patience: 10 seed: 42几个参数的取值理由说一下。采样率选 32kHz 是个折中,覆盖了大部分环境声的判别频段,又不至于让计算量爆掉;如果你的类别明确依赖高频,往上提到 44.1kHz 或 48kHz 再评估。时长五秒是片段级任务的常见设定,短于三秒很多事件的上下文不够,长于十秒则批次内有效样本数下降太快。hop 长度取 320,在 32kHz 下对应 10ms 帧移,和经典设定对齐。
增强部分我把混响默认关掉了,因为它需要额外的冲激响应库,而且效果依赖库和目标场景的匹配度。你如果做的是远场拾音场景,可以打开并配一批房间尺寸多样的响应。
背景混合这一项我单独列出来,因为它是我在声音任务上对标准 mixup 的替代方案。概率 0.3 是个保守值,比例上限 0.4 保证目标事件仍然占主导。这两个值建议在验证集上扫一下,类别多的时候可能要往下调。
最后再分享一个小技巧:把增强强度的调度也考虑进去。训练初期用弱增强,模型先学到干净的类别边界;训练中后期逐步加强,提升鲁棒性。我一般按 epoch 线性增长增强概率,从 0.2 涨到 1.0,在几个项目上都比固定强度稳定一些。这个做法不算新,但很多人搭流水线时想不起来。另外,做消融的时候一定要一次只改一项,我见过太多人同时调五个参数然后说"这个增强没用"——那不是增强没用,是实验设计没用。