3、关键词数据集:公开数据集(如Speech Commands)介绍、数据格式、类别划分、训练/验证/测试集划分
关键词识别(Keyword Spotting, KWS)是智能音箱从“待机”状态切换到“交互”状态的第一道闸门。模型能否在嘈杂客厅、远场环境和多说话人场景下准确唤醒,很大程度上取决于训练所用的数据集质量与划分策略。本章围绕业界最常用的开源数据集——Google Speech Commands,系统讲解其数据格式、类别体系、划分原则,并给出可落地的工程实践建议。
3.1 核心原理:为什么数据集决定KWS模型的上限
关键词识别本质上是一个小词汇量的音频分类任务,但其难点在于环境鲁棒性和说话人泛化能力。与普通语音识别不同,KWS模型通常运行在低功耗DSP或嵌入式芯片上,计算资源有限,因此不能依赖大模型强行拟合数据。数据集的规模、覆盖度和划分方式直接决定了模型能否学到“关键词的声学共性”而非“特定说话人的嗓音特征”。
Speech Commands数据集由Google于2017年首次发布,2018年推出v2版本,是目前学术界和工业界最广泛使用的KWS基准数据集。其设计初衷正是为了模拟智能音箱的真实使用场景:用户可能在1米或3米外说话,背景可能有电视声、厨房噪声、其他人交谈等。因此,数据集中不仅包含清晰的命令词录音,还包含大量带有背景噪声的样本,以及纯噪声片段作为“静音类”训练数据。
从信号处理角度看,每条音频都是1秒长的16kHz单声道WAV文件。16kHz采样率覆盖了语音的主要频带(4kHz以下),足以提取MFCC特征;1秒定长则保证了输入维度的一致性,方便模型批量处理。每个命令词由上千位不同说话人录制,每位说话人重复录制多次,这为训练说话人无关的模型提供了基础。
3.2 数据格式与文件组织
Speech Commands v2数据集的目录结构清晰,每个类别(命令词)对应一个子文件夹,文件夹内是大量WAV文件。文件名采用“hash_编号.wav”的格式,其中hash是说话人ID的哈希值,编号是该说话人对此词的重复次数。这种命名方式保证了文件名的唯一性,同时隐藏了说话人的真实身份,符合隐私保护要求。
speech_commands_v2/
├── backward/ # 类别:backward
│ ├── 0a2b3c_0.wav
│ ├── 0a2b3c_1.wav
│ └── ...
├── bed/ # 类别:bed
├── bird/
├── cat/
├── dog/
├── down/
├── eight/
├── five/
├── four/
├── go/
├── happy/
├── house/
├── left/
├── marvin/
├── nine/
├── no/
├── off/
├── on/
├── one/
├── right/
├── seven/
├── sheila/
├── six/
├── stop/
├── three/
├── tree/
├── two/
├── up/
├── wow/
├── yes/
├── zero/
├── _background_noise_/ # 背景噪声样本
└── _silence_/ # 静音样本(实际由噪声片段裁剪生成)
每个WAV文件的具体参数如下表所示:
| 参数项 | 规格 | 说明 |
|---|---|---|
| 采样率 | 16,000 Hz | 覆盖语音主要频带,满足奈奎斯特采样定理 |
| 位深 | 16-bit PCM | 信噪比约96dB,足够表示环境噪声 |
| 声道数 | 单声道 | 智能音箱多为单麦克风或波束形成后单通道 |
| 时长 | 1秒(±100ms) | 不足1秒的用静音填充,超过的截断 |
| 编码 | WAV(PCM) | 无压缩,便于直接读取和处理 |
值得注意的是,_background_noise_文件夹中存放的是较长的连续噪声录音(如白噪声、粉红噪声、机器噪声等),这些文件不会被直接作为训练样本,而是用于在训练时动态裁剪并叠加到命令词音频上,实现数据增强。这种“噪声叠加”策略是KWS模型提升鲁棒性的关键手段之一。
3.3 类别划分:命令词、未知词与静音
Speech Commands v2共包含35个命令词类别,涵盖日常控制指令(如“yes”“no”“stop”“go”)、数字(“zero”到“nine”)以及一些特定唤醒词(如“marvin”“sheila”)。除了这35个词之外,数据集还定义了两种特殊的非命令类别:
- 未知类(Unknown):从35个命令词之外的词汇中采样,例如“house”“tree”等不在命令词列表中的词。这些样本用于训练模型区分“已知命令”和“无关语音”。在实际部署中,模型需要将非唤醒词全部归类为“未知”,否则会频繁误唤醒。
- 静音类(Silence):从背景噪声片段中裁剪出的纯噪声样本,时长同样为1秒。静音类帮助模型学会在无语音输入时保持待机状态,避免因环境噪声(如空调声、风声)而误触发。
因此,在训练KWS模型时,实际分类任务通常设置为37类(35个命令词 + 1个未知类 + 1个静音类)。但有些应用场景只需要识别少数几个唤醒词(如“小爱同学”),此时可以将35个命令词中的目标词保留,其余命令词全部归入未知类,从而将分类任务缩减为“目标词 + 未知 + 静音”的三分类问题。这种灵活的类别重组方式使得Speech Commands可以适配不同的产品需求。
3.4 训练/验证/测试集划分:说话人隔离原则
数据集的划分方式直接影响模型评估的可信度。Speech Commands官方提供了两个关键文件:validation_list.txt和testing_list.txt,分别列出了应归入验证集和测试集的文件名。划分的核心原则是按说话人隔离,即同一个说话人的所有录音只能出现在训练集、验证集或测试集中的一个,绝不能跨集合出现。
为什么必须按说话人隔离?如果同一个说话人的部分音频出现在训练集,部分出现在测试集,模型在训练时已经“见过”该说话人的嗓音特征,测试时就能轻松识别,导致准确率虚高。这种数据泄漏问题在KWS中尤为严重,因为KWS模型很容易记住说话人的音色而非关键词的语义内容。按说话人隔离后,测试集完全由模型未见过的说话人组成,评估结果才能反映模型在真实用户场景中的泛化能力。
官方划分比例约为:训练集80%、验证集10%、测试集10%。具体操作流程如下:
- 解析所有WAV文件名,提取说话人ID(文件名中的hash部分)。
- 将全部说话人ID随机打乱,按80%/10%/10%的比例分配到训练、验证、测试三个集合。
- 根据说话人ID归属,将对应的所有音频文件放入相应集合。
- 对于未知类和静音类样本,同样遵循说话人隔离原则:如果某个说话人的命令词音频被分到训练集,那么该说话人贡献的未知类样本也应归入训练集。
下表展示了划分后的数据规模(以v2数据集为例):
| 子集 | 说话人数量 | 音频文件数 | 用途 |
|---|---|---|---|
| 训练集 | 约1,740人 | 约84,000条 | 模型参数学习、数据增强 |
| 验证集 | 约220人 | 约10,000条 | 超参数调优、早停判断 |
| 测试集 | 约220人 | 约11,000条 | 最终性能评估、对比实验 |
在工程实践中,除了使用官方划分文件,还可以根据需求自定义划分。例如,如果产品面向特定人群(如儿童),可以在训练集中增加儿童语音样本的比例;如果部署环境噪声较大,可以在训练时动态叠加更多类型的噪声。但无论怎样调整,说话人隔离原则不可动摇。
3.5 案例拆解:基于Speech Commands的唤醒词模型训练流程
假设我们要为一个智能台灯设计唤醒词“小台灯”,但Speech Commands数据集中没有“小台灯”这个词。此时可以采用迁移学习策略:使用Speech Commands预训练一个37分类模型,然后冻结大部分层,仅用少量“小台灯”录音微调最后几层。具体步骤如下:
第一步:数据准备。从Speech Commands v2中选取“yes”“no”“stop”“go”等10个常见命令词作为目标词,其余25个命令词归入未知类,再加上静音类,构建一个12分类任务(10个目标词 + 未知 + 静音)。按照官方划分文件,将数据分为训练、验证、测试三部分。
第二步:特征提取。对每条1秒音频提取MFCC特征,通常使用40维滤波器组,帧长25ms,帧移10ms,得到约98帧的二维特征矩阵(40×98)。也可以使用log-mel频谱图,效果类似但计算稍复杂。
第三步:模型训练。采用一个轻量级CNN模型(如DS-CNN或MobileNetV1),输入为MFCC特征图,输出为12个类别的概率分布。训练时使用交叉熵损失函数,Adam优化器,初始学习率0.001,batch size 128。在验证集上监控准确率,若连续5个epoch不提升则降低学习率。
第四步:微调适配。收集500条“小台灯”的真实录音(由20位不同说话人录制),将预训练模型的输出层替换为3分类(小台灯、未知、静音),冻结前80%的层,仅微调最后几层和输出层。使用较小的学习率(0.0001)训练20个epoch。
第五步:评估与部署。在测试集上评估微调后的模型,重点关注“小台灯”类别的召回率(应大于95%)和未知类的误唤醒率(应小于1次/小时)。将模型转换为TensorFlow Lite格式,部署到智能台灯的MCU上,量化精度从FP32降到INT8,模型大小从2.3MB压缩到约300KB,推理延迟从45ms降低到12ms。
3.6 常见误区与总结复盘
在KWS数据集使用过程中,以下几个误区需要特别警惕:
- 误区一:忽视背景噪声的作用。 有些开发者只使用干净的语音样本训练模型,导致模型在真实环境中频繁误唤醒。正确做法是训练时动态叠加背景噪声(信噪比0~15dB随机),并确保静音类样本包含多种噪声类型。
- 误区二:类别划分不均衡。 如果未知类样本太少,模型会倾向于将所有输入都识别为目标词,导致误唤醒率飙升。建议未知类样本量不少于目标词样本量的2倍。
- 误区三:验证集和测试集混用。 有些开发者反复使用测试集调参,导致测试集信息间接泄漏到模型中。正确做法是只在验证集上调参,测试集仅用于最终评估一次。
- 误区四:忽略音频长度对齐。 Speech Commands的音频是1秒定长,但实际部署时唤醒词可能出现在音频流的任意位置。因此,训练时还需要加入“关键词在中间”和“关键词在开头/结尾”的样本,模拟真实检测场景。