4. 唤醒词数据集构建:数据采集方案与标注规范

数据集构建这件事,说白了就是给模型喂饭。喂什么饭,它就长什么样。我在做第一个唤醒词项目时,天真地以为只要找几个人的录音就能搞定,结果模型在实验室跑得挺好,一到用户手里就各种翻车。后来我才明白——数据集的质量,直接决定了唤醒词产品的天花板。

这一章,我们就把数据集构建的完整流程拆开来看。从数据怎么来、怎么标、怎么分,到每个环节的坑和技巧,我都会结合自己的实战经验跟你聊透。

4.1 数据采集方案

数据采集,核心就三个来源:公开数据集、自采数据、数据增强。我一般建议按 1:3:6 的比例来配——10% 公开数据做基线,30% 自采数据保质量,60% 增强数据提鲁棒性。

4.1.1 公开数据集

公开数据集的好处是省事,但坏处也很明显——跟你的场景往往不匹配。我常用的几个公开数据集:

数据集名称 语言 采样率 适用场景
Common Voice 多语种(含中文) 16kHz / 48kHz 通用语音识别基线
LibriSpeech 英文 16kHz 英文唤醒词预训练
AISHELL-1 / 2 中文普通话 16kHz 中文唤醒词基础训练
THCHS-30 中文普通话 16kHz 中文语音识别补充
我的习惯:公开数据集只用来做预训练或冷启动。真正上线用的模型,必须用自采数据微调。否则你想想看,用户家里的环境噪声、口音差异、麦克风位置,公开数据根本覆盖不了。

4.1.2 自采数据

自采数据才是唤醒词项目的核心资产。我经历过一个项目,客户要求唤醒词是「小智小智」,结果我们找了 50 个人在录音棚里录,效果很好。但上线后用户反馈——「在厨房喊小智小智,它不理我」。为什么?因为录音棚太干净了。

自采数据,我建议覆盖以下几个维度:

  • 设备多样性:手机、平板、智能音箱、车载麦克风,每种设备的频响曲线都不一样
  • 环境多样性:安静房间、厨房(油烟机噪声)、马路(车流声)、办公室(人声背景)
  • 距离多样性:0.5m、1m、2m、3m,远场唤醒是最大的坑
  • 说话人多样性:男女老少、不同方言口音,至少 100 人以上
  • 情绪多样性:正常语气、急促语气、轻声说、大声喊
我曾经踩过的坑:有一次自采数据只用了 30 个人,结果模型对其中一个人的声音特别敏感,其他人喊破嗓子都不醒。后来分析发现,那 30 个人的声学特征太接近了。所以自采数据,说话人数量一定要够,至少 100 人起步。

4.1.3 数据增强

数据增强,说白了就是「无中生有」。用已有的数据,通过变换生成更多样本来提升模型的泛化能力。我常用的增强手段:

  1. 加噪:叠加白噪声、粉红噪声、环境噪声(厨房、马路、空调等),信噪比控制在 5dB~20dB 之间
  2. 混响:模拟不同房间的混响效果,用 RIR(房间冲激响应)卷积实现
  3. 变速:改变语速,0.8x~1.2x 之间随机
  4. 变调:改变音高,±2 个半音以内
  5. 音量扰动:随机调整音量,模拟不同说话距离
  6. 频段裁剪:随机丢弃某些频段,模拟麦克风频响差异

这里有个关键点——增强不是越多越好。我见过有人把数据增强到原始数据的 100 倍,结果模型反而变差了。为什么?因为过度增强会让模型学到「噪声模式」而不是「语音模式」。

我的经验值:数据增强的倍数控制在 5~10 倍比较合适。而且增强后的数据要跟原始数据混合使用,不要全部用增强数据替代原始数据。

4.2 标注规范

标注这件事,很多人觉得简单——不就是标一下是不是唤醒词吗?但实际做起来,你会发现边界情况特别多。我把它分成三类:正样本、负样本、模糊样本。

4.2.1 正样本

正样本就是用户说出完整唤醒词的音频。但「完整」这个词,其实有讲究。

  • 完整唤醒词:比如「小智小智」,四个字必须完整,不能缺字
  • 带前后缀的唤醒词:比如「嗯小智小智」、「小智小智啊」,前后缀不能太长(一般不超过 0.5 秒)
  • 重复唤醒词:比如「小智小智小智」,只取第一次出现的完整唤醒词
标注细节:正样本的起始点和结束点要精确标注。我习惯用 Praat 或 Audacity 手动切分,精度控制在 10ms 以内。起始点从第一个字的声母开始,结束点到最后一个字的韵母结束。

4.2.2 负样本

负样本就是非唤醒词的音频。这部分数据量要足够大,否则模型会「乱认亲戚」。

负样本的来源:

  • 非唤醒词语音:日常对话、其他唤醒词(比如「小爱同学」、「嘿 Siri」)
  • 环境噪声:纯噪声、音乐、电视声、动物叫声
  • 唤醒词片段:只说了「小智」两个字,或者「小智小」三个字
  • 相似发音词:跟唤醒词发音相近的词,比如「小只小只」、「小纸小纸」
我曾经翻车的一次:负样本里没有包含「小智小」这种片段,结果模型在用户只说「小智」两个字时就误唤醒。后来我专门收集了各种唤醒词片段做负样本,误唤醒率才降下来。

4.2.3 模糊样本

模糊样本是标注中最头疼的部分。它既不像正样本那么清晰,也不像负样本那么明确。我一般这样处理:

模糊类型 示例 标注建议
发音不标准 「小智小智」说成「小几小几」 如果发音偏差在可接受范围内,标为正样本;否则标为负样本
背景噪声干扰 唤醒词被噪声部分掩盖 如果人耳能听清唤醒词,标为正样本;否则标为负样本
语速过快/过慢 唤醒词被说得很快或很慢 如果语速在 0.7x~1.5x 范围内,标为正样本;超出范围标为负样本
多人同时说话 两个人同时说唤醒词 如果唤醒词清晰可辨,标为正样本;否则标为负样本
我的做法:模糊样本单独建一个文件夹,不直接参与训练。等模型训练完成后,用模糊样本做验证,看模型能不能正确处理。如果模型对模糊样本的识别率低于 80%,说明标注标准需要调整。

4.3 数据集划分策略

数据集划分,我见过很多人直接 8:1:1 随机切分。但唤醒词任务有个特殊性——正样本数量远少于负样本。如果不做特殊处理,训练集里可能全是负样本,模型学不到东西。

我推荐的划分策略:

  1. 按说话人划分:保证训练集、验证集、测试集的说话人不重叠。否则模型可能只是记住了某个人的声音,而不是学会了唤醒词本身
  2. 按环境划分:训练集包含多种环境,验证集和测试集各包含一种独立环境。这样可以检验模型的环境泛化能力
  3. 正负样本比例控制:训练集中正样本占比 10%~20%,验证集和测试集中正样本占比 5%~10%。太高的正样本比例会让模型过于敏感
  4. 分层采样:先按说话人分层,再按环境分层,最后随机采样。保证每个子集都有代表性

下面这张图,是我做唤醒词项目时常用的数据集构建流程:

唤醒词数据集构建流程 数据采集 公开数据集 自采数据 数据增强 数据标注 正样本 负样本 模糊样本 数据集划分 训练集 (70%) 验证集 (15%) 测试集 (15%) 关键原则: 1. 按说话人划分,不重叠 | 2. 按环境分层采样 | 3. 正样本占比 10%~20% | 4. 模糊样本单独验证

最后说一个细节——数据集划分完成后,一定要做一次「交叉验证」。我习惯把训练集再分成 5 份,做 5 折交叉验证。如果某一份的验证结果明显低于其他份,说明数据分布有问题,需要重新检查标注或划分策略。

一个小技巧:数据集构建完成后,用 t-SNE 或 PCA 做一次可视化。如果正样本和负样本在特征空间里完全混在一起,说明数据质量有问题,需要重新审视采集和标注流程。