Aegisub 工作流:快捷键、样式与Karaoke
总结长期使用 Aegisub 沉淀的快捷键组合、样式管理库、Karaoke 模板入门与批量操作技巧,让时轴与特效字幕并行推进。
Aegisub 工作流:快捷键、样式与Karaoke
Aegisub 是字幕组里用得最广的工具,但它的快捷键、样式管理、Karaoke 模板都需要时间沉淀。这篇整理我用了三年之后的工作流。
快捷键设置
Aegisub 默认快捷键不友好,我重新配置过:
| 功能 | 默认 | 我的设置 |
|---|---|---|
| 播放/暂停 | Space | Space |
| 后退 1 秒 | Left | Left |
| 前进 1 秒 | Right | Right |
| 设置入点 | [ | Q |
| 设置出点 | ] | W |
| 提交并下一行 | Enter | Enter |
| 上一行 | PageUp | PageUp |
| 下一行 | PageDown | PageDown |
| 播放当前行 | R | A |
| 播放当前行 +前后 500ms | T | S |
| 删除当前行 | Ctrl+Delete | Ctrl+D |
| 重复当前行 | Ctrl+D | Ctrl+R |
| 撤销 | Ctrl+Z | Ctrl+Z |
| 重做 | Ctrl+Y | Ctrl+Shift+Z |
核心思路是把入点出点放在 QW(左手食指位置),播放控制在 AS(左手小指),减少鼠标依赖。打时轴时左手全在键盘上,右手只负责音频波形的鼠标拖动。
样式管理库
每个字幕组应该维护一个统一的样式库。我的做法:
~/aegisub-styles/
├── default/
│ ├── default-zh.ass # 默认中文字幕样式
│ ├── default-ja.ass # 默认日文字幕样式
│ ├── default-en.ass # 默认英文字幕样式
│ └── default-ja-romaji.ass # 默认罗马音样式
├── themes/
│ ├── anime-modern/ # 现代日漫风格
│ ├── anime-classic/ # 经典日漫风格
│ ├── documentary/ # 纪录片风格
│ ├── movie/ # 电影风格
│ └── variety/ # 综艺风格
└── special/
├── top-screen.ass # 顶部字幕
├── side-notes.ass # 侧边注释
├── signs.ass # 画面文字翻译
└── lyrics.ass # 歌词字幕
每个 .ass 文件只包含样式定义,没有事件行。新建工程时复制需要的样式文件到工程目录,在 Aegisub 里"样式管理器 > 导入"。
样式命名的规范也很重要。我用三段式命名:
[题材]-[用途]-[语种]
比如 anime-default-zh、movie-signs-en。这样按字母排序时同题材的样式会聚在一起。
Karaoke 模板库
Karaoke 特效字幕是 Aegisub 的高级功能。我积累了 30 多个常用模板:
~/aegisub-kfx/
├── basic/
│ ├── fade-in.lua # 淡入
│ ├── fade-out.lua # 淡出
│ ├── scale-in.lua # 放大入场
│ └── slide-left.lua # 左滑入
├── intermediate/
│ ├── bounce.lua # 弹跳
│ ├── glow.lua # 发光
│ ├── rainbow.lua # 彩虹
│ └── shake.lua # 抖动
└── advanced/
├── particles.lua # 粒子爆发
├── shatter.lua # 碎裂
├── trail.lua # 拖尾
└── morph.lua # 形变
每个模板都是独立的 .lua 文件,包含 code 块和 template 块。使用时复制到工程的"自动化"目录,Aegisub 重启后就能在"自动化"菜单看到。
批量操作技巧
Aegisub 的 Lua 脚本能力很强,但很多新人不知道用。我常用的批量脚本:
批量替换
-- aegisub-scripts/batch-replace.lua
local script_name = "批量替换"
local script_description = "在整个字幕文件中批量替换文本"
local script_author = "TeamG3"
function batch_replace(subtitles, selected_lines, active_line)
local find_text = aegisub.dialog.display({
{class="edit", name="find", label="查找", x=0, y=0, width=4, height=1},
{class="edit", name="replace", label="替换", x=0, y=1, width=4, height=1},
{class="checkbox", name="regex", label="使用正则", x=0, y=2, width=4, height=1},
})
if not find_text then return end
for _, line in ipairs(subtitles) do
if line.class == "dialogue" then
if find_text.regex then
line.text = line.text:gsub(find_text.find, find_text.replace)
else
line.text = line.text:gsub(
find_text.find:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%0"),
find_text.replace
)
end
end
end
aegisub.set_undo_point(script_name)
end
aegisub.register_macro(script_name, script_description, batch_replace)
时间轴批量调整
-- aegisub-scripts/shift-timeline.lua
function shift_timeline(subtitles, selected_lines, active_line)
local result = aegisub.dialog.display({
{class="label", label="偏移量(毫秒,正数为延后)", x=0, y=0, width=4, height=1},
{class="intedit", name="offset", value=0, x=0, y=1, width=4, height=1},
{class="checkbox", name="selected_only", label="仅应用到选中行", x=0, y=2, width=4, height=1},
})
if not result then return end
local target_lines = result.selected_only and selected_lines or {}
if not result.selected_only then
for i, line in ipairs(subtitles) do
if line.class == "dialogue" then
table.insert(target_lines, i)
end
end
end
for _, i in ipairs(target_lines) do
subtitles[i].start_time = subtitles[i].start_time + result.offset
subtitles[i].end_time = subtitles[i].end_time + result.offset
end
aegisub.set_undo_point("时间轴批量调整")
end
aegisub.register_macro("时间轴批量调整", "批量偏移字幕时间", shift_timeline)
时轴与特效并行
传统工作流是先打完时轴再做特效,效率低。我的做法是并行:
- 主时轴员负责对白时间戳
- 特效师提前做好模板,在最终对白导入后套用
- 歌曲字幕(Karaoke)单独分给一位擅长 Karaoke 的人
这样三路并行,整个项目周期压缩到原来的 1/3。关键是模板要标准化,特效师做模板时不依赖具体的对白内容。
工程归档
每个项目完成后归档:
project-name/
├── raw/ # 原始素材
│ ├── video.mp4
│ ├── audio.wav
│ └── reference.srt
├── work/ # 工作目录
│ ├── project.ass # 最终工程文件
│ ├── project.old.ass # 历史版本
│ ├── styles/ # 样式文件
│ └── scripts/ # 使用过的 Lua 脚本
├── output/ # 输出目录
│ ├── soft.mkv # 软封装版本
│ ├── hard.mp4 # 硬压制版本
│ └── subtitles.zip # 字幕文件打包
└── README.md # 项目说明
README.md 记录:
- 项目名、集数、时长
- 制作人员名单
- 使用的样式版本
- 已知问题与待修复列表
- 修订历史
这套归档规范让我三年前的项目现在还能打开重做。
翻译理论札记
写到这里想插入一段翻译理论的思考。奈达的功能对等强调译文读者读到译文时的反应,应当与原文读者读到原文时的反应基本一致,这意味着翻译不是字面替换,而是要在目标语里重新构造等值效果。我们做字幕,观众在屏幕前只有几秒钟读完一行字,反应时间被严重压缩,所以功能对等在字幕里被推到了极端——可读性优先于忠实度。
纽马克的区分更实用:交际翻译关注译文效果,语义翻译关注原文意义。字幕绝大多数时候走交际翻译路线,但遇到关键术语、专有名词、文化负载词时又要切回语义翻译,避免观众被误导。这两条路线在字幕里不停切换,做久了会形成直觉。
韦努蒂的归化异化是另一条轴线。归化是让译文流畅得像目标语原创,异化是保留原文的陌生感。日漫字幕里大量保留"前辈""学园""王道"等词就是异化,因为这些词在中文语境里已经形成了稳定的亚文化共识,强行归化反而失味。但纪录片、欧美剧的台词又需要强归化,否则观众跳戏。题材决定策略,没有一招通吃的方案。
—— 这些理论看起来抽象,但实际做字幕时每天都在用,只是未必意识到。把直觉变成方法论,是新人到熟手的分水岭。