背景:我有视频剪辑和音轨要与上述视频同步。
我将从视频剪辑中提取引用音轨。 我还有另一首轨道要与引用轨道同步。不同步来自编辑,它改变了每个过场动画的间隔。
我需要操纵目标轨道使其看起来像(在本例中听起来像)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/