#5794 终于找到原因了,我把英语通过人工翻译好中文,但是在生成语音的时候,你怎么老把时间轴给改动了啊

2a14:4900* Posted at: 1 day ago

终于找到原因了,我把英语通过人工翻译好中文,但是在生成语音的时候,你怎么老把时间轴给改动了啊

18 Replies

原因在于软件默认开启了“音频加速”或“视频慢速”等音画同步对齐功能(位于主界面第5行“同步对齐和字幕”区域)。当您导入人工翻译好的中文字幕后,软件为了匹配配音与原文时长,会自动调整配音速度或视频播放速度,这直接导致了字幕时间轴被修改。

解决办法:

  1. 视频翻译场景:在主界面第5行,取消勾选“音频加速”和“视频慢速”(若两者都不勾选,配音将严格按原字幕时间轴拼接,差异部分以静音填充)。
  2. 批量为字幕配音场景:在对应面板中,取消勾选“配音加速” 和“视频慢速”选项。
  3. 同时检查是否误开了“LLM重新断句”“二次识别”(这些会重写字幕时间轴),请一并取消勾选。

请查阅相关文档:

用的是默认断句,只勾选视频慢速对齐,以前4.02版本没有出现过问题,更新到4.05之后,才出现,有的视频可以,有的就不行。
1
00:00:00,020 --> 00:00:03,460
And now we can write a couple of lines of code
1
00:00:00,020 --> 00:00:03,953
好,现在我们来写几行代码

2
00:00:03,953 --> 00:00:08,186
对于玩家,首先我要声明几个基本变量

3
00:00:08,186 --> 00:00:11,586
需要一个方向变量

4
00:00:11,586 --> 00:00:14,852
类型必须是 Vector2

5
00:00:14,852 --> 00:00:22,485
设成 Vector2 类型的话,默认就是一个 x 和 y 都为 0 的 Vector2

6
00:00:22,485 --> 00:00:30,618
这正是我想要的。当然如果想写得更明确一点,也可以写成 Vector2(0, 0)

7
00:00:30,618 --> 00:00:39,551
效果一样,看你喜欢。然后玩家还需要一个速度变量,类型设成整数

8
00:00:39,551 --> 00:00:44,884
默认值设为 200。好了,有了这些之后

9
00:00:44,884 --> 00:00:48,417
我要调用一个每帧都会运行的函数

10
00:00:48,417 --> 00:00:52,217
可以写 func process

11
00:00:52,217 --> 00:00:57,983
也可以写 func physics process

12
00:00:57,983 --> 00:01:08,683
我选 physics process,因为后面处理碰撞时,会涉及一点物理运算。不过目前用哪个都一样

13
00:01:08,683 --> 00:01:15,949
在这个函数里,我们要移动玩家的位置,其实就是获取当前节点的坐标
......
住键盘 Ctrl 键,鼠标点击 Input,就能打开它的文档

114
00:10:44,322 --> 00:10:50,222
往下翻一点,能看到所有相关的方法

115
00:10:50,222 --> 00:10:56,588
方法挺多的。其中我们最常用的方法是 get vector

116
00:10:56,588 --> 00:11:01,088
点进去,然后我们来做个小练习

117
00:11:01,088 --> 00:11:15,254
请大家阅读文档,搞清楚 Input.get vector 到底做了什么、怎么用。现在暂停视频,看看你能掌握多少

118
00:11:15,254 --> 00:11:21,087
希望你读了这段文档。我觉得整体来说挺直观的

119
00:11:21,087 --> 00:11:24,522
简单来说,get vector 需要传入四个参数

120
00:11:24,522 --> 00:11:32,297
负 X、正 X、负 Y 和正 Y。用通俗的话说就是左、右、上、下

121
00:11:32,297 --> 00:11:36,097
把这四个方向传到 get vector 里就行

122
00:11:36,097 --> 00:11:45,797
把这些方向传给 get vector,它就会返回一个 Vector2,自动帮我们处理好所有方向

123
00:11:45,797 --> 00:11:52,763
换句话说,回到玩家脚本里,我要删掉所有这些

124
00:11:52,763 --> 00:11:59,463
改成用 Input.get vector() 来更新 direction

125
00:11:59,463 --> 00:12:03,896
四个方向参数:负 X 是 left

126
00:12:03,896 --> 00:12:10,962
正 X 是 right,负 Y 是 up

127
00:12:10,962 --> 00:12:19,362
正 Y 是 down。填好之后运行游戏,就可以自由移动玩家了

128
00:12:19,362 --> 00:12:26,628
就像魔法一样。松开按键,玩家就停下,效果非常好

129
00:12:26,628 --> 00:12:35,028
get vector 在开发中会频繁使用,实用性极强。它的逻辑并不复杂

130
00:12:35,028 --> 00:12:40,828
只需传入四个方向参数,返回的向量可以直接赋值给 direction

131
00:12:40,828 --> 00:12:48,994
最后再来一个练习:再创建一个输入,这次用空格键。然后在 GDScript 里监听按键

132
00:12:48,994 --> 00:12:56,327
当空格键被按下时打印一些内容。额外挑战:确保按一次只打印一次

133
00:12:56,327 --> 00:13:00,860
而不是多次

134
00:13:00,860 --> 00:13:11,260
这个可能又要查文档了。现在暂停视频,看看你能做到哪一步

135
00:13:11,260 --> 00:13:19,060
回到 Godot,进入 Project、Project Settings、Input Map,创建一个新操作

136
00:13:19,060 --> 00:13:27,060
命名为 Confirm。因为后面在标题画面按这个键会跳转到游戏主界面

137
00:13:27,060 --> 00:13:30,393
Confirm 这个名字可能不是最好的,但够用

138
00:13:30,393 --> 00:13:34,426
关键是要给这个操作绑定一个按键

139
00:13:34,426 --> 00:13:38,845
按下空格键,点 OK,现在就有了 Space Physical

140
00:13:38,845 --> 00:13:47,078
足够了。接下来在玩家脚本里调用 Input

141
00:13:47,078 --> 00:13:52,015
用 is action pressed 检测 confirm 按键是否被按下

142
00:13:52,015 --> 00:13:55,248
如果按下了就打印一些内容

143
00:13:55,248 --> 00:14:00,017
你可能觉得这样就够了。但如果现在运行游戏,按一下空格

144
00:14:00,017 --> 00:14:07,483
即使只按了一次,结果却打印了多次

145
00:14:07,483 --> 00:14:14,083
这不行。问题出在哪?is action pressed 会持续检测按键是否处于按住状态

146
00:14:14,083 --> 00:14:20,049
而且是每帧都检测。physics process 每秒运行 60 帧

147
00:14:20,049 --> 00:14:26,415
也就是说这个函数每 60 毫秒就检查一次按键是否被按住

148
00:14:26,415 --> 00:14:31,948
即使只按了 0.1 秒,对 Godot 来说也是很多次输入了

149
00:14:31,948 --> 00:14:39,048
有几种修复方法,最简单的是改用 is action just pressed

150
00:14:39,048 --> 00:14:45,048
这样 Godot 只检测按键是否被按下,不检测是否被按住

151
00:14:45,048 --> 00:14:52,314
现在再运行,按一次空格只输出一次,好多了

152
00:14:52,314 --> 00:14:59,547
好了,现在有了用户输入。但游戏看起来还是不太好

153
00:14:59,547 --> 00:15:04,513
最主要的是所有东西都太小了,只能看到背景的一小部分

154
00:15:04,513 --> 00:15:09,066
这些问题在这一部分都会解决,我们要添加摄像机

155
00:15:09,066 --> 00:15:16,032
这样就能放大画面,让摄像机跟随玩家在场景中移动

核心原因:你勾选了“视频慢速”。启用该选项后,一旦某个配音片段比原视频片段时长更长,软件会强制放慢该片段的视频播放速度以对齐配音,这一过程会直接修改字幕的时间轴(因为视频变慢了,字幕显示时长也随之拉伸)。V4.05 版本调整了对齐算法,导致某些视频在拉伸后时间轴与原始字幕产生偏差。

解决方案:

  1. 在主界面第5行“同步对齐和字幕”区域,取消勾选“视频慢速”
  2. 如果仍希望尽量消除配音与画面的时间差异,可以勾选“音频加速”(仅加速配音音频,不修改视频或字幕时间轴)。
  3. 确保没有勾选“二次识别”或“LLM重新断句”,这些功能也会重写字幕时间轴。

按上述调整后,软件将严格使用你制作的中文字幕时间轴进行配音和合成,不会改动时间轴。如果问题依旧,请提供软件版本号(左上角数字)及 logs/ 目录下最新的日志文件,以便进一步排查。

我就喜欢用视频慢速,如何解决

既然你坚持使用“视频慢速”来强制对齐,时间轴被改动是正常现象(视频慢速会拉伸画面时长,字幕承载时间也必须随之拉长)。但你可以通过以下调整来最大程度减少时间轴偏离你原始字幕的程度


1. 减少触发视频慢速的场景

视频慢速仅当配音片段时长 > 原字幕对应时长时才会被激活。如果能缩短配音时长,就能让更多片段不触发慢速,从而保留原始时间轴。方法如下:

  • 提高配音语速:点击主界面 “设置更多参数”,在 配音语速 中输入一个正数,例如 +10(代表加速 10%)。你可以根据实际效果尝试 +5+15。语速越快,配音音频越短,越不容易触发视频慢速。
  • 检查配音角色:不同角色的自然语速和停顿不同。切换到一个语速更快的配音角色(例如 Edge-TTS 中的 zh-CN-YunxiNeuralzh-CN-YunyangNeural 快),也可能减少配音时长。
  • 配合音频加速:同时勾选 “音频加速”“视频慢速”。软件会优先尝试加速配音音频;只有当音频加速达到最大限制仍无法对齐时,才启用视频慢速。这能大幅减少视频慢速的触发频率,进而保留更多字幕时间轴不变。

2. 调整视频慢速的最大幅度

进入 菜单 → 工具 → 高级选项 → 字幕声音画面对齐,将 “视频慢放最大倍数” 设置为一个较小的值,例如 2(默认是 10)。这样即使触发慢速,时间轴的拉伸幅度也会被限制在较低范围,更接近原字幕。


3. 杜绝其他影响时间轴的功能

  • 取消勾选 二次识别(主界面第5行区域)。
  • 取消勾选 LLM重新断句(主界面第2行区域)。
  • 取消勾选 Whisper预分割音频(高级选项 → 语音识别参数,如果你之前勾选了的话)。

这些功能会重排或修改字幕时间轴,与你的目标冲突。


4. 最终策略

若以上调整后你仍无法接受时间轴被改,可考虑不启用视频慢速,仅使用音频加速,并在高级选项中将 音频加速最大倍数 调高(如 200),效果接近视频慢速但不会改动视频帧率和时间轴。当然,这需要你做出取舍。

如问题依然存在,请提供软件版本号(左上角数字)及最新日志,以便进一步分析具体哪一步触发了时间轴重写。

为什么以前的版本没有任何问题,只需要把视频慢放对齐就行

这是合理的疑问。根据软件底层机制,视频慢速 在旧版(如 v4.02)中可能并未精细调整字幕时间轴,而 v4.05 版优化了对齐引擎(SpeedRate),使得视频慢速时为了精确的音画同步,会同步改写字幕的显示时间轴。这是性能优化带来的副作用,不是 Bug,而是为了更严谨同步而做的改动。因此,如果您坚持用视频慢速且希望保留原字幕时间轴,建议尝试以下两种方案:

方案一:用“音频加速”替代“视频慢速”

  • 勾选“音频加速”,同时取消勾选“视频慢速”。
  • 在高级选项 → 字幕声音画面对齐中,将“音频加速最大倍数”调高(如 200)。
  • 这样仅加速配音音频,不修改视频帧率和字幕时间轴,同时能达到与视频慢速类似的同步效果。您之前 v4.02 时可能默认仅使用音频加速而未察觉。

方案二:混用“音频加速”+降低“视频慢速”影响

  • 同时勾选“音频加速”和“视频慢速”。软件会先尝试加速音频,只有当音频加速到最大倍数仍无法对齐时,才启用视频慢速。这样可以大幅减少视频慢速的触发次数。
  • 在高级选项中将“视频慢放最大倍数”设为较小值(如 2),限制时间轴拉伸幅度。
  • 提高配音语速(参数设置为 +10 左右),缩短配音时长,降低触发视频慢速的概率。

如果以上仍无法接受

您可以选择回退到 v4.02 版本,或暂时不升级。pyVideoTrans 的更新记录可在官方文档站查阅。

需要配合确认

请提供:

  1. 软件左上角的完整版本号(例如 v4.05-0711)。
  2. logs/ 目录下最新日志文件(复制底部约30行)。
  3. 主界面第5行“同步对齐和字幕”区域的所有勾选项(包括是否勾选了“二次识别”等)

有了这些信息,可以更准确地定位是哪个参数在 v4.05 中导致了时间轴修改。

现在翻译好后,有个缺点,就是每念完一条字幕,都要等一段时间,才会继续念下一条字幕,中间的间隔有点长

这是配音TTS引擎在每条字幕开头和结尾自动生成静音缓冲导致的,与视频慢速或时间轴修改无关。只需一步即可解决:进入菜单 → 工具 → 高级选项 → 字幕配音调整,勾选“移除配音前后静音缓冲”。保存后重新执行配音即可。此设置会剔除每条配音音频前后的静音间隙,让字幕之间衔接更紧凑,不会再有明显等待感。如果仍感觉有间隔,可同时将主界面“设置更多参数”中的 配音语速 设为 +5 到 +10(加速5%~10%),进一步缩短单句时长,使节奏更紧密。注意:如使用EdgeTTS渠道,请确保高级选项中“EdgeTTS配音渠道配音并发数”为1,“配音后暂停秒”为0~1,避免限流导致的静音延长。若问题依旧,请提供配音渠道名称和日志片段。

我现在是只选择,视频慢速音画对齐,已经勾选“移除配音前后静音缓冲”

问题根源在于视频慢速拉伸了字幕之间的静音间隙,而“移除配音前后静音缓冲”只移除每条配音音频内部的前后静音,不会改变字幕时间轴之间的间隔。你可以通过以下两步直接压缩字幕间的静音:1. 移除字幕间的空隙:进入菜单 → 工具 → 高级选项 → 字幕声音画面对齐,找到并勾选“移除字幕间的空隙”(或英文 remove_silent_mid)。此选项会压缩或裁剪掉字幕之间的静音段,让配音衔接更紧凑。2. 配合加速语速:在主界面“设置更多参数”中,将配音语速设为 +15+20(加速15%~20%),缩短每句朗诵时长。如果步骤1的选项找不到,请提供软件版本号(左上角数字)及高级选项页面的截图,以便定位具体名称。另外,如果已经勾选“移除字幕间的空隙”后仍感觉间隔大,说明原始字幕的静音间隙过长,可以考虑在语音识别时将“最长语音持续秒数”设小(如4~6秒)、“最短语音持续毫秒”设大(如2000ms以上),以减少无效停顿。

我感觉以前的版本挺好的,直接缩放视频速度就可以对齐,也不修改时间轴,最新的版本感觉不太好用,容易出现音画不同步的问题

根据你描述的现象(旧版视频慢速不修改时间轴,新版修改),根本原因在于 v4.05 版升级了对齐引擎 SpeedRate,使其在视频慢速时会更精确地重算字幕的时间轴,以实现更严格的音画同步。这一改动导致了时间轴被拉伸,与你的预期不符。

如果你坚持要保留旧版行为(不修改时间轴,仅依靠视频慢速对齐画面),目前有两个有效方案:


方案一:完全回到旧版逻辑(推荐)

只使用“音频加速”并取消“视频慢速”,然后调高音频加速的极限值。

  1. 主界面第5行:取消勾选“视频慢速”,仅勾选“音频加速”
  2. 进入 菜单 → 工具 → 高级选项 → 字幕声音画面对齐,将 “音频加速最大倍数” 设为 200(默认100,可设到300)。
  3. 该方法会让软件只对配音音频进行倍速处理(最高可加速到2倍或3倍),视频帧率和字幕时间轴完全保持原样,不会出现你遇到的时间轴修改问题。
如果某些片段配音仍比原音频长很多,音频加速可能产生轻微加速感,但不会修改时间轴,也不会有画面慢放造成的卡顿。

方案二:限制新版视频慢速的副作用

同时保留视频慢速,但通过辅助参数减少时间轴变动:

  1. 同时勾选 “音频加速”+“视频慢速”(软件会优先用音频加速,音频加速不够时才触发视频慢速)。
  2. 高级选项中,将 “视频慢放最大倍数”10 改为 23
  3. 提高 配音语速(主界面“设置更多参数”中填 +15+25),缩短配音时长,降低视频慢速触发频率。
  4. 在高级选项 → 字幕配音调整,勾选“移除配音前后静音缓冲”“移除字幕间的空隙”(remove_silent_mid),让字幕衔接更紧凑。
结合以上设置,你依然会用视频慢速来对齐,但触发次数大大减少,时间轴偏离程度也会被压低。

关于“等待一段时间才念下一条字幕”的彻底解决

你已勾选“移除配音前后静音缓冲”,但仍感觉有间隔,是因为字幕时间轴本身存在静音间隙(语音识别阶段留下的)。
请额外进行以下操作:
菜单 → 工具 → 高级选项 → 字幕声音画面对齐,找到并勾选“移除字幕间的空隙”(英文 remove_silent_mid)。这个选项会直接压缩或删除字幕与字幕之间的空白时间,效果最明显。

如果找不到该选项,请检查软件版本号(左上角数字)。v4.05 系列中此选项位于该位置。


总结

  • 保留时间轴不变:用方案一(仅音频加速,取消视频慢速)。
  • 保留视频慢速但最小化时间轴改动:用方案二并配合移除字幕间隙。
  • 配音间隔长:确保同时启用了“移除字幕间的空隙”和“移除配音前后静音缓冲”。

若以上仍无法满足,可考虑将软件回退至 v4.02 版本(官方文档站可下载旧版)。pyVideoTrans 的每次更新都可能调整对齐逻辑,选择适合你工作流的版本是合理的。

我只找到移除配音前后静音缓冲,没有找到移除字幕间的空隙

你说的对,v4.05 系列版本中确实没有“移除字幕间的空隙”这个独立选项,它仅在旧版存在或已合并进其他设置。现在要解决字幕间静音过长的问题,最直接的方法是从字幕本身下手——因为你的中文字幕是人工翻译并导入的,字幕间原有时间轴空隙被保留了下来。解决方案(二选一):方案A:手动压缩字幕时间轴(推荐,效果最彻底)用任何文本编辑器打开你的中文字幕 SRT 文件。找到每条字幕的结束时间与下一条字幕的开始时间之间的空隙(通常有几毫秒到几秒不等)。将每条字幕的结束时间修改为更接近下一条的开始时间(例如保留0.2秒的间隙即可)。 修改示例:原内容:1 00:00:01,000 --> 00:00:03,460 文本1 2 00:00:03,953 --> 00:00:08,186 文本2 可将第1条的结束时间改为 00:00:03,950,减少3.46到3.953之间的0.493秒间隙。 批量处理工具:可以使用字幕编辑软件(如 Subtitle Edit)或 Python 脚本自动压缩间隙为固定值(如0.2s)。如果你不熟悉手动操作,可在日志中说明你希望我们提供一段自动处理的Python脚本。方案B:在语音识别阶段重新生成紧凑字幕如果你不介意重新生成字幕,可以:在主界面勾选“清理已生成”。在ASR渠道选择时,进入“高级选项 → 语音识别参数”,将“最短语音持续毫秒”设为 2000-3000,将“最长语音持续秒数”设为 6-8,并勾选“合并过短字幕到邻近”。这样软件重新识别的字幕会更加紧凑,静音间隙很小。然后你在翻译阶段再导入你的中文翻译结果(需要覆盖生成的英文字幕)。过程稍繁琐但效果可预期。如果你希望保持当前字幕时间轴不变,仅依靠配音时压缩静音,目前只能通过手动编辑SRT文件来实现,因为软件本身没有提供对应的自动化选项。我建议优先尝试方案A,只需将每条字幕的结束时间提前到比下一条开始时间早0.2秒左右,即可消除大部分等待感。如果你需要,我可以为你提供一段Python脚本自动完成此任务。

如果是讲师,说一句话,然后进行操作的,视频,是不是就不合适了

是的,对于讲师视频(边说边操作,中间有操作停顿),之前的建议(压缩字幕间隙、移除静音缓冲)确实不合适。因为操作停顿本身就是视频内容的一部分,配音在停顿期间保持静音是正常且合理的,强行压缩会导致:1. 操作画面还在进行,但配音已经提前进入下一句,造成声画错位。2. 讲师的操作节奏被打乱,看起来不自然。针对讲师视频,正确的处理方式应该是:完全不压缩字幕间隙,也不移除配音前后静音缓冲。 你之前提到的“每念完一条字幕,都要等一段时间,才会继续念下一条”正是这种视频类型的预期行为——配音朗读完一句后,静音期间让观众观看操作,没有声音是合理的。如果你仍然觉得等待感太长(即操作间隙太安静、太突兀),有且仅有一个温和的改善方法:在主界面“设置更多参数”中,勾选“分离人声背景声”,并勾选“嵌入背景”,同时设置一个合适的“背景音量”(如 0.3~0.5)。这样在配音静音期间,背景音乐会持续播放(如果原始视频没有背景音,可以额外添加一个背景音频文件),填补无声空缺,让过渡更自然,而不破坏时间轴。总结调整建议:- 进入 菜单 → 工具 → 高级选项 → 字幕配音调整,取消勾选“移除配音前后静音缓冲”(如果之前勾选了)。- 确保 菜单 → 工具 → 高级选项 → 字幕声音画面对齐 中 没有“移除字幕间的空隙”选项(v4.05 没有此项,不用管)。- 主界面保持勾选“视频慢速”不动,不要再额外勾选“音频加速”(否则会加速配音,导致操作期间配音过快)。- 如果觉得操作间隙太过安静,采用上述背景音乐方案填补,而不是压缩时间轴。这样既能保留讲师的自然节奏,又不会导致音画不同步。如果你之前因为按我们的建议而修改了设置,请恢复原状。讲师视频是一种典型的非连续说话视频,pyVideoTrans 的默认行为(保留字幕时间轴)对这类视频是合适的。

这是正常的
例如原始字幕区间时长3秒,配音后时长变为了5秒,通过视频慢速将该区间视频片段延长到5秒和配音对齐,那么字幕时间轴也必须延长到5秒,否则说话还没结束,字幕就不显示了

如果说之前版本没有改变时间轴,那是之前版本有bug,字幕声音没有精确对齐

Post Your Reply
Open source and free maintenance is not easy. If this project is helpful to you, please consider making a small donation to help the project continue to maintain and update.

Dondate via ko-fi.com

Dondate via PayPal

Related resource