- https://github.com/SpeechColab/GigaSpeech2/tree/main/pipeline/force_alignment
- https://github.com/MahmoudAshraf97/ctc-forced-aligner/
- https://github.com/facebookresearch/fairseq/tree/main/examples/mms/data_prep
- https://pytorch.ac.cn/audio/stable/tutorials/ctc_forced_alignment_api_tutorial.html
CTC算法
CTC算法的关键在于使用一个特殊的标记,通常称为空白标记(blank token)。这是一个我们人为加入词汇表的额外标记。在这个例子中,空白标记被表示为_
。我们用这个特殊的标记来表示字母组之间的硬边界。
CTC模型的完整输出类似于如下的序列:Copied
B_R_II_O_N_||_S_AWW_|||||_S_OMEE_TH_ING_||_C_L_O_S_E||TO|_P_A_N_I_C_||_ON||HHI_S||_OP_P_O_N_EN_T_'SS||_F_AA_C_E||_W_H_EN||THE||M_A_NN_||||_F_I_N_AL_LL_Y||||_RREE_C_O_GG_NN_II_Z_ED|||HHISS|||_ER_RRR_ORR||||
该序列中的|
标记是单词分隔符。在这个例子中,我们使用|
而不是空格作为单词分隔符,这样可以更容易地看出单词的分隔位置,但它们的作用是一样的。
CTC空白标记使我们能够过滤掉重复的字母。例如预测序列中的最后一个单词,_ER_RRR_ORR
。如果没有CTC空白标记,这个单词看起来是这样的:Copied
ERRRRORR
如果我们简单地去掉非CTC结果中的重复字符,那么它就变成了EROR
。显然这不是正确的拼写。但是有了CTC空白标记,我们就可以在每个字母组中去掉重复的字母:Copied
_ER_RRR_ORR
变为:Copied
_ER_R_OR
最后我们去掉空白标记_
,得到最终的单词:Copied
ERROR
如果我们将这种逻辑应用到整个文本,包括|
,并将剩余的|
字符替换为空格,那么最终的CTC解码输出会变成:Copied
BRION SAW SOMETHING CLOSE TO PANIC ON HIS OPPONENT'S FACE WHEN THE MAN FINALLY RECOGNIZED HIS ERROR
总结一下,CTC模型对应每20毫秒的输入音频(包括部分重叠)会生成一个预测标记。这样的预测规则会生成很多重复的字母。利用CTC空白标记,我们可以轻松地移除这些重复的字母,而不会破坏单词的正确拼写。这是一种非常简单和方便的方法,可以解决输出文本与输入音频的对齐问题。💡 在实际的Wav2Vec2模型中,CTC空白标记与填充标记“是相同的。模型会预测很多这样的“标记,例如当当前20毫秒的音频没有明确的字符可以预测时。使用相同的标记作为填充和CTC空白标记可以简化解码算法,并有助于保持词汇表的小规模。
我们可以在Transomer编码模型简单地加入CTC:将编码器的输出序列进入一个线性层,该线性层将音频特征映射到词汇表。模型使用特殊的CTC损失进行训练。
CTC的一个缺点在于,它可能会输出听起来正确但拼写不正确的单词。毕竟,CTC分类头只考虑了单个字符,而没有处理整个单词。我们可以使用额外的语言模型来提高音频的转录质量。这个语言模型实际上是作为了CTC输出的拼写检查器。
CTC(Connectionist Temporal Classification)强制对齐是一种将音频与已知文本精确对齐的技术,广泛应用于自动字幕生成、语音切分、语音合成等领域。其核心原理结合了声学模型的输出和动态规划算法(如 Viterbi 算法)来实现字级别的时间戳对齐。
核心原理
1. 输入数据
- log_probs:模型输出的对数概率张量,形状为
(B, T, C)
,其中:B
:批次大小(当前仅支持B=1
);T
:时间帧数;C
:字符集大小(包括 blank 符号)。
- targets:目标文本的索引序列,形状为
(B, L)
,其中L
为目标序列长度。 - input_lengths(可选):输入序列的实际长度。
- target_lengths(可选):目标序列的实际长度。
- blank:blank 符号的索引,默认值为
0
。
2. 对齐过程
forced_align
函数通过动态规划算法(如 Viterbi)在所有可能的对齐路径中寻找概率最高的路径。该算法通过填充一个大小为 (S, T)
的矩阵(其中 S
是目标序列长度,T
是时间帧数),并记录每个状态的最优前驱,以便在填充完成后回溯得到最优路径。
3. 输出结果
- alignment:每个时间步对应的标签索引,形状为
(T,)
。 - scores:每个时间步对应标签的对数概率,形状为
(T,)
。
通过这些输出,可以确定每个字符在音频中的时间位置,实现字级别的对齐。
🔧 实际应用
为了简化强制对齐的流程,torchaudio 提供了高级 API torchaudio.pipelines.Wav2Vec2FABundle
,该 API 集成了预训练的 Wav2Vec2 模型和 forced_align
函数,用户只需提供音频和对应的文本,即可获取每个词或字符的时间戳。该工具支持多语言对齐,适用于各种语音处理任务。