Skip to content

Commit 9b2cdae

Browse files
committedMar 9, 2023
v3.0.0
重构代码,支持输出ass,更多的可配置参数
1 parent 55969a7 commit 9b2cdae

12 files changed

+825
-404
lines changed
 

‎.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,5 @@ dmypy.json
135135
/dist
136136
*.spec
137137
!Caption2Txt.bat
138-
/.idea
138+
/.idea
139+
*.clt

‎FullwidthConverter.py

+17-32
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import argparse
21
import os
3-
import sys
42
import traceback
53
from argparse import RawTextHelpFormatter
4+
from pathlib import Path
5+
from typing import Union
6+
7+
from utils.argparser import MyParser
8+
from utils.logfile import _print, setLogfile, closeLogfile, print
9+
from utils.misc import mkFilepath
610

711
VER = 'v1.0.4_halfwidth-sp'
812

@@ -34,21 +38,6 @@
3438
'ラ': 'ラ', 'リ': 'リ', 'ル': 'ル', 'レ': 'レ', 'ロ': 'ロ',
3539
'ワ': 'ワ', 'ン': 'ン', 'ヲ': 'ヲ',
3640
}
37-
oldprint = print
38-
logfile = None
39-
def print(*args, **kwargs):
40-
oldprint(*args, **kwargs)
41-
if logfile:
42-
oldprint(*args, **kwargs, file=logfile)
43-
44-
class MyParser(argparse.ArgumentParser):
45-
def error(self, message):
46-
self.print_help()
47-
print()
48-
args = {'prog': self.prog, 'message': message}
49-
sys.stderr.write(('%(prog)s: error: %(message)s\n') % args)
50-
os.system('pause')
51-
self.exit(2)
5241

5342
def initparser():
5443
parser = MyParser(description=DESCRIPTION, formatter_class=RawTextHelpFormatter)
@@ -58,10 +47,6 @@ def initparser():
5847
parser.add_argument('--log', action='store_true', help='记录日志,执行结果输出到<输入文件名>_log.txt')
5948
return parser
6049

61-
def mkOutfilename(infile: str, namesuf='_out'):
62-
name, suf = os.path.splitext(infile)
63-
return name+namesuf+suf
64-
6550
def convertline(line: str, lookup: dict):
6651
# 日字的数字、全角空格、全角标点符号不能改,可能还是改回查找表,并且额外增加浊音半浊音
6752
# 不能用str.translate,因为带浊音的假名是两个字符
@@ -70,23 +55,23 @@ def convertline(line: str, lookup: dict):
7055
line = line.replace(old, new)
7156
return line
7257

73-
def doconvert(inname, outname, lookup):
58+
def doconvert(inpath, outpath: Union[str, Path], lookup):
7459
cnter = 0
7560
encodings = ['utf-8-sig', 'gbk']
7661
infile = None
7762
outfile = None
7863
for encoding in encodings:
7964
try:
80-
infile = open(inname, 'r', encoding=encoding)
81-
outfile = open(outname, 'w', encoding=encoding)
65+
infile = open(inpath, 'r', encoding=encoding)
66+
outfile = open(outpath, 'w', encoding=encoding)
8267
while line := infile.readline():
8368
nline = convertline(line, lookup)
8469
if nline != line:
8570
cnter += 1
8671
print(line.rstrip('\n'), '->\n\t', nline.rstrip('\n'))
8772
print()
8873
outfile.write(nline)
89-
print('\n完成! 共转换了', cnter, '行,已保存至', outname)
74+
print('\n完成! 共转换了', cnter, '行,已保存至', str(outpath))
9075
return True
9176
except UnicodeDecodeError:
9277
continue
@@ -104,17 +89,17 @@ def doconvert(inname, outname, lookup):
10489
return False
10590

10691
def main():
107-
global logfile
10892
parser = initparser()
10993
args = parser.parse_args()
11094
if args.log:
111-
logfile = open(mkOutfilename(args.InputFile, '_log'), 'w', encoding='utf-8')
95+
logpath = mkFilepath(args.InputFile, '.txt', '_log')
96+
setLogfile(logpath)
11297
try:
11398
print(DESCRIPTION)
11499
print()
115100
print('正在读取', args.InputFile)
116101

117-
outname = args.output or mkOutfilename(args.InputFile)
102+
outname = args.output or mkFilepath(args.InputFile, 'txt')
118103
doconvert(args.InputFile, outname, lookup)
119104

120105
print()
@@ -123,10 +108,10 @@ def main():
123108
'\n发生了未知错误!请将下面的报错信息及待转换文件提交到 https://github.com/barryZZJ/SubtitleCleaner/issues')
124109
traceback.print_exc()
125110
finally:
126-
if logfile:
127-
logfile.close()
128-
oldprint('日志文件已保存至', mkOutfilename(args.InputFile, '_log'))
129-
oldprint()
111+
if args.log:
112+
closeLogfile()
113+
_print('日志文件已保存至', str(logpath))
114+
_print()
130115

131116
if not args.quit:
132117
os.system('pause')

‎README.md

+147-64
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,168 @@
1-
本仓库共包含三个工具:FullwidthConverter(全角片假名转换器)、SubCleaner(字幕清理器)、Caption2Txt,三者为包含关系。
1+
# 字幕清理工具
22

3-
SubCleaner中包含了FullwidthConverter的功能,Caption2Txt中包含了SubCleaner的功能。
3+
## 简介
44

5-
# 程序下载
5+
对ts源中提取出的ass字幕进行处理,包括合并多行对白、清理各种不必要的符号、说话人备注、转换假名半角等,输出ass或txt。
6+
7+
## 程序下载
68

79
[Releases](https://github.com/zhimengsub/SubtitleCleaner/releases)页面选择最新版本的程序下载。
810

9-
# FullwidthConverter / 全角片假名转换器
11+
## 功能具体说明
1012

11-
可以将半角:片假名以及`` `` `` `` ``等符号转换为全角;全角数字、空格转换为半角
13+
⚠️部分功能可以在[配置文件](#配置文件格式)中详细设置,括号中即配置文件中对应的条目。
1214

13-
## 使用方法
15+
### 合并
1416

15-
1. 将待转换文件直接拖放到本程序上即可。
17+
合并多行对白及其时间(需要保证字幕按时间顺序排列)
1618

17-
2. 也可以使用命令行进行更多配置:
18-
- `InputFile`:设置待处理文件名
19-
- `-o FILE, --output FILE`:设置输出文件名,默认为`<输入文件名>_out.txt`
20-
- `-q, --quit`:结束后不暂停程序直接退出,方便命令行调用。不加该参数程序结束时会暂停。
21-
- `--log`:记录日志,把执行结果输出到`<输入文件名>_log.txt`
19+
📝 分隔符:合并的行之间用`merge.sep`分隔,默认为空格。
2220

23-
## TODO List
21+
1. 按成对括号合并(开关:`merge.pair`,默认开启):
22+
23+
包含以下符号的左括号,经过多行后出现对应的右括号,则将这些行合并,使用`merge.sep`分隔。⚠️合并时左括号后和右括号前后不添加分隔符。
24+
25+
`《》` `<>` `<>` `〈〉` `「」` `「」` `『』` `()` `[]`
2426

25-
- [ ] 制作GUI界面
27+
2. 按单个符号合并(开关:`merge.singlesuf`,默认开启):
28+
29+
``结尾的对白,和下一行合并,使用`merge.sep`分隔。
2630

27-
---
28-
# SubCleaner / 字幕清理器
29-
30-
输入`.ass`字幕文件,提取对话文本(跳过样式为Rubi的注音台词),进行处理后输出为文本文件,具体处理内容如下:
31-
32-
1. 台词合并(为避免合并后过长,每两行合并一次):
33-
- 对连续多行对白**包含以下配对符号**的进行合并,用半角空格隔开(并删除该符号):
34-
`《》` `<>` `<>` `〈〉` `「」`(不删除) `「」`(不删除)
35-
-``结尾的对白,和下一行合并,并用半角空格隔开(并删除该符号)。
36-
- ~~对连续多行对白的**开始和结束时间相同**的进行合并,并(只有有效对白才)用半角空格隔开~~(多数情况下为不同说话人,故去掉)
37-
2. 台词清理:
38-
- 直接删除:`` ``(半角) ``(全角) `` `!` `` `?` `~` `` `` `` `(...)` `[...]` `{...}` `\N` `空行`
39-
- `` ``替换为全角空格
40-
- `『』`替换为`「」`
41-
- 删除拟声词(具体见[拟声词](#拟声词)
42-
- 每一行开头添加`\N`
43-
3. 假名转换
44-
- 每一行使用前述的片假名转换器`FullWidthConverter`处理半角片假名、半角符号、全角数字
45-
46-
## 使用方法
47-
48-
1.`.ass`文件直接拖放到本程序上即可。
49-
50-
2. 也可以使用命令行进行更多配置:
51-
- `InputFile`:设置待处理文件名
52-
- `-o FILE, --output FILE`:设置输出文件名,默认为`<输入文件名>.txt`
53-
- `-q, --quit`:结束后不暂停程序直接退出,方便命令行调用。不加该参数程序结束时会暂停
54-
- `--log`:记录日志,把执行结果输出到`<输入文件名>_log.txt`
55-
56-
## 拟声词
57-
58-
### V0.2
59-
60-
以下只有单独出现时才删除
61-
62-
```text
63-
ん,
64-
うむ, ええ, わあ, うわ,
65-
あぁ, はぁ, うわぁ,
66-
んっ, うっ, よっ, はっ, ひっ, ほっ, あっ, えっ, なっ, わっ,
67-
えへへへ,
68-
あ(>=1个),
69-
う(>=1个),
70-
は(>=2个),
71-
うん(>=1个)
31+
3. 按时间合并(开关:`merge.time`,默认关闭):
32+
33+
时间有重叠的相邻对白合并,使用`merge.sep`分隔。
34+
35+
- 可配置参数:
36+
37+
- 📝 合并行数限制`merge.limit`
38+
39+
整数。为避免合并后内容过长,可以限制合并行数达到`merge.limit`后强制新建一行。
40+
41+
默认为2,设为0表示不限制。
42+
43+
`remove_overlap`已开启,则表示不同含义(见下文)。
44+
45+
- 📝 保证输出无时间重叠`remove_overlap`
46+
47+
默认关闭。开启后,输出的每一行都不会有时间重叠,对有时间重叠的对白每达到`merge.limit`行后用`merge.sep_on_overlap`(默认为空格)隔开。
48+
49+
【相当于对原来合并+清理后的结果再次进行时间合并,且达到`merge.limit`后使用`merge.sep_on_overlap`隔开】
50+
51+
### 清理
52+
53+
1. 直接删除以下符号:
54+
55+
`\N` `` `` `` `` `!` `` `?` `~` `` `` `` `` `` `` `<` `>` `` `` `` `` `` `` `` `` `` `` ``(出现在行尾时)
56+
2. 方括号`[]`及其括起来的的内容;
57+
3. 圆括号`()`及其括起来的内容,一般为说话人或环境音提示(开关:`remove_comments`,默认开启);
58+
4. 以下符号替换为半角空格:
59+
60+
`` ``
61+
62+
### 其他
63+
64+
1. 假名宽度替换(`FullwidthConverter.py`)(开关:`convert_width`,默认开启):
65+
66+
将半角片假名,以及`` `` `` `` ``等符号转换为全角;
67+
68+
将全角数字、空格转换为半角。
69+
70+
2. 添加前缀(开关:`add_newline_prefix`,默认开启):
71+
72+
在输出的每一行开头添加`\N`前缀。
73+
74+
3. 数字宽度替换(开关:`format_digit`,默认开启):
75+
76+
若一行对白只含有一个数字,则数字使用全角,若含有多个数字,则所有数字均使用半角。
77+
78+
- 可配置参数:
79+
80+
- 📝 输出格式`format`
81+
82+
字符串,默认为 `ass`,表示输出ass字幕文件,也可设置为`txt`,表示文本文件。
83+
84+
85+
## 配置文件格式
86+
87+
配置文件为同目录下的`configs.json`,使用[JSON语法](https://www.runoob.com/json/json-syntax.html)
88+
89+
📝 如果误删,重新运行一次`SubCleaner.exe`即可生成。
90+
91+
默认配置:
92+
93+
```json
94+
{
95+
"format": "ass",
96+
"merge": {
97+
"pair": true,
98+
"singlesuf": true,
99+
"time": false,
100+
"sep": " ",
101+
"limit": 2,
102+
"sep_on_overlap": " "
103+
},
104+
"remove_comments": true,
105+
"remove_overlap": false,
106+
"convert_width": true,
107+
"add_newline_prefix": true,
108+
"format_digit": true
109+
}
110+
```
111+
112+
## 使用方式
113+
114+
按需求修改配置文件`configs.json`,然后将需要处理的字幕文件`ass`拖放到`SubCleaner.exe`上,即可得到处理后的文件,默认输出文件名为`<输入文件名>_cleaned`
115+
116+
也可以[使用命令行](#其他命令行参数)进行更多配置。
117+
118+
## 其他命令行参数
119+
120+
格式
72121
```
122+
SubCleaner.py [-h] [-o OUTFILE] [-q] [--offsetms OFFSETMS] [--log] InputFile
123+
```
124+
125+
可选参数说明:
126+
127+
128+
`-o OUTPUT, --output OUTPUT`
129+
130+
输出文件路径,默认为<输入文件名>_cleaned。
131+
132+
`-q, --quit`
73133

74-
## TODO List
134+
结束后不暂停程序直接退出,方便命令行调用。不加该参数程序结束时会提示`请按任意键继续...`
75135

76-
- [ ] 制作GUI界面
136+
`--offsetms OFFSETMS`
137+
138+
输出ass整体时间偏移毫秒数,负数为提前,正数为延后。
139+
140+
`--log`
141+
142+
记录日志,日志存储到同目录下的<输入文件名>_log.txt。
143+
144+
145+
📝 使用命令行参数需要先[`SubCleaner.exe`所在目录打开命令行](#在指定目录打开命令行),然后输入`Subcleaner.exe <字幕文件路径> <其他命令行参数>`,如`Subcleaner.exe input.ass -o output.ass --offsetms -355 --log -q`
146+
147+
148+
149+
## FAQ
150+
151+
### 在指定目录打开命令行
152+
153+
点击资源管理器的地址栏,输入`cmd`后按回车。
154+
155+
![参考](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9naXRlZS5jb20vYWxleF9kL0dyYXBoLWJlZC9yYXcvbWFzdGVyLzIwMTYvMTExMC9leHBsb3Jlcl9vcGVuX2NtZF8xLnBuZw?x-oss-process=image/format,png)
77156

78157
---
79158

80159
# Caption2Txt.bat
81160

82-
说明:调用`Caption2Ass`(请自行搜素下载)`SubCleaner`,提取ts中的ass,然后生成清理后的台词文本文件
161+
说明:批处理文件,依次调用`Caption2Ass`(请自行搜索下载)提取ts中的ass`SubCleaner`对提取出的字幕进行清理
83162

84-
使用方法:拖入ts文件,会先生成ass,然后生成处理后的txt文件
163+
使用方法:拖放ts文件到批处理文件上
85164

86-
注意:必须把本脚本与Caption2Ass_PCR.exe、SubCleaner.exe放在同一目录下才能正常工作!
165+
⚠️必须把本脚本与Caption2Ass_PCR.exe、SubCleaner.exe放在同一目录下才能正常工作!
87166

88167
# 提出修改建议 / 运行时的错误和BUG
89168

@@ -115,6 +194,10 @@ SubCleaner中包含了FullwidthConverter的功能,Caption2Txt中包含了SubCl
115194

116195
## SubCleaner
117196

197+
- v3.0.0
198+
- 重构代码,支持输出ass
199+
- 支持更多可配置参数,并使用配置文件读取
200+
118201
- v2.4.5.001
119202
- 一句话内只有一位数字时改为全角,同时出现多位数字时保持半角
120203

0 commit comments

Comments
 (0)
Please sign in to comment.