要理解将语音向量通过 K-means 算法进行聚类并生成语义 tokens 的过程,我们可以一步步地展开并举例说明。
1. 输入的语音向量
- 输入的语音信号(如
.wav
文件)经过 WavLM 模型的处理,得到的是每个时间帧的特征向量(如[100, 768]
,表示 100 个时间帧,每个帧 768 维的特征向量)。 - 这些特征向量可能会包含语音的各种信息,包括语义、音调、音色等。
2. 均值归一化
- 在聚类之前,通常会对这些语音向量进行均值归一化。这一步的主要目的是消除说话者的个体差异,从而更专注于语音中的语义信息。
- 均值归一化过程:
- 对每个时间帧的向量进行归一化。例如,如果我们有一个形状为
[100, 768]
的矩阵,那么均值归一化后,每个时间帧的特征向量依然是 768 维的,但它们的值会被重新缩放,以使得整个序列的均值为零。 - 归一化公式:假设
vec_i
是第i
个时间帧的特征向量,均值归一化后的特征向量vec'_i
可以表示为: veci′=veci−μσvec'_i = \frac{vec_i - \mu}{\sigma}veci′=σveci−μ 其中,μ
是所有向量的均值,σ
是标准差。
- 对每个时间帧的向量进行归一化。例如,如果我们有一个形状为
3. K-means 聚类
-
聚类的目标是将这些经过归一化的特征向量(如
vec'_i
)划分成K
个不同的类别,每个类别代表一个聚类中心(即 token)。 -
K-means 聚类过程:
- 初始化:选择
K
个初始聚类中心(可以随机选择)。 - 分配:将每个特征向量
vec'_i
分配给最近的聚类中心,形成K
个簇。 - 更新:计算每个簇的均值,并将该均值作为新的聚类中心。
- 迭代:重复分配和更新步骤,直到聚类中心不再变化,或者变化非常小。
- 初始化:选择
-
例如,如果你有 100 个经过归一化的向量(每个向量 768 维),并且你选择了
K=10
,那么最终你将得到 10 个聚类中心,每个中心表示一个 token。
4. 生成语义 tokens
- 聚类完成后,每个时间帧的向量
vec'_i
都会被分配到一个特定的聚类中心。这个聚类中心就是一个语义 token。 - 生成语义 tokens 的过程:
- 对于每个时间帧的向量
vec'_i
,找到最近的聚类中心,假设这个中心是z_j
,那么z_j
就是这个时间帧对应的语义 token。 - 重复上述过程,将每个时间帧的向量转换成对应的语义 token,最终得到一串语义 tokens 序列
tok = {z_i}_1^N
。
- 对于每个时间帧的向量
5. 举例说明
- 输入:假设你有一个音频文件,经过 WavLM 提取后得到 100 个时间帧,每个帧的向量为 768 维。
- 均值归一化:对这 100 个向量进行均值归一化,确保消除说话者相关的信息。
- K-means 聚类:将这些均值归一化后的向量分为 10 个聚类中心,得到 10 个不同的类别,每个类别代表一个语义 token。
- 生成 tokens:每个时间帧对应一个语义 token,最终你得到一个长度为 100 的语义 token 序列。
6. 结果示例
- 如果某个特征向量
vec'_5
被分配到第 3 个聚类中心z_3
,那么在第 5 个时间帧上,语义 token 就是z_3
。 - 整体结果就是一个语义 token 序列,如
tok = {z_1, z_3, z_3, z_7, ...}
。
这种聚类方式能够有效地压缩语音中的信息,将复杂的语音信号简化为一串语义 tokens,方便后续处理和模型推理。