SyncNet-研究论文-清晰解释

SyncNet 研究论文,清晰解释

原文:https://towardsdatascience.com/syncnet-paper-easily-explained/

简介

你是否曾经看过一个配音糟糕的电影,其中嘴唇的动作与台词不匹配?或者是否在视频通话中遇到过有人说话时嘴巴的动作与声音不同步的情况?这些同步问题不仅仅是令人烦恼,它们在视频制作、广播和实时通信中也是一个真正的问题。Syncnet 论文直面这个问题,采用了一种巧妙的自监督方法,可以自动检测和修复音频-视频同步问题,而无需任何手动标注。特别酷的是,同一个模型不仅可以修复同步问题,还可以在嘈杂的房间里识别出说话者——这一切都是通过学习嘴唇动作和语音声音之间的自然相关性来实现的。

核心应用

训练好的卷积神经网络(ConvNet)的输出可以执行下游任务,这些任务具有至关重要的应用,包括确定视频中的唇同步错误、检测场景中多个面孔的说话者以及唇读。开发唇同步错误应用,如果同步偏移在-1 到+1 秒的范围内(这个范围可以变化,但通常对于电视广播音频-视频来说已经足够)——也就是说,视频滞后音频或反之,在-1 到+1 秒内——我们可以确定偏移量的大小。例如,如果结果是 200 毫秒音频滞后视频,这意味着视频比音频提前 200 毫秒,在这种情况下,我们可以将音频向前移动 200 毫秒,通过这种方式可以将偏移同步问题接近于 0,因此它也有使音频-视频同步的应用(如果偏移位于我们这里所采取的-1 到+1 秒范围内)。

自监督训练方法

训练方法是自监督的,这意味着不需要人工标注或手动标记;训练模型的正负对发生时无需手动标记。这种方法假设我们得到的数据已经同步(音频-视频同步),因此我们得到的是已经同步的正对,我们通过将音频移动±几秒来制造不匹配的假对(用于训练网络的假对)。优点是,如果我们得到的数据已经同步且在源中没有同步问题,那么我们可以几乎有无穷多的数据来训练,这样就可以轻松地为训练制作正负对。

网络架构:双流 CNN

在谈到架构时,它包含 2 个流:音频流和视频流,或者用通俗的话说,架构被分为 2 个分支——一个用于音频,一个用于视频。两个流都期望 0.2 秒的输入。音频流期望 0.2 秒的音频,视频流期望 0.2 秒的视频。音频和视频流的网络架构都是基于卷积神经网络(CNN),它们期望 2D 数据。对于视频(帧/图像),CNN 看起来很自然,但对于音频,也训练了一个基于 CNN 的网络。对于视频和相应的音频,首先进行各自的数据预处理,然后输入到各自的 CNN 架构中。

音频数据处理

音频数据处理——原始的 0.2 秒音频经过一系列步骤,得到一个 13 x 20 的 MFCC 矩阵。13 是与此音频块相关的 DCT 系数,代表该音频的特征,而 20 是时间方向上的,因为 MFCC 频率是 100 Hz,所以对于 0.2 秒,将有 20 个样本,每个样本的 DCT 系数由 13 x 20 矩阵的一列表示。13 x 20 的矩阵输入到 CNN 音频流。网络的输出是一个 256 维的嵌入,代表 0.2 秒的音频。

视频数据处理

视频预处理——这里的 CNN 期望输入为 111×111×5(W×H×T),5 帧(h,w)=(111,111)的灰度图像,代表嘴巴。对于 25 fps,0.2 秒转换为 5 帧。0.2 秒的原始视频以 25 fps 进行视频预处理,并转换为 111x111x5,然后输入到 CNN 网络中。网络的输出是一个 256 维的嵌入,代表 0.2 秒的视频。

音频预处理比视频简单且复杂度低。让我们了解如何从原始源中选择 0.2 秒的视频及其相应的音频。我们的目标是获取一个只有 1 个人且在 0.2 秒内没有场景变化的视频剪辑,一个人在 0.2 秒的持续时间内在说话。任何其他情况对于我们当前阶段的模型来说都是坏数据。因此,我们在视频上运行视频数据预处理,其中我们进行场景检测,然后是面部检测,然后是面部跟踪,裁剪嘴巴部分,并将视频的所有帧/图像转换为 111×111 的灰度图像,然后提供给 CNN 模型,相应的音频部分被转换为 13×20 矩阵,然后提供给音频 CNN。面部数量大于 1 的剪辑被拒绝;由于我们在管道中应用了场景检测,0.2 秒的剪辑中没有场景变化。所以我们最后得到的是一个有音频且视频中只有一个人的视频,这满足了数据管道的基本需求。

联合嵌入空间学习

网络学习一个联合嵌入空间,这意味着音频嵌入和视频嵌入将被绘制在共同的嵌入空间中。同步的音频和视频嵌入将彼此靠近,而在嵌入空间中不同步的音频和视频嵌入将彼此远离,就是这样。同步的音频和视频嵌入之间的欧几里得距离将更小,反之亦然。

损失函数和训练细化

使用的损失函数是对比损失。对于一个正对(同步音频-视频 0.2 秒示例),音频和视频嵌入之间的欧几里得距离的平方应该是最小的;如果这个值很高,将会施加惩罚,因此对于正对,欧几里得距离的平方被最小化,而对于负对,最小化 max(margin – Euclidean distance, 0)²。

我们通过移除数据中的假阳性来细化训练数据。我们的数据仍然包含假阳性(噪声数据),我们通过最初在噪声数据上训练 syncnet 并移除那些未能通过一定阈值的正对(标记为同步音频-视频正对)来移除假阳性。噪声数据(假阳性)可能是因为配音视频、有人在扬声器后面说话、可能存在不同步,或者这些类型的事情在细化步骤中被过滤掉。

推理和应用

现在,网络已经完成训练,让我们来谈谈从训练模型中得出的推理和实验结果。

测试数据中存在音频-视频的正负对,因此我们的模型推理应该对测试数据中的正对给出低值(最小欧几里得距离),对测试数据中的负对给出高值(最大欧几里得距离)。这是我们模型的一种实验或推理结果。

确定偏移量也是一种实验,或者说,我们可以将其视为我们训练模型推理的一种应用。输出将是偏移量,例如,音频提前 200 毫秒或视频提前 170 毫秒——确定视频或音频延迟的同步偏移值。这意味着调整模型确定的偏移量应该可以解决同步问题,并使剪辑从不同步状态变为同步。

如果通过调整音频-视频的偏移值来修复同步问题,则表示成功;否则,模型失败(假设在计算固定视频(0.2 秒)和不同音频块(每个 0.2 秒,滑动在某个-x 到+x 秒范围内,x = 1 秒)之间的欧几里得距离范围内存在同步音频)。这个源剪辑的同步偏移可以通过计算源剪辑中单个 0.2 秒视频的同步偏移值来确定,或者可以通过对源剪辑中的几个 0.2 秒样本进行平均来确定,然后给出平均偏移同步值。后者比前者更稳定,这也得到了测试数据基准的证明,即取平均是更稳定和更好的方法来表示同步偏移值。

与这个偏移数值相关的置信度分数由模型给出,这被称为 AV 同步置信度分数。例如,可以说源剪辑有一个偏移,音频领先视频 300 毫秒,置信度分数为 11。因此,了解这个置信度分数是如何计算的很重要,让我们用一个例子来了解它。

实际示例:偏移量和置信度分数计算

假设我们有一个 10 秒的源剪辑,并且我们知道这个源剪辑有一个同步偏移,其中音频领先视频 300 毫秒。现在我们将看到我们的 syncnet 是如何用来确定这个偏移的。

我们将取十个 0.2 秒的视频作为 v1, v2, v3…….. v10。

让我们了解同步分数和置信度分数是如何为 v5 计算的,类似的情况也会发生在所有 10 个视频箱/样本/块上。

源剪辑:总共 10 秒

v1:0.3-0.5 秒    [–]

v2: 1.2-1.4 秒        [–]

v3: 2.0-2.2 秒            [–]

v4:3.1-3.3 秒                [–]

v5:4.5-4.7 秒                    [–]

v6:5.3-5.5 秒                        [–]

v7:6.6-6.8 秒                            [–]

v8:7.4-7.6 秒                                [–]

v9:8.2-8.4 秒                                    [–]

v10:9.0-9.2 秒                                       [–]

让我们以 0.2 秒持续时间的 v5 作为一个固定的视频。现在,使用我们训练好的 syncnet 模型,我们将计算几个音频块(将使用滑动窗口方法)与这个固定视频块之间的欧几里得距离。以下是方法:

v5 的音频采样将从 3.5 秒到 5.7 秒(±1 秒的 v5),这给我们提供了一个 2200 毫秒(2.2 秒)的搜索范围。

带重叠窗口:

  • 窗口大小:200 毫秒(0.2 秒)

  • 跳长:100 毫秒

  • 窗口数量:21

窗口 1:3500-3700 毫秒 → 距离 = 14.2

窗口 2:3600-3800 毫秒 → 距离 = 13.8

窗口 3:3700-3900 毫秒 → 距离 = 13.1

………………..

窗口 8:4200-4400 毫秒 → 距离 = 2.8  ← 最小值(音频提前 300 毫秒)

窗口 9:4300-4500 毫秒 → 距离 = 5.1

………………..

窗口 20:5400-5600 毫秒 → 距离 = 14.5

窗口 21:5500-5700 毫秒 → 距离 = 14.9

v5 的同步偏移 = -300 毫秒(音频领先视频 300 毫秒)Confidence_v5 = 中位数(~12.5) - 最小值(2.8) = 9.7

因此,v5 在 300ms 偏移量下的置信度分数为 9.7,这就是 syncnet 给出的置信度分数的计算方式,等于固定 v5 的所有窗口或音频分箱的中位数减去最小值。

类似地,每个视频分箱都有一个偏移值和相关的置信度分数。

v1 (0.3-0.5s): 偏移 = -290ms,置信度 = 8.5

v2 (1.2-1.4s): 偏移 = -315ms,置信度 = 9.2

v3 (2.0-2.2s): 偏移 = 0ms,  置信度 = 0.8  (静默期)

v4 (3.1-3.3s): 偏移 = -305ms,置信度 = 7.9

v5 (4.5-4.7s): 偏移 = -300ms,置信度 = 9.7

v6 (5.3-5.5s): 偏移 = -320ms,置信度 = 8.8

v7 (6.6-6.8s): 偏移 = -335ms,置信度 = 10.1

v8 (7.4-7.6s): 偏移 = -310ms,置信度 = 9.4

v9 (8.2-8.4s): 偏移 = -325ms,置信度 = 8.6

v10 (9.0-9.2s): 偏移 = -295ms,置信度 = 9.0

平均值(忽略低置信度 v3):(-290 – 315 – 305 – 300 – 320 – 335 – 310 – 325 – 295) / 9 = -305ms

或者,如果包括所有 10 个样本并基于置信度进行加权平均:最终偏移 ≈ -300ms(音频领先视频 300ms)→ 这就是计算源剪辑偏移量的方式。

重要提示 – 可以根据置信度分数进行加权平均,或者移除置信度低的项,因为如果不这样做,将会得到:

简单平均(包括静默) – 错误:(-290 – 315 + 0 – 305 – 300 – 320 – 335 – 310 – 325 – 295) / 10 = -249.5ms 这与真实的 300ms 相差甚远!

这说明了为什么论文在平均时达到了 99%的准确率,但在单样本时只有 81%。基于置信度的适当过滤/加权消除了误导性的静默样本。

多人在场中的说话人识别

同步分数的一个重要应用是多人在场中的说话人识别。当多个面部可见但只听到一个人的音频时,syncnet 会计算每个面部相对于同一音频流的同步置信度。我们不是对单个面部进行时间上的滑动音频,而是同时评估所有面部 – 每个面部的嘴部运动与当前音频进行比较以生成置信度分数。说话的面部自然产生高置信度(强烈的视听相关性),而静默的面部产生低置信度(无相关性)。通过在 10-100 帧上对这些测量值进行平均,可以过滤掉瞬间的错误,例如眨眼或运动模糊,这与在同步检测中处理静默期的方式类似。

结论

Syncnet 展示了有时最好的解决方案来自于完全重新思考问题。它巧妙地利用了这样一个假设:大多数视频内容一开始都是正确同步的——将普通视频转化为无限的训练数据集。其美妙之处在于其简单性:训练两个 CNN 来创建嵌入,使得同步的音视频对自然地聚集在一起。在平均多个样本时达到 99%的准确率,并且能够处理从广播电视到野生 YouTube 视频的一切,这种方法已被证明非常稳健。无论是修复后期制作中的同步问题还是构建下一个视频会议应用,Syncnet 背后的原理为解决大规模的实际音视频对齐问题提供了一个实用的蓝图。

源代码和实现

posted @ 2026-03-27 10:05  布客飞龙II  阅读(25)  评论(0)    收藏  举报