查看 13 回复 0

FFsubsync:一款可以基于音频指纹对齐字幕,适用于已有字幕但时间轴偏移的情况

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:135
  • 打卡月天数:3
  • 打卡总奖励:244
  • 最近打卡:2026-06-06 17:54:10

831

主题

119

回帖

5389

影币

YzYY工作组

积分
807

1周年纪念2周年纪念

发表于 2026-3-14 04:48:08|来自: | 显示全部楼层 |阅读模式
基本信息
软件版本(Software type): 开源软件(Open-Source Softwre) 
界面语言(UI Language): Other languages 
使用平台(Usage Platform): MacOS, Windows, 
使用方式(Usage of software): 命令行工具 (Command-line tool)
资源体积(Size): ()
网盘(Storage Network Drive):  
分享说明(Say something): 需要首先安装ffmpeg

一种语言无关的字幕自动同步工具,它可以调整字幕与视频的时间对齐,确保字幕在正确的时间点出现。

比较如下:

原始效果
纠正后效果

安装

首先,确保已安装ffmpeg。在MacOS上,操作如下:

  1. brew install ffmpeg
复制代码

(Windows用户:请确保ffmpeg已添加到路径中,并可以在命令行中使用!)

接下来,安装该包(兼容Python 3.6及以上版本):

  1. pip install ffsubsync
复制代码

如果你想要尝试最新版,可以这样安装:

  1. pip install git+https://github.com/smacke/ffsubsync@latest
复制代码

使用

ffs、subsync和ffsubsync都可以用作入口点:

  1. ffs video.mp4 -i unsynchronized.srt -o synchronized.srt
复制代码

有时你可能有一份正确同步但语言不熟悉的srt文件,以及一份需要同步的母语srt文件。在这种情况下,你可以直接使用正确同步的srt文件作为同步参考,而不是使用视频本身作为参考:

  1. 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相比产生次优的同步行为,但在某些情况下去效果良好。

如果同步仍然失败,可以考虑试试以下类似的工具:

  • sc0ty/subsync:进行语音转文字并查找匹配的单词形态;
  • kaegi/alass:基于Rust的字幕同步器,采用了复杂的动态规划算法;
  • tympanix/subsync:基于神经网络的方法,直接优化语音检测时的对齐;
  • oseiskar/autosubsync:使用自定义谱图和逻辑回归进行语音检测;
  • pums974/srtsync:与ffsubsync类似的方法(使用WebRTC的VAD和FFT来最大化信号互相关)。

速度 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的项目,不包括赢得特定公司奖项的项目)。

致谢

以下库使得这个项目成为可能:

  • ffmpeg 和其 Python 包装器 ffmpeg-python,用于从视频中提取原始音频
  • 来自webrtc的VAD以及 Python 包装器py-webrtcvad,用于语音检测
  • srt,用于处理SRT文件
  • numpy 以及间接使用的 FFTPACK,提供了基于FFT的快速对齐评分算法,用于字幕(或字幕与视频)之间的匹配
  • 其他优秀的 Python 库,如 argparse, rich, 和 tqdm,它们虽然与核心功能无关,但为开发者和用户带来了更好的体验。
许可证

本项目的代码遵循 MIT许可证


通过FFsubsync,告别手动调整字幕的繁琐过程,让每一次观影都沉浸在完美的视听体验中!




【免费下载链接】ffsubsync

Automagically synchronize subtitles with video.

项目地址: https://gitcode.com/gh_mirrors/ff/ffsubsync

回复

使用道具 举报

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

请文明上网,禁止在本站发表任何辱骂性文字。无论是谁的错,骂人的账号一律永久禁言,永不解禁。
娱乐至上,禁谈政治,违者同上。

精选推荐

关闭

站长推荐上一条 /1 下一条

1