tmdtmdtmdqq 发表于 2024-10-27 12:34:26

【探讨总结】官中字幕词句通用修改思路

本帖最后由 tmdtmdtmdqq 于 2024-11-16 12:41 编辑

针对srt首次转为ass的官中字幕(被他人添加过样式/屏幕字的ass官中字幕不可用以下规则!(替换比较暴力,该过的字幕容易误判而导致改错))

因地域语言差异,以下某些规则可能只适用于简体文字的语言习惯。
欢迎探讨和补充更多的官中字幕的词句通用修改思路。

2024/10/27 Init v1.0
2024/11/13 Update v1.1: 增加省略号的替换规则,增加提示中显示aegisub行号功能
2024/11/14 Update v1.2: 增加单行字幕字数超长提示(默认30个utf-8字),
                                       增加\N两侧没有特殊符号,则把\N直接删掉的规则【sommio提议】(默认不启用)
2024/11/16 Update v1.3: 脚本中的换行符换成\n适配linux系统,
                                       增加日文的直角引号符替换成中文的直角引号符【sommio提议】,
                                       增加句子两端的英文半角括号替换成中文括号的规则【sommio提议】(默认不启用)
                                       增加句中存在括号时的提示



以下均为正则表达式
序号类型查找目标(已正则转义)替换为 备注
01替换 [‧.・] · 间隔号(人名中间的点号)
02替换[!!]!感叹号替换为英文半角的。或替换为中文字符“!”,反正统一观感就行
03替换[\??]?疑问号替换为英文半角的。或替换为中文字符“?”,反正统一观感就行
04替换!\?|!?|\?!|?!?!疑问感叹号(日文用!?,而中文用?!)替换为英文半角的。或替换为中文字符“?!”,反正统一观感就行
05替换...…
三个英文句号替换成半个中文省略号
06替换「「
日文的左直角引号替换成中文的
07替换」」
日文的右直角引号替换成中文的
08替换多次
(,,0,0,0,,[^,,\r\n]*?)[,,]$1去除句中逗号。如果句中逗号后面没有空格,则替换为$1后面加个空格,即“$1 ”(不含双引号,后面有空格)。要替换多次,直至找不到为止
09替换多次(,,0,0,0,,[^"\r\n]*?)"([^"\r\n]+)"$1「$2」英文双引号""替换为「」。要替换多次,直至找不到为止
10替换多次(,,0,0,0,,[^“\r\n]*?)“([^”\r\n]+)”
$1「$2」中文双引号“”替换为「」。要替换多次,直至找不到为止
11查找多次\\N \N为ass字幕的换行符,一般替换成空格或分割成两行不同时间的字幕或直接删掉变成一行

12查找多次[耶啦欸诶]根据句意去除/替换台湾腔语气词 耶、啦、欸、诶 为 啊、吧、呀 之类的

13查找多次怎样 看情况替换成 怎么回事/什么情况

14查找多次满 看情况替换成 挺/蛮/颇

15查找多次是说
看情况替换成 话说

16查找多次没差 看情况替换成 没所谓/都可以/差不多



写了个python脚本按上面规则简单处理了一下,能将.srt文件转换为.ass文件输出,会删除繁化姬行备注
python <official_subtitle_processor.py路径> <字幕文件/目录1> <字幕文件/目录2> ... <字幕文件/目录N>

例:
python "Z:\official_subtitle_processor.py" d:\1.ass z:\2.srt "c:\3 4.ass" "d:\zimu dir"
或者用里面的脚本建立个快捷方式,直接把多个字幕/目录拖进去快捷方式图标就行
处理后的字幕后缀为 .formatted.ass,存在源字幕对应的目录下
● 不需要日志文件则将代码中的log_save_to_file变量改为False
● 程序结束时候不想按下Enter再结束则将stop_after_finished_process变量改为False
● 不需要在提示中显示aegisub行号,则将tips_show_aegisub_line_num变量改为False
● #号打头的行号是文档编辑工具(记事本之类)的行号,A打头的行号是Aegisub的行号
● 单行最大字数提示(遇到\N当两行),想修改提示的最大字数阈值,则将single_line_max_char_num变量修改为你想要的字数
● 对于默认不启用的规则,如需启用则把下面规则对应行前面的#号去掉(#号前面的空格不能删)
○ 【sommio提议】\N的两侧没有特殊符号,则把\N直接删掉,此规则默认不启用。(v1.3版代码在68行):    #text = re.sub(r'(,,0,0,0,,[^\r\n]*?[^\d\s\(\)()"《》“”「」-])\\N([^\d\s\(\)()"“”「」-])', r'\1\2', text)
○【sommio提议】句子两端的英文半角括号替换成中文括号,此规则默认不启用。(v1.3版代码在70行):
    #text = repeat_replace(lambda x: re.sub(r'(,,0,0,0,,(?:[^\r\n]*?\\N|))\(([^\(\r\n]+?)\)(\\N|[\r\n]|$)', r'\1(\2)\3', x), text)
● srt转成ass补充的字幕元数据信息(字体、颜色、字幕位置等),需要修改则自行修改ass_header变量
● 需要增改替换规则,则修改process_using_rules方法
● 需要增改潜在错误的查找规则,则修改grep_using_rules方法
以上这些变量和方法都定义在脚本的开头,一打开文件就能找到









sommio 发表于 2024-11-13 17:13:39

我还会正则合并些多行字幕,感觉多行不怎么合阅读习惯。


仅适用于 SRT ([^-\d\s\(\\)()"《》])\n([^-\d\s\(\\)()"]) $1$2

tmdtmdtmdqq 发表于 2024-11-14 01:56:53

本帖最后由 tmdtmdtmdqq 于 2024-11-14 01:59 编辑

sommio 发表于 2024-11-13 17:13
我还会正则合并些多行字幕,感觉多行不怎么合阅读习惯。
程序现在会合并成带\N的一句输出到ass字幕,然后检测\N的存在进行提示
\N两侧没有特殊符号的话,大部分情况可以直接删掉\N。但某些情况可能替换成空格比较好
但我还是倾向于根据输出提示手动处理一下,反正也没几行

比如:
#107| Dialogue: 0,0:06:14.08,0:06:18.08,Default,,0,0,0,,我给其他人降下了考验\N看他们能否杀死魔物
#195| Dialogue: 0,0:09:35.95,0:09:39.27,Default,,0,0,0,,而且说白了\N广冈和佐久间这种人本来就活该去死
此规则已经加进程序,默认不启用。需要启用此规则就把下面这行前面的#号去掉:    #text = re.sub(r'(,,0,0,0,,[^\r\n]*?[^\d\s\(\)()"《》“”「」-])\\N([^\d\s\(\)()"“”「」-])', r'\1\2', text)

2024/11/13 Update v1.1: 增加省略号的替换规则,增加提示中显示aegisub行号功能
2024/11/14 Update v1.2: 增加单行字幕字数超长提示(默认30个utf-8字),
                                       增加\N两侧没有特殊符号,则把\N直接删掉的规则【sommio提议】(默认不启用)




sommio 发表于 7 天前

本帖最后由 sommio 于 2024-11-15 05:06 编辑

半角括号也可以换成全角的,很多字体半角括号内中文不会居中。

\((.+?)\) ($1)



我还有个想法是在全角括号前添加 \an8,类似这样:

,,( ,,{\an8}(

但目前还没有想法如何处理括号后换行可能是正文对话的情况

sommio 发表于 6 天前

本帖最后由 sommio 于 2024-11-16 04:13 编辑

报告一个 py 脚本的错误:
现在使用的是 CRLF 换行,在 *nix 系统 \r 会被当成路径的一部分处理。
建议在 vscode 修改为使用 LF 换行。
/usr/bin/env: "python\r": 没有那个文件或目录
/usr/bin/env: 使用 -S 以在 shebang 行中传递选项

另外在羚邦的字幕中发现了更诡异的引号,0xFF62 和 0xFF69
七大不可思議之一的「吞噬之黑霧」按维基百科的说法,这个应该是半角假名引号(JIS X 0201)

tmdtmdtmdqq 发表于 6 天前

sommio 发表于 2024-11-15 05:02
半角括号也可以换成全角的,很多字体半角括号内中文不会居中。



半角括号改为全角括号的规则已增加,定为选用功能,需自行去掉#号开启。而且只处理句子两端的括号(换行符也算两端),不处理句中的括号。
加\an8这个,遇到像下面这种的话,不就会导致一下在上方显示,一下在下方显示了。而且这脚本我是不会去加另外的tag进句子的,因为可能会导致后续正则处理/检查上会出问题。
Dialogue: 0,0:04:09.41,0:04:11.12,Default,,0,0,0,,目前在场的只有四个
Dialogue: 0,0:04:11.96,0:04:12.83,Default,,0,0,0,,(五龙士 黑龙骑士团)
Dialogue: 0,0:04:12.83,0:04:13.92,Default,,0,0,0,,少一个人呢\N(五龙士 黑龙骑士团)
Dialogue: 0,0:04:14.71,0:04:16.67,Default,,0,0,0,,我已经封住那家伙的嘴了 欧本
脚本代码中换行符的问题,我用dos2unix处理了一下,统一成\n了。
日文直角引号也替换成中文直角引号了。


2024/11/16 Update v1.3: 脚本中的换行符换成\n适配linux系统,
                                       增加日文的直角引号符替换成中文的直角引号符【sommio提议】,
                                       增加句子两端的英文半角括号替换成中文括号的规则【sommio提议】(默认不启用)
                                       增加句中存在括号时的提示




页: [1]
查看完整版本: 【探讨总结】官中字幕词句通用修改思路