模糊匹配/分块算法
Posted
技术标签:
【中文标题】模糊匹配/分块算法【英文标题】:Fuzzy matching/chunking algorithm 【发布时间】:2011-07-04 14:21:36 【问题描述】:背景:我有想要与所述视频同步的视频剪辑和音轨。
我将从视频剪辑中提取参考音轨。 我还有另一个要与参考轨道同步的轨道。不同步来自编辑,它改变了每个过场动画的间隔。
我需要操纵目标轨道看起来像(在这种情况下听起来像)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
这里的主要问题是声音匹配和指纹识别是模糊且相对昂贵的操作。
理想情况下,我希望他们尽可能少。想法?
【问题讨论】:
声音是否完全匹配,唯一的区别是纯静音间隔的长度? 是和不是。由于编码差异,声音不同,但我可以足够精确地“模糊”匹配它们 @Justin 是的,就音高而言,它们是相同的。如果这就是你想要的地方,我不必让它们更长或更短 【参考方案1】:听起来您并不想花大量时间钻研音频处理/工程,因此您想要一些可以快速理解并且可以正常工作的东西。如果您愿意使用更复杂的东西,请参阅 here 以获得非常好的参考。
在这种情况下,我希望简单的响度和zero crossing 措施足以识别声音的各个部分。这很棒,因为您可以使用techniques similar to rsync。
选择一些样本作为块大小,并定期浏览您的参考音频数据。 (我们称之为“块大小”。)计算过零度量(您可能需要一个简单过零计数的对数(或快速近似值))。根据时间和过零度量将块存储在二维空间结构中。
然后一次更精细地浏览您的实际音频数据。 (可能不需要像一个样本那么小。)请注意,您不必重新计算整个块大小的度量——只需减去不再在块中的过零并添加新的那些。 (您仍然需要计算其对数或近似值。)
寻找频率足够接近的“下一个”块。请注意,由于您要查找的是从头到尾的顺序,因此没有理由查看 -all- 块。事实上,我们不想这样做,因为我们更有可能得到误报。
如果块匹配得足够好,看看它是否一直匹配到静音。
唯一令人担忧的一点是 2D 空间结构,但老实说,如果您愿意容忍严格的近似窗口,这会变得容易得多。然后你可以有重叠的垃圾箱。这样,您需要做的就是在一段时间后检查两个 bin 中的所有值——本质上是通过搜索结构进行两次二进制搜索。
所有这些的缺点是它可能需要一些调整才能正确并且不是一个经过验证的方法。
【讨论】:
第一个链接 codeproject.com/Articles/206507/… 是我读过的最好的解释性教程文章。【参考方案2】:如果您可以按照您的建议可靠地区分静音和非静音,并且唯一的区别是插入静音,那么似乎唯一不平凡的情况是在之前没有静音的地方插入静音:
ref: --part1part2--
syn: ---part1---part2----
如果你可以让你的块大小适应静音,你的算法应该没问题。也就是说,如果您的块大小等于上面示例中的两个字符,您的算法将识别“pa”匹配“pa”并且“rt”匹配“rt”,但对于第三块它必须识别syn
中的静默并调整块大小以将“1”与“1”进行比较,而不是“1p”与“1-”进行比较。
对于更复杂的编辑,您也许可以采用加权 Shortest Edit Distance 算法,去除静音的成本为 0。
【讨论】:
以上是关于模糊匹配/分块算法的主要内容,如果未能解决你的问题,请参考以下文章