Aegisub 自动化 笔记

正则替换

选出每句话

正则表达式: ctrl+h调出搜索替换的框框,勾选使用正则表达式,搜索内容写入^替换内容写入你要添加的内容,注意\要转意,比如你要添加{\blur1}就要写入{\blur1}

选出每个字

(?=.)

数字取整数

(\d*)\.\d*
保留$1

Karaoke Template

简单记录一些Karaoke Template的编写语法。

格式

文本行特效写打Karaoke(可多行),代码行改注释,特效中加指定类型。选中所有行,运行脚本。

Template行特效类型

template pre-line

直接在句子前面加上代码。

template line

整句(line)进行代码操作。

将文本中的{\k__}替代为template line中的内容(文字或代码),例如:

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template line,测试
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,{\k1}a{\k1}b{\k1}c{\k1}d
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,测试a测试b测试c测试d

template syl

音节(syllable),即每个被{\k__}划分的字符,进行代码操作,并将字符以单行的形式显示。

需要注意的是,在第一个{\k__}前,会默认存在一个字符(即使是空)。

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template syl,测试
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,{\k1}a{\k1}b{\k1}c{\k1}d
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,测试
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,测试a
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,测试b
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,测试c
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,测试d

template syl char

对每个字符(character)进行操作。syl可写可不写,因为tempate默认是对音节进行操作的。

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template syl char,{\pos($sx,$sy)}
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,{\k100}one{\k100}two

Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\pos(588,360)}o
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\pos(609,360)}n
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\pos(631,360)}e
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\pos(648,360)}t
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\pos(667,360)}w
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\pos(692,360)}o

可以看到,以上代码把单个字符进行了分行,并指定到了对应的绝对位置。

template syl noblank

使生成代码时删去空行。

template syl notext

使生成代码时,所有文字被删除,但时间依然保留。

template syl noblank

使生成代码时删去空行。

template syl noblank notext

使生成代码时,只剩下有文字的,且被替换成了空行。

template syl keeptags

正常执行template时,形如{\an}的标签会被自动删除。为了保留标签,可以打上keeptags。

循环:template syl loop 5

正常执行template时,代码只会被执行一次。为了多次执行,可以打上loop+数字。

相关的内联变量:!j! !maxj!``!maxloop()!
说明:j为计数器,maxj为总的次数
maxloop()可以用来设置循环次数。如果此函数指定了循环,那么就不用再写“template loop xxx”。

例如

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template line loop 5,!j! | !maxj! | !j*100! 
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,{\k100}one{\k100}two{\k100}{\fs50}three{\k100}four

Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,1 | 5 | 100 one1 | 5 | 100 two1 | 5 | 100 three1 | 5 | 100 four
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,2 | 5 | 200 one2 | 5 | 200 two2 | 5 | 200 three2 | 5 | 200 four
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,3 | 5 | 300 one3 | 5 | 300 two3 | 5 | 300 three3 | 5 | 300 four
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,4 | 5 | 400 one4 | 5 | 400 two4 | 5 | 400 three4 | 5 | 400 four
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,5 | 5 | 500 one5 | 5 | 500 two5 | 5 | 500 three5 | 5 | 500 four

此处j代表循环此处,min和max都是j在运行中的最大和最小值。

template syl fx hk

正常执行template时,每一个音节都会被执行。为了只执行选定的音节,可以打上fx+标记;并在音节前加入相同的标记“-标记”。这时会对标记之后的音节执行操作。

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template syl fx hk,aaa
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,{\k100}one{\k100}two{\k100\-hk}three{\k100}four

Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,aaathree
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,aaafour

为了只执行选定范围的音节,可以在结束音节后添加一个无关标签表示结束。

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template syl fx hk,aaa
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,{\k100}one{\k100\-hk}two{\k100}three{\k100\-mc}four

Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,aaatwo
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,aaathree

实际上,每个音节的原始标记都是空的。与fx相关的内联函数为`!syl.inline_fx!,用于获取指定音节的标签名

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template syl,!syl.inline_fx!
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,{\k100}one{\k100\-hk}two{\k100}three{\k100\-mc}four

Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,one
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,hktwo
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,hkthree
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,mcfour

code syl

在code语句中可以加入lua语句。

! !来表示代码块。

模板

clip – 由左至右消失

{\pos($sx, $sy)\clip($sleft, $stop, $sright, $sbottom)\t($sstart, !$sstart+$sdur!, 1, \clip($sright, $stop, $sright, $sbottom))}

iclip – 由左至右显现

{\pos($sx, $sy)\iclip($sleft, $stop, $sright, $sbottom)\t($sstart, !$sstart+$sdur!, 1, \iclip($sright, $stop, $sright, $sbottom))}

内联变量

自适应变量 Automatic variants

时间类 $start $end $mid

行或音节的开始时间、结束时间、中点时间,行是绝对时间,音节是相对行的时间(通用,自动进行判断)

以下代码可以实现单词逐一fade出现:

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template line,{\alpha&HFF\t($start,$end,\alpha&H00)}
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,{\k100}one{\k100}two{\k100}three{\k100}four

Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\alpha&HFF\t(0,1000,\alpha&H00)}one{\alpha&HFF\t(1000,2000,\alpha&H00)}two{\alpha&HFF\t(2000,3000,\alpha&H00)}three{\alpha&HFF\t(3000,4000,\alpha&H00)}fourr
行持续时间

!line.duration!
$ldur
以上二者均可以表示行的持续时间,但是如果!line.duration!出现在retime函数后,其返回值变化。$ldur始终返回原字幕的持续时间。

位置类 $lleft $lright $ltop $lbottom

例如,表示一句话的完整clip范围

clip($lleft,$ltop,$lright,$lbottom)

$sx $sy
以上代码可以同样用template syl与$sx $sy来实现。$sx$sy是音节在默认对齐方式下的绝对位置(x,y),配合\pos和\move使用。

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template syl,{\alpha&HFF\t($start,$end,\alpha&H00)\pos($sx,$sy)}
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,{\k100}one{\k100}two{\k100}three{\k100}four

Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\alpha&HFF\t(0,0,\alpha&H00)\pos(452,23)}
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\alpha&HFF\t(0,1000,\alpha&H00)\pos(495,23)}one
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\alpha&HFF\t(1000,2000,\alpha&H00)\pos(579,23)}two
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\alpha&HFF\t(2000,3000,\alpha&H00)\pos(679,23)}three
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,{\alpha&HFF\t(3000,4000,\alpha&H00)\pos(783,23)}four

$lx $ly

对\pos代码使用的x,y坐标(当对齐方式未被重写时)

syl.width音节所占的宽度

$lcenter $lmiddle

句子/音节(s)默认中心位置
例如:获得单个字/音节逐个变大的K效果

an5\pos($scenter,$smiddle)\1a&HFF&\t($start,$end,\bord13\3a&HFF&)

Lua语法

更多Lua语法相关请转到单独文章:Lua For Aegisub

lua数学函数

绝对值 math.abs(a)
向下取整 math.floor(a)
向上取整 math.ceil(a)
正切 math.tan(a)
a^b math.pow(a,b)

计算

用!和!来表示lua语句和运算。

例如:

行结束时间

行结束时间
$lend
又可以写作
!$lstart+$ldur!

数值运算

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template syl,!100+99!
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,文字

Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,199
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,199文字

文字

" "string,用 ..来连接字符串。

Comment: 0,0:00:00.00,0:00:00.00,CN_UP,,0,0,0,template syl,!"AB".."CD"!
Comment: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,karaoke,文字

Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,ABCD
Dialogue: 0,0:00:00.00,0:00:05.00,CN_UP,,0,0,0,fx,ABCD文字

设置层

!relayer()!

重复文字

!syl.text_stripped!可以使文字重复一次,并带上此函数后面的标签。

生成随机数

!(math.random(10,80))!表示生成一个10~80之间的随机数

赋值/调用

!remember("变量名",值)!
!recall.变量名!
这两个函数不能隔行使用。

用table来实现全局记忆的随机数

注意:此处用的是无序表。

Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,code once,rd = {time = math.random(500,1000)}
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,template char,!rd.time!
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,karaoke,test 

颜色函数

更多颜色函数,查看颜色和渐变
_G.ass_color()
这是一个用来设定转换颜色的函数,ass表示颜色的格式,_G.ass_color(42,220,187)即表示HBBDC2A色

例如,生成随机颜色

{\1c!_G.ass_color(math.random(255),math.random(255),math.random(255))!}

重设时间函数retime

标准格式:retime("mode",调整时间t1,调整时间t2)
注:t1,t2是相对于当前模式下的开始结束时间的偏移量。
retime手册

模式

syl
start_time= line.start_time + syl.start_time + t1
end_time= line.start_time + syl.end_time + t2
开始时间为音节的开始时间,结束时间为音节的结束时间,即k标签的开始到结束时间。

presyl
start_time
end_time =line.start_time + Syl.start_time + t1/t2
开始结束时间均为音节的开始时间,通常用于提前音节的开始时间。
举例:音节出现前的修饰图案,例如桜都巨人4的ED。

postsyl
start_time
end_time =line.start_time + Syl.end_time + t1/t2
开始结束时间均为音节的结束时间

line
开始时间为行的开始时间,结束时间为行的结束时间。

preline
开始结束时间均为行的开始时间。

postline
开始结束时间均为行的结束时间。

start2syl
开始时间为行的开始时间,结束时间为音节的开始时间。

syl2end
开始时间为音节的结束时间,结束时间为行的结束时间。

setorabs
开始时间为t1,结束时间为t2。
例:逐帧抖动

Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,template line,!maxloop($ldur/1000*24)!!retime("abs",(j-1)*1000/24,j*1000/24)!{\an5\pos(!$scenter+math.random(-10,10)!,!$smiddle+math.random(-10,10)!)}
Dialogue: 0,0:00:00.00,0:00:00.85,Default,,0,0,0,,{\k33}献{\k33}上{\k33}心{\k33}脏{\k33}!

sylpct
start_time = line.start_time + syl.start_time + t1*syl.duration/100
end_time = line.start_time + syl.start_time + t2*syl.duration/100
开始结束时间为音节的开始时间+(t*音节持续时间ms/100)

音节序数内联函数$si

si是一个表示音节位次的函数。例如
单句: 心 臓 を 捧 げ よ
序数: 1 2 3 4 5 6

在未设置k的时候,可以自建一个计数器ci

返回视频一帧的持续时间

_G.aegisub.ms_from_frame(1)
参数为视频的有效帧数编号

返回视频大小

_G.aegisub.video_size()

逻辑语句

见专题文章。And和Or

保留指定位数函数[1]

function num(origin,count) a=origin*(10^count); a_j=a-math.modf(a); if math.abs(a_j)>=0.5 then num_out=math.modf(a+origin/math.abs(origin))/(10^count); else num_out=math.modf(a)/(10^count);end; return num_out; end;
function num(origin,count) 
    a=origin*(10^count); 
    a_j=a-math.modf(a); 
    if math.abs(a_j)>=0.5 
        then
        num_out=math.modf(a+origin/math.abs(origin))/(10^count);
        else 
        num_out=math.modf(a)/(10^count);
    end; 
    return num_out; 
end;

Yutils 文字转图形

见相关专题

参考

  1. ^https://www.bilibili.com/video/BV1zE411Z7wJ
标题:Aegisub 自动化 笔记
作者:IKK
除转载和特殊声明外,所有文章采用 CC BY-NC-SA 4.0协议
上一篇
下一篇