大家都知道,不同语言即使对于同一句话,发音时长也是不同的,比如一句话用中文2s就能说完,但翻译为英语后,句子可能变的很长,需要3s或更多时间才能讲完。如下面的例子,中文读完用时2.3s,而翻译为英文配音后读完需要3.8s(来自deepl.com)。
例子:
中文:用时 2.300 秒
00:00:13,530 --> 00:00:15,830
本期我们介绍电磁阀的功用原理
英文:用时 3.800 秒
"In this issue, we introduce the functional principle of electromagnetic valves."
这种情况就导致在对视频进行字幕翻译并配音后,新视频的时长同原视频的时长不相等,从而造成 "画面、声音、字幕" 无法对齐。
如何解决该问题呢,一种思路是尽量精简译文,保持翻译短小精悍,但除非人工翻译,机器翻译几乎无法做到这一点,因此忽略这种方法。
另外有2种比较容易实现的思路,也是目前我所采用的。
一是强制配音加快语速:
在原时长内必须说完,看上面的例子,英文配音后,正常语速需要 3.8秒,为了让它在 2.3秒 内讲完,需将语速提升为原语速的 1.65 倍,从而实现了 声音、画面、字幕对齐。
但很显然,这种方式必然导致语速时快时慢,而且有时太快,压根听不清说的什么,体验很不好。
二是强制视频慢放延长画面:
以配音后时长为准,将原时长内的视频片段慢速播放,将时长延长到配音时长。
还是看上面例子,原用时 2.3秒,配音时长3.8秒,将原视频里 00:00:13,530 --> 00:00:15,830
这2.3秒时间段内的视频片段截取出来,然后通过 ffmpeg 滤镜 setpts 将视频延长 1.65倍,时长就变为了 3.8秒,这样就和配音时长一致了,从而实现了对齐,而配音并不需要加快语速。
这种方法避免了语速的时快时慢,但很显然又带来了另一个问题:画面变的时快时慢,有时候慢的像是在进行慢动作回放,体验同样不好。
如果同时结合上面两点是否可行呢,自然是可以的。
还是看上面示例,同时采用 "配音加速" 和 "视频慢放" ,将配音语速加快 0.825 倍,即原本 1.65 的一半,同样将视频延长 0.825倍,这样可将影响降到最低,保证了语速不至于太快,同时视频不至于太慢。
感觉仍不完美,还有没有其他办法呢
若是采用人工调整,无论是精简翻译,还是调整配音语速或者视频抽插帧,方法都很多,但效率太低,我想要的是程序自动化实现。
目前想到了另一种思路,即在配音延长后,先检测原视频中,对应每条字幕结尾到下一条字幕开始之前是否存在静音区间,如果有,那就延长本条字幕结尾时间,直到达到配音时长,或者达到了下一条字幕开始时间。
看前文例子,原中文这条字幕:00:00:13,530 --> 00:00:15,830
,时长只有2.3s,距离正常播放完毕3.8s的英文配音还差1.5s,此时检测下一条字幕和本条字幕结束时间 00:00:15,830
之间是否存静音时段,这里假如下一条字幕开始时间是 00:00:17,830
,显然存在2s的区间,那么配音就无需加速,只需要将本条字幕显示结尾时长延长1.5s就可以了。
这是比较顺利的情况,如果后边没有间隔,或者间隔不足 1.5s 怎么办,此时再检测距离同上一条字幕结束是否存在静音片段,如果有,那么就将本条字幕开始时间往前移动,直到延长1.5s或者达到上条字幕结束时间。
但更多见的情况是,前后都移动了仍然无法正常语速播放完毕怎么办呢?
那就强制语音加速,为避免加速太多导致无法听清,设置一个最大加速倍数如1.5倍,超出就不再加速。
那不还是不同步吗?
别忘了还可以继续视频慢速,到了这一步,只能强制视频慢放,直到全部对齐。
这是目前的思路,不完美,但相比其他方法,应该效果要好很多,不过暂时还未实现,仍停留在思考阶段。