1-
1+ import configparser
22import os
33from pathlib import Path
4- from qfluentwidgets import (qconfig , ConfigItem , QConfig , OptionsValidator , BoolValidator , OptionsConfigItem ,
5- EnumSerializer , RangeValidator , RangeConfigItem , ConfigValidator )
4+
5+ from qfluentwidgets import (
6+ BoolValidator ,
7+ ConfigItem ,
8+ ConfigValidator ,
9+ EnumSerializer ,
10+ OptionsConfigItem ,
11+ OptionsValidator ,
12+ QConfig ,
13+ RangeConfigItem ,
14+ RangeValidator ,
15+ qconfig ,
16+ )
17+
618from backend .tools .constant import SubtitleArea , VideoSubFinderDecoder
7- import configparser
819
920# 项目版本号
1021VERSION = "2.2.0"
1425PROJECT_UPDATE_URLS = [
1526 "https://api.github.com/repos/YaoFANGUK/video-subtitle-extractor/releases/latest" ,
1627 "https://accelerate.xdow.net/api/repos/YaoFANGUK/video-subtitle-extractor/releases/latest" ,
17- ]
28+ ]
1829# 硬件加速选项开关
1930HARDWARD_ACCELERATION_OPTION = True
2031
2132# 读取界面语言配置
2233tr = configparser .ConfigParser ()
2334
24- TRANSLATION_FILE = os .path .join (os .path .dirname (os .path .abspath (__file__ )), 'interface' , f"en.ini" )
25- tr .read (TRANSLATION_FILE , encoding = 'utf-8' )
35+ TRANSLATION_FILE = os .path .join (
36+ os .path .dirname (os .path .abspath (__file__ )), "interface" , "en.ini"
37+ )
38+ tr .read (TRANSLATION_FILE , encoding = "utf-8" )
39+
2640
2741class Config (QConfig ):
2842 # 界面语言设置
2943 intefaceTexts = {
30- ' 简体中文' : 'ch' ,
31- ' 繁體中文' : ' chinese_cht' ,
32- ' English' : 'en' ,
33- ' 한국어' : 'ko' ,
34- ' 日本語' : ' japan' ,
35- ' Tiếng Việt' : 'vi' ,
36- ' Español' : 'es' ,
37- ' Turkish' : 'tr'
44+ " 简体中文" : "ch" ,
45+ " 繁體中文" : " chinese_cht" ,
46+ " English" : "en" ,
47+ " 한국어" : "ko" ,
48+ " 日本語" : " japan" ,
49+ " Tiếng Việt" : "vi" ,
50+ " Español" : "es" ,
51+ " Turkish" : "tr" ,
3852 }
39- interface = OptionsConfigItem ("Window" , "Interface" , "ChineseSimplified" , OptionsValidator (intefaceTexts .values ()), restart = True )
40-
53+ interface = OptionsConfigItem (
54+ "Window" ,
55+ "Interface" ,
56+ "ch" ,
57+ OptionsValidator (intefaceTexts .values ()),
58+ restart = True ,
59+ )
60+
4161 # 窗口位置和大小
4262 windowX = ConfigItem ("Window" , "X" , None )
4363 windowY = ConfigItem ("Window" , "Y" , None )
@@ -46,68 +66,126 @@ class Config(QConfig):
4666
4767 # 使用一个配置项存储所有选区
4868 # 默认值为一个选区,格式为:"ymin,ymax,xmin,xmax;ymin,ymax,xmin,xmax;...",分号分隔不同选区
49- subtitleSelectionAreas = ConfigItem ("Main" , "SubtitleSelectionAreas" , "0.78,0.99,0.05,0.95" )
69+ subtitleSelectionAreas = ConfigItem (
70+ "Main" , "SubtitleSelectionAreas" , "0.78,0.99,0.05,0.95"
71+ )
5072
5173 # 字幕语言设置
52- language = OptionsConfigItem ("Main" , "Language" , "ch" , OptionsValidator ([name for name in tr ["Language" ]]))
74+ language = OptionsConfigItem (
75+ "Main" , "Language" , "ch" , OptionsValidator ([name for name in tr ["Language" ]])
76+ )
5377 # 识别模式设置
54- mode = OptionsConfigItem ("Main" , "Mode" , "fast" , OptionsValidator (["auto" , "fast" , "accurate" ]))
78+ mode = OptionsConfigItem (
79+ "Main" , "Mode" , "fast" , OptionsValidator (["auto" , "fast" , "accurate" ])
80+ )
5581 # 是否生成TXT文本字幕
5682 generateTxt = ConfigItem ("Main" , "GenerateTxt" , False , BoolValidator ())
5783 # 每张图中同时识别6个文本框中的文本,GPU显存越大,该数值可以设置越大
58- recBatchNumber = RangeConfigItem ("Main" , "RecBatchNumber" , 6 , RangeValidator (1 , 100 ))
84+ recBatchNumber = RangeConfigItem (
85+ "Main" , "RecBatchNumber" , 6 , RangeValidator (1 , 100 )
86+ )
5987 # DB算法每个batch识别多少张,默认为10
6088 maxBatchSize = RangeConfigItem ("Main" , "MaxBatchSize" , 10 , RangeValidator (1 , 256 ))
6189 # 字幕出现区域
62- subtitleArea = OptionsConfigItem ("Main" , "SubtitleArea" , SubtitleArea .UNKNOWN , OptionsValidator (SubtitleArea ), EnumSerializer (SubtitleArea ))
90+ subtitleArea = OptionsConfigItem (
91+ "Main" ,
92+ "SubtitleArea" ,
93+ SubtitleArea .UNKNOWN ,
94+ OptionsValidator (SubtitleArea ),
95+ EnumSerializer (SubtitleArea ),
96+ )
6397 # 每一秒抓取多少帧进行OCR识别
64- extractFrequency = RangeConfigItem ("Main" , "ExtractFrequency" , 3 , RangeValidator (1 , 60 ))
98+ extractFrequency = RangeConfigItem (
99+ "Main" , "ExtractFrequency" , 3 , RangeValidator (1 , 60 )
100+ )
65101 # 容忍的像素点偏差
66- tolerantPixelY = RangeConfigItem ("Main" , "TolerantPixelY" , 50 , RangeValidator (1 , 1000 ))
67- tolerantPixelX = RangeConfigItem ("Main" , "TolerantPixelX" , 100 , RangeValidator (1 , 1000 ))
102+ tolerantPixelY = RangeConfigItem (
103+ "Main" , "TolerantPixelY" , 50 , RangeValidator (1 , 1000 )
104+ )
105+ tolerantPixelX = RangeConfigItem (
106+ "Main" , "TolerantPixelX" , 100 , RangeValidator (1 , 1000 )
107+ )
68108 # 字幕区域偏移量
69- subtitleAreaDeviationPixel = RangeConfigItem ("Main" , "SubtitleAreaDeviationPixel" , 50 , RangeValidator (1 , 1000 ))
109+ subtitleAreaDeviationPixel = RangeConfigItem (
110+ "Main" , "SubtitleAreaDeviationPixel" , 50 , RangeValidator (1 , 1000 )
111+ )
70112 # 最有可能出现的水印区域
71- waterarkAreaNum = RangeConfigItem ("Main" , "WaterarkAreaNum" , 5 , RangeValidator (1 , 10 ))
113+ waterarkAreaNum = RangeConfigItem (
114+ "Main" , "WaterarkAreaNum" , 5 , RangeValidator (1 , 10 )
115+ )
72116 # 文本相似度阈值
73117 # 用于去重时判断两行字幕是不是同一行,这个值越高越严格。 e.g. 0.99表示100个字里面有99各个字一模一样才算相似
74118 # 采用动态算法实现相似度阈值判断: 对于短文本要求较低的阈值,对于长文本要求较高的阈值
75119 # 如:文本较短,人民、入民,0.5就算相似
76- thresholdTextSimilarity = RangeConfigItem ("Main" , "ThresholdTextSimilarity" , 80 , RangeValidator (0 , 100 ))
120+ thresholdTextSimilarity = RangeConfigItem (
121+ "Main" , "ThresholdTextSimilarity" , 80 , RangeValidator (0 , 100 )
122+ )
77123 # 字幕提取中置信度低于0.75的不要
78124 dropScore = RangeConfigItem ("Main" , "DropScore" , 75 , RangeValidator (0 , 100 ))
79125 # 字幕区域允许偏差, 0为不允许越界, 0.03表示可以越界3%
80- subtitleAreaDeviationRate = RangeConfigItem ("Main" , "SubtitleAreaDeviationRate" , 0 , RangeValidator (0 , 100 ))
126+ subtitleAreaDeviationRate = RangeConfigItem (
127+ "Main" , "SubtitleAreaDeviationRate" , 0 , RangeValidator (0 , 100 )
128+ )
81129 # 输出丢失的字幕帧, 仅简体中文,繁体中文,日文,韩语有效, 默认将调试信息输出到: 视频路径/loss
82130 debugOcrLoss = ConfigItem ("Main" , "DebugOcrLoss" , False , BoolValidator ())
83131 # 是否不删除缓存数据,以方便调试
84- debugNoDeleteCache = ConfigItem ("Main" , "DebugNoDeleteCache" , False , BoolValidator ())
132+ debugNoDeleteCache = ConfigItem (
133+ "Main" , "DebugNoDeleteCache" , False , BoolValidator ()
134+ )
85135 # 是否删除空时间轴
86- deleteEmptyTimeStamp = ConfigItem ("Main" , "DeleteEmptyTimeStamp" , True , BoolValidator ())
136+ deleteEmptyTimeStamp = ConfigItem (
137+ "Main" , "DeleteEmptyTimeStamp" , True , BoolValidator ()
138+ )
87139 # 是否重新分词, 用于解决没有语句没有空格
88140 wordSegmentation = ConfigItem ("Main" , "WordSegmentation" , True , BoolValidator ())
89141 # 是否使用硬件加速
90- hardwareAcceleration = ConfigItem ("Main" , "HardwareAcceleration" , HARDWARD_ACCELERATION_OPTION , BoolValidator ())
142+ hardwareAcceleration = ConfigItem (
143+ "Main" , "HardwareAcceleration" , HARDWARD_ACCELERATION_OPTION , BoolValidator ()
144+ )
91145 # 启动时检查应用更新
92- checkUpdateOnStartup = ConfigItem ("Main" , "CheckUpdateOnStartup" , True , BoolValidator ())
146+ checkUpdateOnStartup = ConfigItem (
147+ "Main" , "CheckUpdateOnStartup" , True , BoolValidator ()
148+ )
93149 # 视频保存目录
94150 saveDirectory = ConfigItem ("Main" , "SaveDirectory" , "" , ConfigValidator ())
95151 # VideoSubFinder CPU核心数
96- videoSubFinderCpuCores = RangeConfigItem ("Main" , "VideoSubFinderCpuCores" , 0 , RangeValidator (0 , os .cpu_count ()))
152+ videoSubFinderCpuCores = RangeConfigItem (
153+ "Main" , "VideoSubFinderCpuCores" , 0 , RangeValidator (0 , os .cpu_count ())
154+ )
97155 # VideoSubFinder 视频解码组件
98- videoSubFinderDecoder = OptionsConfigItem ("Main" , "VideoSubFinderDecoder" , VideoSubFinderDecoder .OPENCV , OptionsValidator (VideoSubFinderDecoder ), EnumSerializer (VideoSubFinderDecoder ))
156+ videoSubFinderDecoder = OptionsConfigItem (
157+ "Main" ,
158+ "VideoSubFinderDecoder" ,
159+ VideoSubFinderDecoder .OPENCV ,
160+ OptionsValidator (VideoSubFinderDecoder ),
161+ EnumSerializer (VideoSubFinderDecoder ),
162+ )
163+
99164
100- CONFIG_FILE = 'config/config.json'
165+ CONFIG_FILE = os .path .join (
166+ os .path .dirname (os .path .abspath (__file__ )), ".." , "config" , "config.json"
167+ )
101168config = Config ()
102169qconfig .load (CONFIG_FILE , config )
103170
104- # 读取界面语言配置
171+ # 读取界面语言配置 — 先加载 en.ini 作为后备,再叠加用户语言
105172tr = configparser .ConfigParser ()
106173
107- TRANSLATION_FILE = os .path .join (os .path .dirname (os .path .abspath (__file__ )), 'interface' , f"{ config .interface .value } .ini" )
108- tr .read (TRANSLATION_FILE , encoding = 'utf-8' )
174+ # 基础: 始终加载英文翻译作为后备
175+ EN_TRANSLATION_FILE = os .path .join (
176+ os .path .dirname (os .path .abspath (__file__ )), "interface" , "en.ini"
177+ )
178+ tr .read (EN_TRANSLATION_FILE , encoding = "utf-8" )
179+
180+ # 叠加: 用户选择的语言覆盖英文后备中的对应键值
181+ user_lang = config .interface .value
182+ if user_lang != "en" :
183+ USER_TRANSLATION_FILE = os .path .join (
184+ os .path .dirname (os .path .abspath (__file__ )), "interface" , f"{ user_lang } .ini"
185+ )
186+ tr .read (USER_TRANSLATION_FILE , encoding = "utf-8" )
109187
110188# 项目的base目录
111189BASE_DIR = str (Path (os .path .abspath (__file__ )).parent )
112190
113- os .environ [' KMP_DUPLICATE_LIB_OK' ] = ' True'
191+ os .environ [" KMP_DUPLICATE_LIB_OK" ] = " True"
0 commit comments