最近思考了一个有意思的问题. 以前看电影的时候, 从网上下载到的字幕经常会 有延时而导致场景和字幕不匹配, 只好手动调整, 有没有什么办法来自动的找到 这个延时呢?

可以把视频里有声音的场景都找出来, 这样就有了电影和字幕两个时间轴. 本质 上, 它们都是同一个时间序列的不同表达, 所以应该具有相同的特征. 这两个时 间序列都在有声音的地方取值为1, 无声音的地方取值为0, 经过平移, 除了一些 错误和疏漏之外, 它们应该基本能够对齐.

一开始想到的办法是计算两个时间轴时刻的差值, 然后从中找到对应的区间. 然 而这种方法很难处理由于错误, 疏漏和误差造成的不匹配. 后来想到平移不变性 完全可以由卷积来描述, 这才想到了互相关函数. 为了考虑字幕时刻的误差, 可 以让时间序列在这个点附近的小的范围内衰减. 就像下图一样, 两个时间序列都 变成一个个三角脉冲.

img

写了个Python小程序算了一下互相关函数, 效果非常理想.

img

后来在github上看到已经有人写了一个 subsync, 思路完全相同, 不过实现上 有点区别(时间序列里大部分都是0, 所以我先算出了每个时刻的积分表达式, 而 subsync则用了fft加速). 有时间再作整理吧.