feat: 实现基于PySide6的翻译GUI工具初始版本
添加主程序入口、GUI界面、翻译核心逻辑、Word文件处理、系统监控和日志模块
This commit is contained in:
105
translator.py
Normal file
105
translator.py
Normal file
@@ -0,0 +1,105 @@
|
||||
from llama_cpp import Llama
|
||||
import os
|
||||
from utils.logger import logger
|
||||
|
||||
class Translator:
|
||||
def __init__(self, model_path=None):
|
||||
self.model = None
|
||||
self.model_path = model_path
|
||||
self.is_ready = False
|
||||
self.model_name = ""
|
||||
|
||||
def load_model(self, model_path=None):
|
||||
"""加载模型"""
|
||||
if model_path:
|
||||
self.model_path = model_path
|
||||
|
||||
if not self.model_path:
|
||||
logger.error("未提供模型路径")
|
||||
return False
|
||||
|
||||
if not os.path.exists(self.model_path):
|
||||
logger.error(f"模型文件不存在: {self.model_path}")
|
||||
return False
|
||||
|
||||
try:
|
||||
logger.info(f"开始加载模型: {self.model_path}")
|
||||
self.model = Llama(
|
||||
model_path=self.model_path,
|
||||
n_ctx=2048,
|
||||
n_threads=4,
|
||||
n_gpu_layers=100 # 尽可能使用GPU加速
|
||||
)
|
||||
self.is_ready = True
|
||||
self.model_name = os.path.basename(self.model_path)
|
||||
logger.info(f"模型加载成功: {self.model_name}")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(f"模型加载失败: {e}")
|
||||
self.is_ready = False
|
||||
return False
|
||||
|
||||
def translate(self, text, context="", terms=None):
|
||||
"""执行翻译"""
|
||||
if not self.is_ready or not self.model:
|
||||
logger.error("模型未就绪,无法执行翻译")
|
||||
return ""
|
||||
|
||||
try:
|
||||
# 构建翻译提示词
|
||||
prompt = self._build_prompt(text, context, terms)
|
||||
|
||||
logger.info(f"开始翻译,输入长度: {len(text)} 字符")
|
||||
|
||||
# 调用模型进行翻译
|
||||
output = self.model(
|
||||
prompt,
|
||||
max_tokens=2048,
|
||||
temperature=0.7,
|
||||
top_p=0.95,
|
||||
stop=["\n原文:", "\n译文:", "\n###"]
|
||||
)
|
||||
|
||||
translated_text = output["choices"][0]["text"].strip()
|
||||
logger.info(f"翻译完成,输出长度: {len(translated_text)} 字符")
|
||||
|
||||
return translated_text
|
||||
except Exception as e:
|
||||
logger.error(f"翻译失败: {e}")
|
||||
return ""
|
||||
|
||||
def _build_prompt(self, text, context="", terms=None):
|
||||
"""构建翻译提示词"""
|
||||
prompt = "你是一个专业的翻译助手,根据以下要求将中文翻译成英文:\n"
|
||||
|
||||
if context:
|
||||
prompt += f"\n文本背景/场景介绍:{context}\n"
|
||||
|
||||
if terms:
|
||||
prompt += "\n术语定义:\n"
|
||||
for term in terms:
|
||||
prompt += f"{term}\n"
|
||||
|
||||
prompt += f"\n原文:{text}\n译文:"
|
||||
|
||||
return prompt
|
||||
|
||||
def unload_model(self):
|
||||
"""卸载模型"""
|
||||
if self.model:
|
||||
try:
|
||||
del self.model
|
||||
self.model = None
|
||||
self.is_ready = False
|
||||
logger.info("模型已卸载")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(f"模型卸载失败: {e}")
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_model_info(self):
|
||||
"""获取模型信息"""
|
||||
if self.is_ready:
|
||||
return f"{self.model_name.split('.')[0]}"
|
||||
return "未加载模型"
|
||||
Reference in New Issue
Block a user