diff --git a/dsLightRag/Liblib/Kit/PuLIDGenerator.py b/dsLightRag/Liblib/Kit/PuLIDGenerator.py index 449a585e..b35e3fb2 100644 --- a/dsLightRag/Liblib/Kit/PuLIDGenerator.py +++ b/dsLightRag/Liblib/Kit/PuLIDGenerator.py @@ -1,7 +1,8 @@ import json from Config.Config import OBS_BUCKET, OBS_SERVER -from LibLibGenerator import LibLibGenerator +from Liblib.Kit.LibLibGenerator import LibLibGenerator + class PuLIDGenerator: def __init__(self): diff --git a/dsLightRag/Liblib/Kit/__pycache__/PuLIDGenerator.cpython-310.pyc b/dsLightRag/Liblib/Kit/__pycache__/PuLIDGenerator.cpython-310.pyc new file mode 100644 index 00000000..34cd4249 Binary files /dev/null and b/dsLightRag/Liblib/Kit/__pycache__/PuLIDGenerator.cpython-310.pyc differ diff --git a/dsLightRag/Routes/CopyFaceRoute.py b/dsLightRag/Routes/CopyFaceRoute.py new file mode 100644 index 00000000..a61f3e56 --- /dev/null +++ b/dsLightRag/Routes/CopyFaceRoute.py @@ -0,0 +1,176 @@ +import json +import logging +import os +from typing import Optional, List + +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel + +from Liblib.Kit.PuLIDGenerator import PuLIDGenerator + +# 创建路由路由器 +router = APIRouter(prefix="/api/copyface", tags=["人像换脸"]) + +# 配置日志 +logger = logging.getLogger(__name__) + +# JSON配置文件路径 +COPY_FACE_CONFIG_PATH = os.path.join(os.path.dirname(__file__), "..", "Liblib", "Data", "copy_face_image_data.json") + +class CopyFaceRequest(BaseModel): + image_url: str + +class ModelSample(BaseModel): + name: str + template_uuid: str + steps: int + width: int + height: int + cfgScale: float + sampler: str + seed: int + prompt: str + negative_prompt: Optional[str] = None + reference_image_url: str + control_weight: float + +@router.get("/samples", response_model=List[ModelSample]) +async def get_available_samples(): + """ + 获取所有可用的生成样例配置 + + Returns: + 包含所有可用模型样例的列表 + """ + try: + # 读取配置文件 + with open(COPY_FACE_CONFIG_PATH, 'r', encoding='utf-8') as f: + config_data = json.load(f) + + # 返回所有模型配置 + return config_data["models"] + + except FileNotFoundError: + logger.error(f"配置文件未找到: {COPY_FACE_CONFIG_PATH}") + raise HTTPException(status_code=404, detail="配置文件未找到") + except json.JSONDecodeError: + logger.error(f"配置文件格式错误: {COPY_FACE_CONFIG_PATH}") + raise HTTPException(status_code=500, detail="配置文件格式错误") + except Exception as e: + logger.error(f"获取样例配置失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"获取样例配置失败: {str(e)}") + +@router.post("/generate", response_model=dict) +async def generate_copy_face(request: CopyFaceRequest): + """ + 根据提供的图片URL生成模拟人脸图片(使用默认配置) + + Args: + request: 包含图片URL的请求体 + + Returns: + 包含生成图片OBS地址的字典 + """ + try: + # 读取默认配置(第一个模型) + with open(COPY_FACE_CONFIG_PATH, 'r', encoding='utf-8') as f: + config_data = json.load(f) + + default_config = config_data["models"][0] + + # 使用默认配置 + generator = PuLIDGenerator() + + # 设置默认参数 + generator.set_default_params( + template_uuid=default_config["template_uuid"], + steps=default_config["steps"], + width=default_config["width"], + height=default_config["height"] + ) + + # 生成图像 + obs_url = generator.generate_image( + prompt=default_config["prompt"], + reference_image_url=request.image_url, + control_weight=default_config["control_weight"] + ) + + if obs_url: + logger.info(f"人像换脸生成成功,OBS地址: {obs_url}") + return { + "status": "success", + "obs_url": obs_url, + "message": "人像换脸生成成功", + "model_used": default_config["name"] + } + else: + logger.error("人像换脸生成失败") + raise HTTPException(status_code=500, detail="人像换脸生成失败") + + except Exception as e: + logger.error(f"人像换脸请求处理失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"人像换脸请求处理失败: {str(e)}") + +@router.post("/generate/{model_name}", response_model=dict) +async def generate_copy_face_with_model(model_name: str, request: CopyFaceRequest): + """ + 根据指定的模型名称和图片URL生成模拟人脸图片 + + Args: + model_name: 模型名称(如:炫酷机甲美女_majicflus) + request: 包含图片URL的请求体 + + Returns: + 包含生成图片OBS地址的字典 + """ + try: + # 读取配置文件 + with open(COPY_FACE_CONFIG_PATH, 'r', encoding='utf-8') as f: + config_data = json.load(f) + + # 查找指定的模型配置 + model_config = None + for model in config_data["models"]: + if model["name"] == model_name: + model_config = model + break + + if not model_config: + raise HTTPException(status_code=404, detail=f"未找到模型: {model_name}") + + # 使用指定配置 + generator = PuLIDGenerator() + + # 设置参数 + generator.set_default_params( + template_uuid=model_config["template_uuid"], + steps=model_config["steps"], + width=model_config["width"], + height=model_config["height"] + ) + + # 生成图像 + obs_url = generator.generate_image( + prompt=model_config["prompt"], + reference_image_url=request.image_url, + control_weight=model_config["control_weight"] + ) + + if obs_url: + logger.info(f"人像换脸生成成功,模型: {model_name}, OBS地址: {obs_url}") + return { + "status": "success", + "obs_url": obs_url, + "message": "人像换脸生成成功", + "model_used": model_name + } + else: + logger.error(f"人像换脸生成失败,模型: {model_name}") + raise HTTPException(status_code=500, detail="人像换脸生成失败") + + except HTTPException: + raise + except Exception as e: + logger.error(f"人像换脸请求处理失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"人像换脸请求处理失败: {str(e)}") \ No newline at end of file diff --git a/dsLightRag/Routes/__pycache__/CopyFaceRoute.cpython-310.pyc b/dsLightRag/Routes/__pycache__/CopyFaceRoute.cpython-310.pyc new file mode 100644 index 00000000..d018946f Binary files /dev/null and b/dsLightRag/Routes/__pycache__/CopyFaceRoute.cpython-310.pyc differ diff --git a/dsLightRag/Start.py b/dsLightRag/Start.py index 24e3c6b8..2f703dc7 100644 --- a/dsLightRag/Start.py +++ b/dsLightRag/Start.py @@ -29,6 +29,7 @@ from Routes.ZuoWen import router as zuowen_router from Routes.RecognizeEduQuestion import router as ocr_router from Routes.VideoRetalkRoute import router as videoRetalk_router from Routes.ttsRoute import router as tts_router +from Routes.CopyFaceRoute import router as copyFace_router # 控制日志输出 logger = logging.getLogger('lightrag') logger.setLevel(logging.INFO) @@ -84,6 +85,7 @@ app.include_router(ocr_router) # 教育场景识别 app.include_router(videoRetalk_router) # 视频复读 app.include_router(tts_router) # 文本转语音 +app.include_router(copyFace_router) # 抄脸 # Teaching Model 相关路由 # 登录相关(不用登录) diff --git a/dsLightRag/static/LibLib/copyface.html b/dsLightRag/static/LibLib/copyface.html new file mode 100644 index 00000000..d9f79030 --- /dev/null +++ b/dsLightRag/static/LibLib/copyface.html @@ -0,0 +1,301 @@ + + + + + + 人像换脸生成器 + + + +
+

🎭 人像换脸生成器

+ +
+ + +
+ +
+ + +
+ +
+

参考图片预览:

+ 参考图片预览 +
+ + + + +
+
+

正在生成中,请稍候...

+
+ + +
+ + + + \ No newline at end of file