模糊匹配/分块算法

时间:2011-02-25 20:55:10

标签: algorithm fuzzy-comparison chunks sliding-window

背景:我有想要与所述视频同步的视频片段和音轨。

从视频剪辑中,我将提取参考音轨。 我还有另一首曲目,我想与参考曲目同步。 desync来自编辑,它改变了每个过场动画的间隔。

我需要操纵目标轨道看起来像(在这种情况下听起来像)ref轨道。这相当于在正确的位置添加或删除静音。这可以手动完成,但是非常繁琐。所以我希望能够以编程方式确定这些位置。

示例:

     0         1         2         
     012345678901234567890123
ref: --part1------part2------
syn: -----part1----part2-----
# (let `-` denote silence)

输出:

[(2,6), (5,9) # part1
 (13, 17), (14, 18)] # part2 

我的想法是,从头开始:

Fingerprint 2 large chunks* of audio and see if they match:
    If yes: move on to the next chunk
    If not:
        Go down both tracks looking for the first non-silent portion of each
        Offset the target to match the original
        Go back to the beginning of the loop

# * chunk size determined by heuristics and modifiable

这里的主要问题是声音匹配和指纹识别是模糊且相对昂贵的操作。

理想情况下,我希望尽可能少地使用它们。想法?

2 个答案:

答案 0 :(得分:4)

听起来你不想花费大量时间钻研音频处理/工程,因此你需要一些你可以快速理解并且正常工作的东西。如果您愿意使用更复杂的内容,请参阅here以获得非常好的参考。

在这种情况下,我希望简单的响度和zero crossing测量足以识别声音的部分。这很棒,因为您可以使用techniques similar to rsync

选择一定数量的样本作为块大小,并定期浏览参考音频数据。 (我们称之为'块大小'。)计算过零度量(您可能需要一个简单的过零计数的对数(或快速近似))。根据时间和过零测量将块存储在2D空间结构中。

然后一步一步地浏览您的实际音频数据。 (可能不需要像一个样本一样小。)请注意,您不必重新计算整个块大小的度量 - 只需在块中不再删除过零点并添加新块那是。 (您仍然需要计算其对数或近似值。)

以足够接近的频率查找“下一个”块。请注意,由于您要查找的是从头到尾的顺序,因此没有理由查看-all-块。事实上,我们不想,因为我们更容易得到误报。

如果块匹配得足够好,看看它是否匹配到沉默。

唯一关注点是2D空间结构,但老实说,如果你愿意原谅一个严格的近似窗口,这可以变得更容易。然后你可以只有重叠的箱子。这样你需要做的就是在一段时间后检查所有值的两个箱 - 基本上是通过搜索结构进行两次二进制搜索。

所有这一切的缺点是可能需要进行一些调整以使其正确并且不是经过验证的方法。

答案 1 :(得分:0)

如果你可以像你建议的那样可靠地区分沉默与非沉默,如果唯一的区别是沉默的插入,那么似乎唯一的重要案例是在没有之前没有插入沉默的地方:

ref: --part1part2--
syn: ---part1---part2----

如果你可以使你的块大小适应沉默,你的算法应该没问题。也就是说,如果你的块大小相当于上面例子中的两个字符,你的算法会识别“pa”匹配“pa”和“rt”匹配“rt”但是对于第三个块它必须识别{{1中的静音并调整块大小以比较“1”到“1”而不是“1p”到“1 - ”。

对于更复杂的编辑,您可以调整加权Shortest Edit Distance算法,删除静音只需0。