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 人以上
- 情绪多样性:正常语气、急促语气、轻声说、大声喊
4.1.3 数据增强
数据增强,说白了就是「无中生有」。用已有的数据,通过变换生成更多样本来提升模型的泛化能力。我常用的增强手段:
- 加噪:叠加白噪声、粉红噪声、环境噪声(厨房、马路、空调等),信噪比控制在 5dB~20dB 之间
- 混响:模拟不同房间的混响效果,用 RIR(房间冲激响应)卷积实现
- 变速:改变语速,0.8x~1.2x 之间随机
- 变调:改变音高,±2 个半音以内
- 音量扰动:随机调整音量,模拟不同说话距离
- 频段裁剪:随机丢弃某些频段,模拟麦克风频响差异
这里有个关键点——增强不是越多越好。我见过有人把数据增强到原始数据的 100 倍,结果模型反而变差了。为什么?因为过度增强会让模型学到「噪声模式」而不是「语音模式」。
4.2 标注规范
标注这件事,很多人觉得简单——不就是标一下是不是唤醒词吗?但实际做起来,你会发现边界情况特别多。我把它分成三类:正样本、负样本、模糊样本。
4.2.1 正样本
正样本就是用户说出完整唤醒词的音频。但「完整」这个词,其实有讲究。
- 完整唤醒词:比如「小智小智」,四个字必须完整,不能缺字
- 带前后缀的唤醒词:比如「嗯小智小智」、「小智小智啊」,前后缀不能太长(一般不超过 0.5 秒)
- 重复唤醒词:比如「小智小智小智」,只取第一次出现的完整唤醒词
4.2.2 负样本
负样本就是非唤醒词的音频。这部分数据量要足够大,否则模型会「乱认亲戚」。
负样本的来源:
- 非唤醒词语音:日常对话、其他唤醒词(比如「小爱同学」、「嘿 Siri」)
- 环境噪声:纯噪声、音乐、电视声、动物叫声
- 唤醒词片段:只说了「小智」两个字,或者「小智小」三个字
- 相似发音词:跟唤醒词发音相近的词,比如「小只小只」、「小纸小纸」
4.2.3 模糊样本
模糊样本是标注中最头疼的部分。它既不像正样本那么清晰,也不像负样本那么明确。我一般这样处理:
| 模糊类型 | 示例 | 标注建议 |
|---|---|---|
| 发音不标准 | 「小智小智」说成「小几小几」 | 如果发音偏差在可接受范围内,标为正样本;否则标为负样本 |
| 背景噪声干扰 | 唤醒词被噪声部分掩盖 | 如果人耳能听清唤醒词,标为正样本;否则标为负样本 |
| 语速过快/过慢 | 唤醒词被说得很快或很慢 | 如果语速在 0.7x~1.5x 范围内,标为正样本;超出范围标为负样本 |
| 多人同时说话 | 两个人同时说唤醒词 | 如果唤醒词清晰可辨,标为正样本;否则标为负样本 |
4.3 数据集划分策略
数据集划分,我见过很多人直接 8:1:1 随机切分。但唤醒词任务有个特殊性——正样本数量远少于负样本。如果不做特殊处理,训练集里可能全是负样本,模型学不到东西。
我推荐的划分策略:
- 按说话人划分:保证训练集、验证集、测试集的说话人不重叠。否则模型可能只是记住了某个人的声音,而不是学会了唤醒词本身
- 按环境划分:训练集包含多种环境,验证集和测试集各包含一种独立环境。这样可以检验模型的环境泛化能力
- 正负样本比例控制:训练集中正样本占比 10%~20%,验证集和测试集中正样本占比 5%~10%。太高的正样本比例会让模型过于敏感
- 分层采样:先按说话人分层,再按环境分层,最后随机采样。保证每个子集都有代表性
下面这张图,是我做唤醒词项目时常用的数据集构建流程:
最后说一个细节——数据集划分完成后,一定要做一次「交叉验证」。我习惯把训练集再分成 5 份,做 5 折交叉验证。如果某一份的验证结果明显低于其他份,说明数据分布有问题,需要重新检查标注或划分策略。