主页/文档库/工具链
工具链#Aegisub#Karaoke#快捷键

Aegisub 工作流:快捷键、样式与Karaoke

总结长期使用 Aegisub 沉淀的快捷键组合、样式管理库、Karaoke 模板入门与批量操作技巧,让时轴与特效字幕并行推进。

12 分钟阅读发布于 2026/05/30Smyx1ayang

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)

时轴与特效并行

传统工作流是先打完时轴再做特效,效率低。我的做法是并行:

  1. 主时轴员负责对白时间戳
  2. 特效师提前做好模板,在最终对白导入后套用
  3. 歌曲字幕(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 记录:

  • 项目名、集数、时长
  • 制作人员名单
  • 使用的样式版本
  • 已知问题与待修复列表
  • 修订历史

这套归档规范让我三年前的项目现在还能打开重做。

翻译理论札记

写到这里想插入一段翻译理论的思考。奈达的功能对等强调译文读者读到译文时的反应,应当与原文读者读到原文时的反应基本一致,这意味着翻译不是字面替换,而是要在目标语里重新构造等值效果。我们做字幕,观众在屏幕前只有几秒钟读完一行字,反应时间被严重压缩,所以功能对等在字幕里被推到了极端——可读性优先于忠实度。

纽马克的区分更实用:交际翻译关注译文效果,语义翻译关注原文意义。字幕绝大多数时候走交际翻译路线,但遇到关键术语、专有名词、文化负载词时又要切回语义翻译,避免观众被误导。这两条路线在字幕里不停切换,做久了会形成直觉。

韦努蒂的归化异化是另一条轴线。归化是让译文流畅得像目标语原创,异化是保留原文的陌生感。日漫字幕里大量保留"前辈""学园""王道"等词就是异化,因为这些词在中文语境里已经形成了稳定的亚文化共识,强行归化反而失味。但纪录片、欧美剧的台词又需要强归化,否则观众跳戏。题材决定策略,没有一招通吃的方案。

—— 这些理论看起来抽象,但实际做字幕时每天都在用,只是未必意识到。把直觉变成方法论,是新人到熟手的分水岭。