|
一种语言无关的字幕自动同步工具,它可以调整字幕与视频的时间对齐,确保字幕在正确的时间点出现。 比较如下: 安装 首先,确保已安装ffmpeg。在MacOS上,操作如下: (Windows用户:请确保ffmpeg已添加到路径中,并可以在命令行中使用!) 接下来,安装该包(兼容Python 3.6及以上版本): 如果你想要尝试最新版,可以这样安装: - pip install git+https://github.com/smacke/ffsubsync@latest
复制代码使用 ffs、subsync和ffsubsync都可以用作入口点: - ffs video.mp4 -i unsynchronized.srt -o synchronized.srt
复制代码有时你可能有一份正确同步但语言不熟悉的srt文件,以及一份需要同步的母语srt文件。在这种情况下,你可以直接使用正确同步的srt文件作为同步参考,而不是使用视频本身作为参考: - ffsubsync reference.srt -i unsynchronized.srt -o synchronized.srt
复制代码ffsubsync会根据文件扩展名判断是通过音频进行语音活动检测还是直接从srt文件提取语音。 同步问题 如果同步失败,可尝试以下方法: - 使用--no-fix-framerate参数,假设视频和字幕的帧率相同;
- 传递--gss以使用黄金分割搜索算法找到视频和字幕帧率的最佳比例(默认仅评估几个常见比例);
- 如果字幕的偏移时间超过默认的60秒(实践中不太可能发生,但理论上可能),尝试增大--max-offset-seconds的值;
- 尝试--vad=auditok,因为auditok在低质量音频的情况下有时比WebRTC的VAD表现更好。Auditok并不专门检测语音,而是检测所有音频;这可能导致与真正有效的VAD相比产生次优的同步行为,但在某些情况下去效果良好。
如果同步仍然失败,可以考虑试试以下类似的工具: 速度 ffsubsync通常会在20到30秒内完成,具体取决于视频长度。最耗时的步骤实际上是提取原始音频。如果你已经有一个正确同步的“参考”srt文件(可以跳过音频提取步骤),ffsubsync通常在一秒内就能运行完毕。 工作原理 同步算法分为三个步骤: - 将视频的音频流和字幕都切分成10毫秒的窗口。
- 对每个10毫秒窗口,判断它是否包含语音。对于字幕来说,这一点很容易确定(我们只是检查每个时间段是否有字幕显示);对于音频流,使用现成的语音活动检测器(如webrtc内置的)。
- 这样我们就得到了两个二进制字符串:一个表示字幕,一个表示视频。尝试将这两个字符串对齐,使0对应0,1对应1。我们对这些对齐进行评分,计算(视频1匹配到字幕1的数量)减去(视频1匹配到字幕0的数量)。
第三步中评分最高的对齐方式决定了如何调整字幕以与视频正确同步。由于二进制字符串较长(对于一小时以上的视频,会有数百万位),因此遍历所有对齐方式的简单O(n^2)策略不可接受。相反,我们利用“评分所有对齐方式”实际上是一个卷积运算的事实,可以使用快速傅里叶变换(FFT)实现,将复杂度降低到O(n log n)。 限制 大多数情况下,视频和字幕之间的不一致出现在视频中有的部分没有在字幕中出现,反之亦然。例如,电视节目中字幕中被剪掉的回顾片段。FFsubsync通常能很好地处理这种情况,据我经验,这涵盖了95%以上的使用场景。中间的分割或断开不在开头和结尾的情况尚未处理(见下方未来工作部分)。 未来工作 除了普遍的稳定性和可用性改进,其中一个研究方向是扩展同步算法以处理视频中而字幕中没有的中间分割或断开(反之亦然)。开发出健壮的解决方案需要时间(假设这是可能的)。详情参阅#10。 历史这个项目的实现始于2019年的HackIllinois活动,并获得了**荣誉提及**(排名前5的项目,不包括赢得特定公司奖项的项目)。 致谢以下库使得这个项目成为可能: 许可证本项目的代码遵循 MIT许可证。
通过FFsubsync,告别手动调整字幕的繁琐过程,让每一次观影都沉浸在完美的视听体验中!

【免费下载链接】ffsubsync Automagically synchronize subtitles with video. 项目地址: https://gitcode.com/gh_mirrors/ff/ffsubsync |