algorithm - 模糊匹配/分块算法

标签 algorithm fuzzy-comparison chunks sliding-window

背景:我有视频剪辑和音轨要与上述视频同步。

我将从视频剪辑中提取引用音轨。 我还有另一首轨道要与引用轨道同步。不同步来自编辑,它改变了每个过场动画的间隔。

我需要操纵目标轨道使其看起来像(在本例中听起来像)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

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

理想情况下,我希望它们出现的次数越少越好。想法?

最佳答案

听起来您不想花很多时间研究音频处理/工程,因此您想要一些您可以快速理解并正常工作的东西。如果您愿意使用更复杂的东西,请参阅 here一个很好的引用。

既然如此,我希望简单的响度和 zero crossing措施足以识别声音的各个部分。这很棒,因为您可以使用 techniques similar to rsync .

选择一定数量的样本作为 block 大小,并定期浏览您的引用音频数据。 (我们称之为“ block 大小”。)计算过零度量(您可能需要简单过零计数的对数(或快速近似值))。基于时间和过零度量将 block 存储在二维空间结构中。

然后一次更精细地浏览您的实际音频数据。 (可能不需要像一个样本一样小。)请注意,您不必重新计算整个 block 大小的度量——只需减去 block 中不再存在的零交叉并添加新的那些是。 (您仍然需要计算其对数或近似值。)

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

如果 block 匹配得足够好,看看它是否一直匹配到静音。

唯一的问题是 2D 空间结构,但老实说,如果您愿意接受严格的近似窗口,这可以变得容易得多。然后你就可以有重叠的垃圾箱。这样一来,您需要做的就是在特定时间后检查两个容器中的所有值——本质上是通过搜索结构进行两次二进制搜索。

所有这一切的缺点是它可能需要一些调整才能正确,并且不是经过验证的方法。

关于algorithm - 模糊匹配/分块算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5122527/

相关文章:

Lucene.net 模糊短语搜索

r - 字符向量列表与字符向量的模糊字符串匹配

Java顺序解压GZIP流

database - 两张表到一张表的关系

c# - Any()的多重枚举和使用

algorithm - 在现实世界的寻路中,A* 真的比 Dijkstra 好吗?

algorithm - OCR:根据最后 N 个结果选择最佳字符串(OCR 自适应过滤器)

java - Spring批处理中的提交间隔和处理回滚

java - 并发和按顺序从 2 个服务器下载 block - Android

algorithm - 这个(可能)NP完全益智游戏的启发式