主页/文档库/特效字幕
特效字幕#Aegisub#Karaoke#模板

Aegisub Karaoke 特效入门:从模板到粒子

Aegisub Karaoke 模板的工作原理、内联变量、代码块、执行顺序,附三个由浅入深的特效案例:渐变填色、跳跃字符、粒子爆发。

16 分钟阅读发布于 2026/07/10Smyx1ayang

Aegisub Karaoke 特效入门:从模板到粒子

Karaoke 字幕是 Aegisub 的标志性功能,但官方文档过于精简,新手看了半天模板代码也不知道怎么动手。这篇整理我做了几十首歌之后沉淀下来的方法论。

Karaoke 工作原理

Karaoke 字幕的本质是把一行字幕按音节切分成多段,每段有自己的起止时间。Aegisub 用 \k 标签标记每个音节:

{\k20}多{\k30}想{\k40}在{\k50}你{\k30}身{\k40}旁

数字是百分之一秒,所以 \k20 表示这个音节持续 0.2 秒。播放时 Aegisub 会从左到右逐个音节高亮,产生"跟唱"效果。

但这只是基础 Karaoke,没有特效。真正的特效要用 Karaoke 模板(kfx),通过 template line 或 template syl 把原始字幕转换成带特效的多行字幕。

模板类型

Aegisub 的 Karaoke 模板分四种:

  • code line:每行执行一次的代码块,定义变量和函数
  • code syl:每个音节执行一次,常用于预处理
  • template line:每行生成一次输出
  • template syl:每个音节生成一次输出

最常用的是 template syl,它能让每个音节独立动起来。比如要让每个字在出现时弹一下:

template syl:
!retime("syl", 0, 0)!{\an5\pos($cx, $cy)\fscx0\fscy0\t(0, 200, \fscx100\fscy100)}{\k$kdur}

逐字段拆解:

  • retime("syl", 0, 0):把字幕时间重设为当前音节的时间
  • \an5:对齐方式设为中心
  • \pos($cx, $cy):定位到音节中心坐标
  • \fscx0\fscy0:初始缩放为 0(不可见)
  • \t(0, 200, \fscx100\fscy100):0-200 毫秒内动画到 100% 缩放
  • \k$kdur:保留原 Karaoke 标签

执行后每个字会从无到有放大弹入。这是最基础的入场特效,几乎所有 KFX 都从这里开始。

内联变量

Aegisub 模板里 $xxx 形式的变量会被替换成实际值:

  • $start / $end:音节起止时间(毫秒)
  • $mid:音节中点时间
  • $dur:音节时长(毫秒)
  • $kdur:音节时长(百分之一秒)
  • $x / $y:音节左上角坐标
  • $cx / $cy:音节中心坐标
  • $left / $right / $top / $bottom:音节边界坐标
  • $syl:音节文本
  • $line:整行文本

变量能直接用在 \pos、\move、\t 里。比如要做"从左飞入":

{\move($left-100, $y, $x, $y, 0, 200)}{\k$kdur}

每个字从左边 100 像素外飞入到原位,200 毫秒完成。

代码块:定义函数

复杂特效需要循环、条件判断、随机数,这时要用 code 块定义 Lua 函数:

code once:
function random_offset(min, max)
  return math.random(min, max)
end

function ease_out_cubic(t)
  return 1 - math.pow(1 - t, 3)
end

然后在模板里调用:

template syl:
{\an5\pos($cx + random_offset(-5, 5), $cy + random_offset(-5, 5))}{\k$kdur}

每个字会有 ±5 像素的随机偏移,整体看起来不那么死板。

案例一:渐变填色

让每个字从灰色渐变到主题色:

template syl:
{\an5\pos($cx, $cy)\1c&HFFFFFF&\3c&H0BD557&\t($start, $end, \1c&H0BD557&)}{\k$kdur}
  • \1c&HFFFFFF&:初始填充色为白
  • \3c&H0BD557&:边框色为绿(G3 主题色)
  • \t($start, $end, \1c&H0BD557&):在音节时间内,填充色从白动画到绿

效果:每个字在唱到时由白渐变成绿。

案例二:跳跃字符

让每个字在出现时先向上跳一下:

code syl:
function jump_height(syl)
  return 30 + #syl * 5  -- 字数越多跳得越高
end

template syl:
!retime("syl", -100, 0)!{\an5\move($cx, $cy, $cx, $cy - jump_height("$syl"), 0, 150, 0.5)}{\move($cx, $cy - jump_height("$syl"), $cx, $cy, 150, 300, 0.3)}{\k$kdur}

move 标签的最后一个参数是加速度,0.5 表示前半段减速(上抛),0.3 表示加速下落。这是物理直觉:上抛是减速运动,自由落体是加速运动。

案例三:粒子爆发

每个字出现时炸出 8 个粒子向四周飞散:

code syl:
particle_count = 8

template syl:
!retime("syl", 0, 0)!{\an5\pos($cx, $cy)}{\k$kdur}
!for i = 1, particle_count do!
{\an5\pos($cx, $cy)\1c&H0BD557&\bord0\shad0\fscx30\fscy30\alpha&HFF&\move($cx, $cy, $cx + math.cos(i * math.pi / 4) * 80, $cy + math.sin(i * math.pi / 4) * 80, $start, $start + 400)\t($start, $start + 400, \alpha&H00&)\t($start + 400, $start + 600, \alpha&HFF&)}
!end!

解释:

  • !for i = 1, particle_count do! 循环 8 次
  • 每个粒子起始在音节中心,初始透明度 \alpha&HFF&(不可见)
  • 400 毫秒内沿圆周等分 8 个方向飞出 80 像素,同时透明度动画到 \alpha&H00&(完全可见)
  • 接下来 200 毫秒淡出到 \alpha&HFF&

效果:每个字唱到时,从中心炸出 8 个绿色粒子向四周飞散后消失。

调试技巧

Karaoke 模板写错了会导致整个字幕脚本崩溃,调试很麻烦。几个经验:

  • 用 !retime("syl", 0, 0) 后必须在末尾保留 {\k$kdur},否则播放器不识别为 Karaoke 行
  • 变量大小写敏感,$cx 和 $CX 不是一回事
  • 模板里写注释用 --,但只能在 code 块里写,template 块里写注释会原样输出
  • 复杂模板先在空工程里测试,避免污染原工程

Aegisub 还内置了 Karaoke 模板调试器(菜单:自动化 > Karaoke 模板),可以看到每条模板生成的实际输出,逐行排查问题。

翻译理论札记

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

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

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

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