Files
desktop-transfer/translator.py
xiaji b327725ecf feat(translator): 添加llama-cpp-python库可用性检查
在翻译功能中添加对llama-cpp-python库的可用性检查,当库未安装时显示警告信息并禁用翻译功能
2026-01-14 15:13:49 +08:00

122 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
from utils.logger import logger
# 尝试导入llama_cpp如果失败则设置Llama为None
try:
from llama_cpp import Llama
llama_cpp_available = True
except ImportError:
logger.warning("llama-cpp-python库未找到将禁用翻译功能")
Llama = None
llama_cpp_available = False
class Translator:
def __init__(self, model_path=None):
self.model = None
self.model_path = model_path
self.is_ready = False
self.model_name = ""
self.llama_cpp_available = llama_cpp_available
def load_model(self, model_path=None):
"""加载模型"""
if not self.llama_cpp_available:
logger.error("llama-cpp-python库未找到无法加载模型")
return False
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.llama_cpp_available:
logger.error("llama-cpp-python库未找到无法执行翻译")
return ""
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 "未加载模型"