delacroix01
Eroge Addict
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
_tem_con_tip_:Code:[COLOR="Green"]converttime(_var_tem_scr_, _tem_con_tip_)[/COLOR]
1: chuyển ass time string -> milisecond
2: ngược lại
_var_tem_scr_:
chuỗi ass time hoặc milisecond
đọc file ass và trả về dạng list các dòng trong fileCode:[COLOR="Green"]getlines(_str_ass_scr_)[/COLOR]
_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
đọc file ass và trả về dạng list các dòng trong fileCode:[COLOR="Green"]getlines(_str_ass_scr_)[/COLOR]
_str_ass_scr_:
đường dẫn tới file ass
đọc list các line và phân loại lineCode:[COLOR="Green"]classifylines(_lis_lin_scr_)[/COLOR]
trả về (PlayResX, PlayResY), styles, karaokes
styles: list các dòng style
karaokes: list các dòng Dialogue
parse list các dòng style và trả về list styleinfoCode:[COLOR="Green"]parsestyles(_lis_sty_scr_)[/COLOR]
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
parse các dòng karaoke và trả về karainfoCode:[COLOR="Green"]parsekaraoke(_lis_kar_scr_, _scr_spa_del_, _div_tem_car_)[/COLOR]
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
trả về cặp giá trị (v, h) tương ứng với alignment, dùng để tính positionCode:[COLOR="Green"]gerposinf(_kar_aln_scr_)[/COLOR]
_kar_aln_scr_: alignment
tính toán tọa độ và trả về karainfoCode:[COLOR="Green"]gerkarpos(_dad_kar_lis_, _dad_sty_lis_, _nom_fon_win_, _adj_scx_fon_, _kar_pos_pre_)[/COLOR]
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
tổng hớp các function trên (trừ tính position)Code:[COLOR="Green"]parassscr(_nom_ass_scr_, _kar_spa_del_, _div_tem_car_)[/COLOR]
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
tạo linetextCode:[COLOR="Green"]gerlintex(_lis_lin_tex_)[/COLOR]
_lis_lin_tex_: list có dạng [tags, text, tags, text, ...]
chuyển margin ra chuỗi dể ghi vào file assCode:[COLOR="Green"]germargin(_var_mar_scr_)[/COLOR]
_var_mar_scr_: margin
tạo line và thêm vào __builtin__._lis_lin_scr_[scr]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]
trả về các biến line, xem list các biếnCode:[COLOR="Green"]gerdadlin(_dad_lin_lis_)[/COLOR]
_dad_lin_lis_: dict info của line
trả về các biến syl, xem list các biếnCode:[COLOR="Green"]gerdadsil(_dad_lin_lis_, _lin_sil_ind_)[/COLOR]
_dad_lin_lis_: dict info của line
_lin_sil_ind_: syl index
trả về các biến char, xem list các biếnCode:[COLOR="Green"]gerdadcar(_dad_lin_lis_, _lin_car_ind_)[/COLOR]
_dad_lin_lis_: dict info của line
_lin_car_ind_: char index
trả về các biến của styleCode:[COLOR="Green"]gerdadsty(style, styleinfo)[/COLOR]
style: tên style
styleinfo: biến trả về bởi parsestyles()
tạo fileCode:[COLOR="Green"]gerassscr(_nom_otp_scr_, _ger_cab_scr_, _lis_eve_ide_ = 0)[/COLOR]
_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
Showcase50119 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)
Explanation
http://vnsharing.net/forum/showpost.php?p=8308573&postcount=48