39a086b41b
Build Windows CPU / build (push) Has been cancelled
Build Windows CUDA 10.2 / build (push) Has been cancelled
Build Windows CUDA 11.8 / build (push) Has been cancelled
Build Windows CUDA 12.6 / build (push) Has been cancelled
Build Windows DirectML / build (push) Has been cancelled
114 lines
6.0 KiB
Python
114 lines
6.0 KiB
Python
|
|
import os
|
|
from pathlib import Path
|
|
from qfluentwidgets import (qconfig, ConfigItem, QConfig, OptionsValidator, BoolValidator, OptionsConfigItem,
|
|
EnumSerializer, RangeValidator, RangeConfigItem, ConfigValidator)
|
|
from backend.tools.constant import SubtitleArea, VideoSubFinderDecoder
|
|
import configparser
|
|
|
|
# 项目版本号
|
|
VERSION = "2.2.0"
|
|
PROJECT_HOME_URL = "https://github.com/YaoFANGUK/video-subtitle-extractor"
|
|
PROJECT_ISSUES_URL = PROJECT_HOME_URL + "/issues"
|
|
PROJECT_RELEASES_URL = PROJECT_HOME_URL + "/releases"
|
|
PROJECT_UPDATE_URLS = [
|
|
"https://api.github.com/repos/YaoFANGUK/video-subtitle-extractor/releases/latest",
|
|
"https://accelerate.xdow.net/api/repos/YaoFANGUK/video-subtitle-extractor/releases/latest",
|
|
]
|
|
# 硬件加速选项开关
|
|
HARDWARD_ACCELERATION_OPTION = True
|
|
|
|
# 读取界面语言配置
|
|
tr = configparser.ConfigParser()
|
|
|
|
TRANSLATION_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'interface', f"en.ini")
|
|
tr.read(TRANSLATION_FILE, encoding='utf-8')
|
|
|
|
class Config(QConfig):
|
|
# 界面语言设置
|
|
intefaceTexts = {
|
|
'简体中文': 'ch',
|
|
'繁體中文': 'chinese_cht',
|
|
'English': 'en',
|
|
'한국어': 'ko',
|
|
'日本語': 'japan',
|
|
'Tiếng Việt': 'vi',
|
|
'Español': 'es',
|
|
'Turkish': 'tr'
|
|
}
|
|
interface = OptionsConfigItem("Window", "Interface", "ChineseSimplified", OptionsValidator(intefaceTexts.values()), restart = True)
|
|
|
|
# 窗口位置和大小
|
|
windowX = ConfigItem("Window", "X", None)
|
|
windowY = ConfigItem("Window", "Y", None)
|
|
windowW = ConfigItem("Window", "Width", 1200)
|
|
windowH = ConfigItem("Window", "Height", 1200)
|
|
|
|
# 使用一个配置项存储所有选区
|
|
# 默认值为一个选区,格式为:"ymin,ymax,xmin,xmax;ymin,ymax,xmin,xmax;...",分号分隔不同选区
|
|
subtitleSelectionAreas = ConfigItem("Main", "SubtitleSelectionAreas", "0.78,0.99,0.05,0.95")
|
|
|
|
# 字幕语言设置
|
|
language = OptionsConfigItem("Main", "Language", "ch", OptionsValidator([name for name in tr["Language"]]))
|
|
# 识别模式设置
|
|
mode = OptionsConfigItem("Main", "Mode", "fast", OptionsValidator(["auto", "fast", "accurate"]))
|
|
# 是否生成TXT文本字幕
|
|
generateTxt = ConfigItem("Main", "GenerateTxt", False, BoolValidator())
|
|
# 每张图中同时识别6个文本框中的文本,GPU显存越大,该数值可以设置越大
|
|
recBatchNumber = RangeConfigItem("Main", "RecBatchNumber", 6, RangeValidator(1, 100))
|
|
# DB算法每个batch识别多少张,默认为10
|
|
maxBatchSize = RangeConfigItem("Main", "MaxBatchSize", 10, RangeValidator(1, 256))
|
|
# 字幕出现区域
|
|
subtitleArea = OptionsConfigItem("Main", "SubtitleArea", SubtitleArea.UNKNOWN, OptionsValidator(SubtitleArea), EnumSerializer(SubtitleArea))
|
|
# 每一秒抓取多少帧进行OCR识别
|
|
extractFrequency = RangeConfigItem("Main", "ExtractFrequency", 3, RangeValidator(1, 60))
|
|
# 容忍的像素点偏差
|
|
tolerantPixelY = RangeConfigItem("Main", "TolerantPixelY", 50, RangeValidator(1, 1000))
|
|
tolerantPixelX = RangeConfigItem("Main", "TolerantPixelX", 100, RangeValidator(1, 1000))
|
|
# 字幕区域偏移量
|
|
subtitleAreaDeviationPixel = RangeConfigItem("Main", "SubtitleAreaDeviationPixel", 50, RangeValidator(1, 1000))
|
|
# 最有可能出现的水印区域
|
|
waterarkAreaNum = RangeConfigItem("Main", "WaterarkAreaNum", 5, RangeValidator(1, 10))
|
|
# 文本相似度阈值
|
|
# 用于去重时判断两行字幕是不是同一行,这个值越高越严格。 e.g. 0.99表示100个字里面有99各个字一模一样才算相似
|
|
# 采用动态算法实现相似度阈值判断: 对于短文本要求较低的阈值,对于长文本要求较高的阈值
|
|
# 如:文本较短,人民、入民,0.5就算相似
|
|
thresholdTextSimilarity = RangeConfigItem("Main", "ThresholdTextSimilarity", 80, RangeValidator(0, 100))
|
|
# 字幕提取中置信度低于0.75的不要
|
|
dropScore = RangeConfigItem("Main", "DropScore", 75, RangeValidator(0, 100))
|
|
# 字幕区域允许偏差, 0为不允许越界, 0.03表示可以越界3%
|
|
subtitleAreaDeviationRate = RangeConfigItem("Main", "SubtitleAreaDeviationRate", 0, RangeValidator(0, 100))
|
|
# 输出丢失的字幕帧, 仅简体中文,繁体中文,日文,韩语有效, 默认将调试信息输出到: 视频路径/loss
|
|
debugOcrLoss = ConfigItem("Main", "DebugOcrLoss", False, BoolValidator())
|
|
# 是否不删除缓存数据,以方便调试
|
|
debugNoDeleteCache = ConfigItem("Main", "DebugNoDeleteCache", False, BoolValidator())
|
|
# 是否删除空时间轴
|
|
deleteEmptyTimeStamp = ConfigItem("Main", "DeleteEmptyTimeStamp", True, BoolValidator())
|
|
# 是否重新分词, 用于解决没有语句没有空格
|
|
wordSegmentation = ConfigItem("Main", "WordSegmentation", True, BoolValidator())
|
|
# 是否使用硬件加速
|
|
hardwareAcceleration = ConfigItem("Main", "HardwareAcceleration", HARDWARD_ACCELERATION_OPTION, BoolValidator())
|
|
# 启动时检查应用更新
|
|
checkUpdateOnStartup = ConfigItem("Main", "CheckUpdateOnStartup", True, BoolValidator())
|
|
# 视频保存目录
|
|
saveDirectory = ConfigItem("Main", "SaveDirectory", "", ConfigValidator())
|
|
# VideoSubFinder CPU核心数
|
|
videoSubFinderCpuCores = RangeConfigItem("Main", "VideoSubFinderCpuCores", 0, RangeValidator(0, os.cpu_count()))
|
|
# VideoSubFinder 视频解码组件
|
|
videoSubFinderDecoder = OptionsConfigItem("Main", "VideoSubFinderDecoder", VideoSubFinderDecoder.OPENCV, OptionsValidator(VideoSubFinderDecoder), EnumSerializer(VideoSubFinderDecoder))
|
|
|
|
CONFIG_FILE = 'config/config.json'
|
|
config = Config()
|
|
qconfig.load(CONFIG_FILE, config)
|
|
|
|
# 读取界面语言配置
|
|
tr = configparser.ConfigParser()
|
|
|
|
TRANSLATION_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'interface', f"{config.interface.value}.ini")
|
|
tr.read(TRANSLATION_FILE, encoding='utf-8')
|
|
|
|
# 项目的base目录
|
|
BASE_DIR = str(Path(os.path.abspath(__file__)).parent)
|
|
|
|
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
|