阿牛字幕 0.7.3:选中的、没选的都能单独看,导出音画不同步也修了
阿牛字幕,基于 FunASR 的字幕生成和剪辑工具,CPU 也能轻松跑。
这版两件事。一是加了个「片段播放」,你选中的、没选的,都能单独放出来看。二是修了个导出上的老毛病:段数一多,声音就越跑越靠前。
一、片段播放:不用导出后才看到效果了
剪口播基本就两种干法。一种是挑:把要留的一句句选上,最后导出选中的部分。另一种是删:把不要的一句句选上,最后导出没被选中的那部分。
两种干法卡在同一个地方:选完了没法预览。想确认选得对不对,只能从头播到尾,全程盯着屏幕看现在放到的是哪一条。
现在字幕页右侧多了一张「片段播放」卡片,就在统计下面。两个按钮,刚好对上这两种干法:
| 按钮 | 播什么 | 什么时候用 |
|---|---|---|
| 播放选中 | 只播你选中的条目 | 挑出有用的:看看你挑的这几段,连起来顺不顺、节奏对不对 |
| 播放未选 | 只播你没选中的条目 | 删掉没用的:看看没选的那些,确认删了不心疼 |
选中只是你自己标的记号,怎么用由你定:想挑有用的,就把有用的选上,看「播放选中」;想删没用的,就把没用的选上,看「播放未选」。按钮只认记号——选中的只放选中的,没选的只放没选的。
点一下就开始,没被播到的部分自动跳过。
它跟着你眼前的视图走:字幕、时间轴模式是按句播,逐字模式就按字播(空白占位也算)。你在哪儿剪,就在哪儿看。
顺手处理了几个小地方:
- 挨得近的片段连起来播。逐字模式下一个字就是一小段,中间只隔几毫秒,要真是一段一段跳,播放器就一直在 seek,看着跟卡带似的。所以隔不到 100 毫秒的片段,直接合成一段
- 播放时也能拖进度条。拖到哪儿就从哪儿接着按片段播;要是拖进两段中间的空隙里,就自动落到下一段的开头
- 播放时鼠标划过字幕不再跳时间了。以前鼠标一扫画面就跳,跟播放进度抢着走,现在播放期间不响应
- 播到最后一段自动停,右上角写着「第 x / y 段」,进度随时能看见
- 没开视频预览的话,点播放会自己打开(视频不挂载就没声音);换显示模式、关掉预览、换文件,都会自己退出,不会留下一个状态说不清的播放器
二、修个老毛病:导出段数一多,声音就越跑越靠前
先说症状。一次导几十上百段(剪口播很常见),导出来的东西越到后面音画越不对。我测的那次是 114 段、218 秒,放到最后,声音比画面快了两秒多。
这毛病最气人的地方在于:你一拖进度条,它就好了。
因为拖进度条是按时间戳重新跳的,时间戳写哪儿就播哪儿,看着一点问题都没有;只有连着播才露馅——连着播靠的是音频时钟,时钟一旦跑偏,声音就一路往前冲。
两个小错,加一块就大了
一个是,两把尺子对不齐。
音频是按整帧往时间轴上贴的,AAC 一帧 1024 个样本,差不多 21.3 毫秒;视频是按帧号均匀排的,30fps 就是 33.3 毫秒一帧。这俩数除不尽。于是每个段的边界上,音频的时间轴就比它实际的音频内容多出 20 毫秒左右。一段多 20 毫秒不算事,一百段就是两秒多。
另一个是,段开头有一帧根本没解出来。
音频 seek 的时候用的是"你要的那个起点",可这一段真正的时间起点,是这段视频第一帧的时间,它可能比你要的起点早一帧。按你要的起点去找,盖住起点的那一两帧音频就整个漏掉了,段头直接缺一块。
两个错加一起,就是:每过一段,音频的时间轴就比音频内容长一点。 时间轴比内容长,播放器的音频时钟就比你实际听到的声音越来越靠前。声音是真的,时间戳是虚的,越到后面差得越多。
怎么修的:给每段划个格子
现在每段都先划一个格子(我们叫它时隙),格子由视频帧定:
- 格子从这段视频第一帧的时间开始
- 格子有多长,看这段视频有几帧,除以帧率
音频就从这个格子开头开始找;段头和段尾那一帧,用新加的 slice_audio_frame 按样本切准,切进格子里;每一帧的时间戳都重新算一遍。
这样一来,音频的时间轴跟音频内容严丝合缝,跟视频也对得齐,段和段之间既不多一点、也不少一点,错就没地方攒了。
两个补充:
- 只有每段的头一帧和尾一帧需要真去切,中间那些原样搬过去,不折腾
- 只导音频(没有视频)的时候,格子由音频自己定,一样对得齐
拿数据说话
源文件 6146 秒(差不多 1 小时 42 分),导出 114 段、一共 218 秒:
| 指标 | 修之前 | 修之后 |
|---|---|---|
| 时间戳空洞 | 96 处 | 0 处 |
| 最后一帧的音画差 | 快 2.19 秒 | 快 0.0003 秒 |
| 音视频时长 | 217.890 / 217.928 | 217.928 / 217.928 |
最后差了 0.0003 秒,基本等于量不出来。段多段少,也不影响了。
升级说明
- 直接下载覆盖安装就行。FunASR、Python 运行时还是全都打包在里面,不用自己装依赖
- 转写结果没变,缓存都留着,旧文件不用重新转,装上就能用
- 以前导出的文件不会自己变好,得重导一遍;段数越多,差别越明显
- 片段播放就是个预览功能,不动数据,关掉就退出
写在最后
做软件,最重要的就是,吃自己的狗粮。
这两个更新,都是我在剪辑小米秋季发布会的时候发现并解决的。
剪辑的时候,导出来看效果,再回来修改,再导出,太麻烦了,便增加了片段播放功能。导出后发现音画偏移,然后就做了改善。
这些事情都是 AI 做的,感谢 Codebuddy,Trae,我日常就靠蹭这些大厂的 token 来写软件。
免费使用,本地运行,下载即用。有问题给我留言,AI 会搞定的。
👉 官网下载体验:https://thinking.vip/a-niu-subtitle
阿牛字幕 生成字幕,粗剪视频

