文章

10 触发字检测(Trigger Word Detection)

10 触发字检测(Trigger Word Detection)

这一节在讲什么

  这一节讲的是触发字检测,也叫唤醒词检测。

  典型例子:

  • Alexa
  • Hey Siri
  • Okay 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。

  这有两个好处:

  1. 增加正样本比例
  2. 让模型更容易学到“触发刚结束”的模式

这个问题的核心难点

  课程点出了一个关键问题:类别不平衡。

  因为绝大多数时间,用户都没有在说唤醒词,所以:

\[\#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 进行授权