去年搞了个开源项目 " 视频翻译配音 github.com/jianchang51... ",使用中接收到不少用户反馈,一些高频出现的常见问题,专门发文解释下。
声音、画面、字幕不同步
首先解释原因:
不同语言相互翻译后,字符长度数量是不同的,发音也是不同的,因此翻译前后的配音必然是有时长差异的,比如原中文配音是2秒,翻译为英文后配音可能是3s,定然导致声音、画面、字幕不同步。
如何尽量保持同步:
在使用时,设置一个较小的配音整体速度,比如10%,使配音速度整体略有提高,以尽量降低时长变长。
再同时选中 "配音自动加速"、"视频自动慢速"、"语音前后延展",这样将把不同步影响降到最低,甚至达到同步效果。
实现原理查看 视频翻译配音声音、画面、字幕 同步对齐问题
如果你不在乎同步问题,只想尽量不延长视频,即便导致一点不同步,那么这3个选项全部都不要选中。
整体识别、预先分割、均等分割的区别
整体识别:
这是语音识别效果最好的,也是最消耗计算机资源的,如果视频比较大,又使用了 large-v3 模型,可能导致闪退。
在识别时,将整个语音文件传递给模型, 由模型内部使用 VAD 进行切分识别和断句,默认静音分割 200ms,最大语句长度3s,可通过 videotrans/set.ini 中,如下图参数进行微调
预先分割:
原理和实现同整体分割类似,主要区别就是为了防止视频过大模型也过大时,计算机资源不足,会在传递给模型前,提前按60s切割为小片段。静音分割同样是200ms,最大语句是3s,也是通过 videotrans/set.ini 上图参数进行调节
均等分割:
顾名思义,这是按照固定长度,将语音文件切割为同样长度,再传递给模型,同时 OpenAI 模型下会强制使用均等分割,即在使用OpenAI模型时,不管你选择的是"整体识别"还是"预先分割",都会强制使用"均等分割"。
均等分割每个片段是10s,静音分割语句间隔是500ms,可通过 videotrans/set.ini 中下图参数调整
注意:设定了10s,每个字幕大体上都是10s时长,但并非每个配音长度一定是10s,发音时长以及会移除配音末尾的静音。
字幕字体大小如何设置
软字幕不可调节大小,由播放器控制。硬字幕可通过修改 videotrans/set.ini 中 fontsize=14
大小来调整,默认是14
控制字幕一行文字个数
默认情况下,中日韩文字一行30个字符,其他语言文字一行60个字符,可通过修改 videotrans/set.ini 中 cjk_len=30
和 other_len=60
调节
代理是怎么回事
如果你不知道代理是什么,也无法访问 Google,那么就不要理会了,记住不要使用 Google、Gemini、OpenAI ChatGPT 就可以了。
切莫在网络代理地址
里胡乱填写或将API地址填写到里面。可以不填,但不要乱填
如果你知道代理是什么,并且也知道你计算机上正使用着代理工具,也能找到代理端口,那么就将代理地址填写到 网络代理地址 框里即可,一般形式是 http://127.0.0.1:数字端口号
请切记, 如果你部署了本地的 DeepLx,那么需要将DeepLx的地址填写到"设置菜单-DeepLX"中,而不是填写到网络代理地址中,然后不断疑惑为什么不能用。
同样,如果你使用了chatGPT的国内中转api,也是要将api地址填写到"设置菜单-OpenAI/ChatGPT"中,而不是网络代理地址中
保留背景音 这个选项是干嘛的
很多视频会有较大的背景噪声,导致识别效果不佳,如果选中了"保留背景音"选项,那么将在识别前先移除视频里的背景声音,只保留纯净人声,会有更好的识别效果,同时会在最终生成结果视频前,再将移除的背景声音合成回去,新视频就能保留原视频的背景效果。
但注意,如果视频太大,比如几百MB或上超过1G,不要使用,即便视频不大,但没有显存或显存很小,也不要使用,否则会非常卡顿导致出错
单独人声背景分离工具,查看 推荐2个分离人声和背景伴奏的工具:urv5和vocal-separate
执行了几个视频后,发现硬盘快满了
在选中了"视频自动慢速"后,会将视频按照字幕切割为小片段,然后再对每个片段进行延长等变换,因此会生成原视频数倍的总尺寸视频片段,这也是"视频自动慢速"功能很慢的原因之一。
在处理完成后,可以手动删除软件目录下的tmp
缓存文件夹下的所有内容,但不要删除tmp
本身。 如果不手动删除,在关闭软件时,也会自动清理。
对同一个视频反复处理,为什么识别结果不变
默认情况下,如果该视频已经有识别完成或翻译完成的字幕文件了,将不再进行识别、翻译处理了, 以节省时间和计算机资源,如果你想再次处理,请打开"目标文件夹",也就是你"保存到.."的文件夹(如果未手动选择,则在原视频同目录下的_video_out下),删掉里面的所有内容,再重新执行就可以了。
当然你也可以将原视频简单的改个名字,将不再使用原结果。
双字幕怎么处理、软双字幕为什么只显示一个
在"嵌入字幕"下拉菜单里,可以选择"硬字幕嵌入(双)"或"软字幕(双)",在结果视频中,将保留原语言和目标语言两种字幕,其中硬字幕会以上下两行形式展示,而软字幕只会显示一种语言的,如果你想显示另一种软件字幕,请使用视频播放器的字幕管理功能切换。
总是提示显存不足(whole all Unable to allocate)
显存满了,使用小点的模型,比如使用 medium
small
而不是 large-v3
,large-v3
最低要求显存是8G,但不代表8G显卡就一定能顺畅运行,其他软件也会同时占用显存,而且视频越大所需显存也会越多,当提示这个错误时,请尝试:
- 使用小点的模型,比如
small/medium/base
- 如果仍然想使用大模型,选择使用"预先分割"或"均等分割"
- 修改 videotrans/set.ini
ini
cuda_com_type=float32改为 int8,如果报错,再改为int16,
beam_size=5 将5改为 1
best_of=5 将 5 改为1
condition_on_previous_text=true 将 true改为false
GPU 使用率太低
软件工作原理是:
根据视频中的声音识别出文字,将文字翻译为目标语言,根据目标语言合成配音,再将文字、配音、视频合并为新视频,只有在声音识别文字阶段是重度使用GPU的,而其他阶段不使用GPU或只使用很少的GPU。
工作原理 一文搞懂"视频翻译与配音工具"
chatGPT 翻译后行数和原始行数不同或出现空白行
这是chatGPT在翻译时,将原本两行的内容翻译为一行了。
除非一次翻译一行,否则只要翻译的行数足够多,翻译任务执行时间足够长,总会出现一次合并行的问题。
尤其在前一行很长后一行很短只有一两个词,又是前一句的延伸时,chatGPU大概率会将后边一行和前一行翻译为一行内容,这是chatGPT强于普通翻译的地方,不会僵硬翻译每一行,而是照看上下文,但这样对于严格要求返回行数的显然造成了问题。
试了很多办法,包括用更强烈语气要求它不合并,返回行数必须同原文一致。
包括用更多的符号分割限制/给它原文示例和返回示例,甚至包括发送和返回都用标准json格式,但无论怎样,只要一个任务行数足够多,比如大于1000、20000行,并且不是一行一译,至少会出现一次这种合并。
如果只有几十数百行的少量任务,倒很少这情况。
目前的解决办法是:
要么容忍偶尔出现这情况,要么改成一次只发送一行进行翻译。 修改 videotrans/set.ini 中 trans_thread=10
为 trans_thread=1
如果你有好的办法或提示词,可以尝试修改 videotrans/chatgpt.txt 里的提示词进行处理,请在原提示词的基础上处理。目前是发送多行,行位是换行符,行首是<数字行号>.