3、关键词数据集:公开数据集(如Speech Commands)介绍、数据格式、类别划分、训练/验证/测试集划分

关键词识别(Keyword Spotting, KWS)是智能音箱从“待机”状态切换到“交互”状态的第一道闸门。模型能否在嘈杂客厅、远场环境和多说话人场景下准确唤醒,很大程度上取决于训练所用的数据集质量与划分策略。本章围绕业界最常用的开源数据集——Google Speech Commands,系统讲解其数据格式、类别体系、划分原则,并给出可落地的工程实践建议。

Speech Commands 数据集结构与划分策略 Speech Commands v2: 105,829 条音频 数据格式 WAV / 16kHz / 16bit 单声道 / 1秒定长 类别划分 35 个命令词 + 未知类 + 静音类(共 37 类) KWS 模型 训练输入 训练 / 验证 / 测试集划分(按说话人隔离) 训练集(Train) 约 80% 说话人 约 84,000 条音频 用于模型参数学习 验证集(Validation) 约 10% 说话人 约 10,000 条音频 用于超参调优与早停 测试集(Test) 约 10% 说话人 约 11,000 条音频 最终性能评估 关键原则:同一说话人的所有音频只能出现在一个子集中,避免说话人泄漏 官方划分文件:validation_list.txt / testing_list.txt

3.1 核心原理:为什么数据集决定KWS模型的上限

关键词识别本质上是一个小词汇量的音频分类任务,但其难点在于环境鲁棒性和说话人泛化能力。与普通语音识别不同,KWS模型通常运行在低功耗DSP或嵌入式芯片上,计算资源有限,因此不能依赖大模型强行拟合数据。数据集的规模、覆盖度和划分方式直接决定了模型能否学到“关键词的声学共性”而非“特定说话人的嗓音特征”。

Speech Commands数据集由Google于2017年首次发布,2018年推出v2版本,是目前学术界和工业界最广泛使用的KWS基准数据集。其设计初衷正是为了模拟智能音箱的真实使用场景:用户可能在1米或3米外说话,背景可能有电视声、厨房噪声、其他人交谈等。因此,数据集中不仅包含清晰的命令词录音,还包含大量带有背景噪声的样本,以及纯噪声片段作为“静音类”训练数据。

从信号处理角度看,每条音频都是1秒长的16kHz单声道WAV文件。16kHz采样率覆盖了语音的主要频带(4kHz以下),足以提取MFCC特征;1秒定长则保证了输入维度的一致性,方便模型批量处理。每个命令词由上千位不同说话人录制,每位说话人重复录制多次,这为训练说话人无关的模型提供了基础。

为什么不用完整语音识别数据集? 完整语音识别(ASR)数据集如LibriSpeech、Common Voice包含长句和复杂语法,而KWS只需要识别“Hey Siri”“小爱同学”等固定短语。使用ASR数据集训练KWS模型会导致计算浪费,且长句中的静音段和连读现象会干扰关键词边界检测。Speech Commands专门为KWS设计,每条音频恰好包含一个关键词或一个负样本,极大简化了数据预处理流程。

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可以适配不同的产品需求。

类别不平衡处理: 在原始数据集中,每个命令词的样本量大致均衡(约2,300~2,500条),但未知类和静音类的样本量需要人为控制。通常做法是:从35个命令词中随机抽取一部分作为未知类(例如抽取10个词的全部样本),再从背景噪声中随机裁剪等量的静音样本。这样保证每个类别的样本量在同一数量级,避免模型偏向样本量大的类别。

3.4 训练/验证/测试集划分:说话人隔离原则

数据集的划分方式直接影响模型评估的可信度。Speech Commands官方提供了两个关键文件:validation_list.txt和testing_list.txt,分别列出了应归入验证集和测试集的文件名。划分的核心原则是按说话人隔离,即同一个说话人的所有录音只能出现在训练集、验证集或测试集中的一个,绝不能跨集合出现。

为什么必须按说话人隔离?如果同一个说话人的部分音频出现在训练集,部分出现在测试集,模型在训练时已经“见过”该说话人的嗓音特征,测试时就能轻松识别,导致准确率虚高。这种数据泄漏问题在KWS中尤为严重,因为KWS模型很容易记住说话人的音色而非关键词的语义内容。按说话人隔离后,测试集完全由模型未见过的说话人组成,评估结果才能反映模型在真实用户场景中的泛化能力。

官方划分比例约为:训练集80%、验证集10%、测试集10%。具体操作流程如下:

  1. 解析所有WAV文件名,提取说话人ID(文件名中的hash部分)。
  2. 将全部说话人ID随机打乱,按80%/10%/10%的比例分配到训练、验证、测试三个集合。
  3. 根据说话人ID归属,将对应的所有音频文件放入相应集合。
  4. 对于未知类和静音类样本,同样遵循说话人隔离原则:如果某个说话人的命令词音频被分到训练集,那么该说话人贡献的未知类样本也应归入训练集。

下表展示了划分后的数据规模(以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秒定长,但实际部署时唤醒词可能出现在音频流的任意位置。因此,训练时还需要加入“关键词在中间”和“关键词在开头/结尾”的样本,模拟真实检测场景。