项目文件夹

文件
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 13:08:08 +08:00

114 行
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'