[Fansubbing] PyFX

delacroix01

Eroge Addict
Messages
852
Reaction score
131
Points
43
Credits
0
50119 said:
PyFX là script làm karaoke tớ viết bằng Python.
PyFX rất giống với SSA Pawaa xD~ của Tenka_Muteki-7X3, do script này tớ vốn viết để thay thế cho SSA Pawaa xD~.
PyFX hiện giờ thì đã dùng được để tạo effect như script của Tenka_Muteki-7X3, nhưng code base vẫn còn rất bề bộn lung tung. PyFX lâu nay tớ không viết tiếp và cũng nghỉ fansub rồi nên đưa ra đây, ai có hứng thứ thì lấy về nghiên cứu viết tiếp cho nó hoàn chỉnh.

Script cải tiến một số thứ sau so với SSA Pawaa xD~:
-Tương thích Python 2.6
-Parse file ass để extract style & karaoke info, thay vì phải chỉnh toàn bộ trong script
-Tính toán tọa độ syl khác với SSA Pawaa xD~, có thể chính xác hơn và cũng có thể kém hơn
-Hỗ trợ tag \kt khi parse, xóa space bằng {\k0}
-Fix lỗi khi parse karaoke có khoảng trắng
-Hỗ trợ nhiều style trong 1 file ass (nhưng vẫn dùng 1 font)
-Hỗ trợ inlinefx như Aegisub Kara-Templater
-Hỗ trợ canh Position bằng margin
-Tính toán lead effect khác SSA Pawaa xD~
-Effect per-char và per-syl cùng lúc
-Tính toán time và position toàn bộ trước khi xử lí effect
-Dùng Unicode thay vì ANSI
-Nhiều thứ lặt vặt khác

Known issues:
-calpospix() với kanji phải xài font *.ttc, else resulting in rubbish
-calpospix() có vấn đề với một số font nhất định
-tính toán position không chính xác, syl và char lệch nhau

Requirements:
Python 2.6 - older versions may (not) work
PIL 1.1.6

Mã nguồn + sample scripts:
MediaFire Mirror
Megaupload Mirror
50119 said:
các functions trong pyfx_base.py

Code:
[COLOR="Green"]converttime(_var_tem_scr_, _tem_con_tip_)[/COLOR]
_tem_con_tip_:
1: chuyển ass time string -> milisecond
2: ngược lại
_var_tem_scr_:
chuỗi ass time hoặc milisecond

Code:
[COLOR="Green"]getlines(_str_ass_scr_)[/COLOR]
đọc file ass và trả về dạng list các dòng trong file
_str_ass_scr_:
đường dẫn tới file ass
converttime(_var_tem_scr_, _tem_con_tip_)
_tem_con_tip_:
1: chuyển ass time string -> milisecond
2: ngược lại
_var_tem_scr_:
chuỗi ass time hoặc milisecond

Code:
[COLOR="Green"]getlines(_str_ass_scr_)[/COLOR]
đọc file ass và trả về dạng list các dòng trong file
_str_ass_scr_:
đường dẫn tới file ass

Code:
[COLOR="Green"]classifylines(_lis_lin_scr_)[/COLOR]
đọc list các line và phân loại line
trả về (PlayResX, PlayResY), styles, karaokes
styles: list các dòng style
karaokes: list các dòng Dialogue
Code:
[COLOR="Green"]parsestyles(_lis_sty_scr_)[/COLOR]
parse list các dòng style và trả về list styleinfo
format: dict của style có tên stylename là styleinfo[stylename], gồm các chuỗi với giá trị tương ứng:
Fontname, Fontsize,
PrimaryColour, PrimaryColourAlpha, SecondaryColour SecondaryColourAlpha, OutlineColour, OutlineColourAlpha, BackColour, BackColourAlpha,
Bold, Italic, Underline, StrikeOut,
ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding

Code:
[COLOR="Green"]parsekaraoke(_lis_kar_scr_, _scr_spa_del_, _div_tem_car_)[/COLOR]
parse các dòng karaoke và trả về karainfo
format: list các dict lineinfo
lineinfo gồm có 3 cặp giá trị:
-LineInfo:
dict gồm có: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, LineDuration, LineText, LineTextStripped
-SylInfo:
list các dict, mỗi dict có: syl, sylstart, sylend, inlinefx, syldur, sylindex
-CharInfo
list các dict, mỗi dict có: char, cis (char index - syl), cil (char index - line), chardur, charend, charstart, sylindex (index của syl chứa char)

_lis_kar_scr_: list các dòng Dialogue
_scr_spa_del_: true: thêm {\k0} vào các khoảng trống, false: skip
_div_tem_car_: chia đều thời gian của syl ra cho các char

inlinefx gán bằng {\-inlinefxstring} trong file ass, nếu không thì có giá trị 'Default'
thời gian của char được chi phối bởi _div_tem_car_
hỗ trợ \kt khi parse

Code:
[COLOR="Green"]gerposinf(_kar_aln_scr_)[/COLOR]
trả về cặp giá trị (v, h) tương ứng với alignment, dùng để tính position
_kar_aln_scr_: alignment

Code:
[COLOR="Green"]gerkarpos(_dad_kar_lis_, _dad_sty_lis_, _nom_fon_win_, _adj_scx_fon_, _kar_pos_pre_)[/COLOR]
tính toán tọa độ và trả về karainfo
karainfo giống như karainfo trả về bởi parsekaraoke(), chỉ thêm vào key 'Positioning' vào các dict LineInfo, các dict syl và các dict char
Position trả dict có các key sau:
LineInfo: lwidth, lheight, lleft, lcenter, lright, ltop, lmiddle, lbottom
Syl: swidth, sheight, sleft, scenter, sright, stop, smiddle, sbottom
Char: cwidth, cheight, cleft, ccenter, cright, ctop, cmiddle, cbottom
_dad_kar_lis_: karainfo trả về bởi parsekaraoke()
_dad_sty_lis_: styleinfo trả về bởi parsestyles()
_nom_fon_win_: tên font
_adj_scx_fon_: chỉnh lại đổ lớn của font nhằm khắc phục sai lệch do tính toán độ lớn text của PIL và VSFilter / libass khác nhau
_kar_pos_pre_: mức độ làm tròn số của position

Code:
[COLOR="Green"]parassscr(_nom_ass_scr_, _kar_spa_del_, _div_tem_car_)[/COLOR]
tổng hớp các function trên (trừ tính position)
trả về karaokeinfo, styleinfo
các biến sau được ghi trong __builtin__ để gọi trực tiếp từ script karaoke:
__builtin__.PlayResX, __builtin__.PlayResY
__builtin__._lis_cab_scr_: list các line script info
__builtin__._lis_lin_scr_: list các line karaoke, gồm 3 list, hiện tại chỉ dùng list đầu, 2 list sau có thể dùng để tạo file avs nếu cần

Code:
[COLOR="Green"]gerlintex(_lis_lin_tex_)[/COLOR]
tạo linetext
_lis_lin_tex_: list có dạng [tags, text, tags, text, ...]

Code:
[COLOR="Green"]germargin(_var_mar_scr_)[/COLOR]
chuyển margin ra chuỗi dể ghi vào file ass
_var_mar_scr_: margin

Code:
[COLOR="Green"]gerasseve(fmt = 'Dialogue', lay = 0, sta = 0, end = 0, sty = 'Default', nom = '', mgl = 0, mgr = 0, mgv = 0, eff = '', tex = '', ger = True, scr = 0)[/COLOR]
tạo line và thêm vào __builtin__._lis_lin_scr_[scr]
Code:
[COLOR="Green"]gerdadlin(_dad_lin_lis_)[/COLOR]
trả về các biến line, xem list các biến
_dad_lin_lis_: dict info của line

Code:
[COLOR="Green"]gerdadsil(_dad_lin_lis_, _lin_sil_ind_)[/COLOR]
trả về các biến syl, xem list các biến
_dad_lin_lis_: dict info của line
_lin_sil_ind_: syl index

Code:
[COLOR="Green"]gerdadcar(_dad_lin_lis_, _lin_car_ind_)[/COLOR]
trả về các biến char, xem list các biến
_dad_lin_lis_: dict info của line
_lin_car_ind_: char index

Code:
[COLOR="Green"]gerdadsty(style, styleinfo)[/COLOR]
trả về các biến của style
style: tên style
styleinfo: biến trả về bởi parsestyles()

Code:
[COLOR="Green"]gerassscr(_nom_otp_scr_, _ger_cab_scr_, _lis_eve_ide_ = 0)[/COLOR]
tạo file
_nom_otp_scr_: dường dẫn file output
_ger_cab_scr_: true: tạo ass script info, false: skip
_lis_eve_ide_: index của 1 trong 3 list các line của __builtin__._lis_lin_scr_

trong pyfx_base.py còn các function tạo tag và tạo vector drawing
50119 said:
list các biến, được ghi vào __builtin__ để gọi thẳng từ script karaoke:

gerdadlin() variables:
lin_tex_scr = Line Text
lin_tex_str = Line text Stripped
lin_lay_scr = Line Layer
lin_sta_scr = Line Start
lin_end_scr = Line End
lin_dur_scr = Line Duration
lin_sty_scr = Line Style
lin_nom_scr = Line Name
lin_mgl_scr = Line MarginL
lin_mgr_scr = Line MarginR
lin_mgv_scr = Line MarginV
lin_eff_scr = Line Effect

lin_lar_atu = Line Width (Floating Point)
lin_alt_atu = Line Height (Floating Point)
lin_col_ini = Line Left (Floating Point)
lin_col_mid = Line Center (Floating Point)
lin_col_fin = Line Right (Floating Point)
lin_lin_ini = Line Top (Floating Point)
lin_lin_mid = Line Middle (Floating Point)
lin_lin_fin = Line Bottom (Floating Point)

lin_qua_sil = Number Of Syllables In Line
lin_qua_car = Number Of Characters In Line


gerdadsil() variables:
sil_tex_str = Syl Text
sil_tem_ini = Syl Start
sil_tem_fin = Syl End
sil_ifx_scr = Syl In-Line Effect (default: 'Default')
sil_dur_scr = Syl Duration
sil_lin_ind = Syl Index

sil_lar_atu = Syl Width (Floating Point)
sil_alt_atu = Syl Height (Floating Point)
sil_col_ini = Syl Left (Floating Point)
sil_col_mid = Syl Center (Floating Point)
sil_col_fin = Syl Right (Floating Point)
sil_lin_ini = Syl Top (Floating Point)
sil_lin_mid = Syl Middle (Floating Point)
sil_lin_fin = Syl Bottom (Floating Point)


gerdadcar() variables:
car_tex_scr = Character Text
car_tem_ini = Character Start (Controlled By GerDivLet)
car_tem_fin = Character End (Controlled By GerDivLet)
car_dur_scr = Character Duration (Controlled By GerDivLet)
car_sil_ind = Character Index (Syl)
car_lin_ind = Character Index (Line)

car_lar_atu = Character Width (Floating Point)
car_alt_atu = Character Height (Floating Point)
car_col_ini = Character Left (Floating Point)
car_col_mid = Character Center (Floating Point)
car_col_fin = Character Right (Floating Point)
car_lin_ini = Character Top (Floating Point)
car_lin_mid = Character Middle (Floating Point)
car_lin_fin = Character Bottom (Floating Point)

sil_lar_atu = Syl Width (Floating Point)
sil_alt_atu = Syl Height (Floating Point)
sil_col_ini = Syl Left (Floating Point)
sil_col_mid = Syl Center (Floating Point)
sil_col_fin = Syl Right (Floating Point)
sil_lin_ini = Syl Top (Floating Point)
sil_lin_mid = Syl Middle (Floating Point)
sil_lin_fin = Syl Bottom (Floating Point)
Showcase
Explanation

http://vnsharing.net/forum/showpost.php?p=8308573&postcount=48
 
Top