10 触发字检测(Trigger Word Detection)
10 触发字检测(Trigger Word Detection)
这一节在讲什么
这一节讲的是触发字检测,也叫唤醒词检测。
典型例子:
AlexaHey SiriOkay Google小度你好
任务目标不是完整转写整段语音,而是判断:
这一段音频里,什么时候刚刚说完了触发词?
为什么这个任务更简单
和完整语音识别相比,触发字检测只关心一个固定短语。
所以:
- 输出空间小得多
- 数据需求往往也更可控
- 更适合做小型项目和入门练习
输入是什么
先把音频片段转成声谱图特征,再得到时间序列输入:
\[x^{\langle 1 \rangle}, x^{\langle 2 \rangle}, x^{\langle 3 \rangle}, \dots, x^{\langle T_x \rangle}\]然后把这串特征送进 RNN。
输出标签怎么设计
课程里给的是一个很实用的标签方案。
定义每个时间步的标签:
\[y^{\langle t \rangle} \in \{0,1\}\]意思是:
0:当前还没检测到触发字结束1:在这个时间点之后,触发字刚刚被说完
课程里的直觉例子
假设音频中有人说了两次 Alexa:
- 第一次说完后,后面某一小段时间的标签设成 1
- 其他时间大部分设成 0
- 第二次说完后,再把后面一小段标签设成 1
所以标签长得像:
\[0,0,0,0,1,1,1,0,0,0,1,1,1,0,\dots\]这样模型学到的是:
“当我听到某个位置像是刚说完触发词,我就在那个位置附近拉高输出。”
为什么不是只在一个点打 1
如果只在触发词刚结束的那一个瞬间打 1,训练会更难。
因为:
- 正样本太少
- 极度不平衡
- RNN 很难学到稳定信号
所以课程建议:
不只打一个 1,而是在触发词结束后连续打多个 1。
这有两个好处:
- 增加正样本比例
- 让模型更容易学到“触发刚结束”的模式
这个问题的核心难点
课程点出了一个关键问题:类别不平衡。
因为绝大多数时间,用户都没有在说唤醒词,所以:
\[\#0 \gg \#1\]也就是 0 的数量远远多于 1。
这会导致模型很容易“全预测 0”,表面上准确率还很高,但实际上没用。
所以通过让 1 持续多个时间步,是一种简单但有效的缓解办法。
小白怎么理解整个系统
你可以把它理解成一个“滑动监听器”:
- 它一直在听声音
- 每个时间点都输出一个分数
- 如果某个位置像是“刚刚说完 Alexa”,输出就抬高
这一节最该记住的公式和记号
输入特征序列
\[x^{\langle 1 \rangle}, x^{\langle 2 \rangle}, \dots, x^{\langle T_x \rangle}\]时间步标签
\[y^{\langle t \rangle} \in \{0,1\}\]类别不平衡直觉
\[\#0 \gg \#1\]这一节最该记住的要点
要点 1:触发字检测只关心固定关键词
不是完整语音转文本。
要点 2:输入仍然是音频时间序列特征
通常来自声谱图。
要点 3:输出是逐时间步二分类
每个时刻判断是否“刚说完触发字”。
要点 4:触发后连续标多个 1 更容易训练
这是课程里很实用的工程技巧。
要点 5:最大的实际问题是类别不平衡
正例太少,不能只看表面准确率。
这一节一句话总结
触发字检测可以建模成一个逐时间步的二分类问题:把音频特征送进 RNN,在触发词刚结束后的短时间窗口内输出多个 1,从而让模型学会稳定地发现唤醒词。
本文由作者按照 CC BY 4.0 进行授权