ai_service/scripts/run_pipline.md
2025-06-09 16:08:14 +08:00

208 lines
5.7 KiB
Markdown
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.

# 自动执行流程说明文档
本流程通过多个脚本与配置文件协作,自动生成海报的排版、文案、图像并输出 PSD 文件,最终通过 API 提供服务。
---
## 一、自动执行流程的步骤
### 步骤 1: 配置加载
**目标**:加载必要的配置信息(如 API 密钥、字体规则、Prompt 模板)。
**涉及文件**
- `.env`:加载 DeepSeek API 密钥等环境变量。
- `configs/fonts.yaml`:加载字体与配色规则。
- `configs/prompts.json`:加载图像生成 Prompt 模板。
**过程**
- 使用 `dotenv` 加载 `.env` 中的 `DEEPSEEK_API_KEY`
- 使用 `yaml``json` 库加载 `fonts.yaml``prompts.json`
**输出**:配置对象(字典或类),供后续步骤使用。
---
### 步骤 2: 排版生成
**目标**:使用 LLM 生成海报的排版结构Vue 组件)。
**涉及文件**
- `scripts/generate_layout.py`:调用 DeepSeek API 生成 Vue 组件代码。
**过程**
- 调用 `generate_layout.py` 中的 `generate_vue_code` 函数。
- 传入从 `prompts.json` 动态读取的 Prompt结合字体规则生成 Vue 代码。
**输出**Vue 组件代码,保存为 `outputs/generated_code.vue`
---
### 步骤 3: 文案生成
**目标**:生成海报文案内容(标题、副标题、活动描述等)。
**涉及文件**
- `scripts/generate_text.py`:调用 LLM 生成文案。
**过程**
- 调用脚本生成端午节相关文案(如“端午安康”、“包粽子比赛”)。
- 文案可按 `prompts.json` 中模板动态调整。
**输出**:文案内容(字符串或字典),供后续步骤使用。
---
### 步骤 4: 图像生成
**目标**:使用 ComfyUI 生成海报图层。
**涉及文件**
- `comfyui_flows/layer_generation.json`:定义图层生成流程。
- `scripts/generate_images.py`:调用 ComfyUI API 生成图层。
- `images/`:存储背景、前景、文字图层。
**过程**
- 运行 `generate_images.py`,加载 `layer_generation.json`
- 根据排版与文案生成:
- `background.png`
- `foreground.png`
- `text_overlay.png`
**输出**:图像文件保存到 `images/` 目录。
---
### 步骤 5: 合成海报
**目标**:将图层合成为最终海报。
**涉及文件**
- `scripts/compose_poster.py`:合成图层脚本。
- `outputs/final_poster.png`:合成结果。
**过程**
- 读取 `generated_code.vue` 中的排版位置信息。
- 使用 `image_utils.py` 对图层进行合成。
**输出**`final_poster.png`
---
### 步骤 6: 导出 PSD 文件
**目标**:导出 PSD 文件以便后期修改。
**涉及文件**
- `scripts/export_psd.py`PSD 导出脚本。
- `outputs/final_poster.psd`:导出的 PSD 文件。
**过程**
-`final_poster.png` 转换为 PSD。
- 保留图层信息。
**输出**`final_poster.psd`
---
### 步骤 7: 提供前端接口
**目标**:将结果通过 API 提供给前端调用。
**涉及文件**
- `run_pipeline.py`:协调整体流程并定义 API 接口。
**过程**
- 使用 `FastAPI``Flask` 创建端点(如 `/generate_poster`)。
- 接收前端请求,依次调用上述所有步骤。
- 返回最终文件的 URL 或文件流。
**输出**HTTP 响应,包含 `final_poster.png` 链接或文件流。
---
## 二、如何实现自动执行流程
### 环境准备
- **依赖安装**:确保 `requirements.txt` 包含以下依赖:
- `openai`
- `python-dotenv`
- `PyYAML`
- `requests`(用于 ComfyUI API 调用)
- `Pillow`(图像处理)
- `psd-tools`PSD 导出)
- **API 密钥配置**:在 `.env` 文件中添加以下字段:
```env
DEEPSEEK_API_KEY=your_api_key
COMFYUI_API_KEY=your_comfyui_key
```python
import os
from dotenv import load_dotenv
from scripts.generate_layout import generate_vue_code
from scripts.generate_text import generate_text # 假设存在
from scripts.generate_images import generate_images # 假设存在
from scripts.compose_poster import compose_poster # 假设存在
from scripts.export_psd import export_psd # 假设存在
import yaml
import json
from fastapi import FastAPI, HTTPException
from fastapi.responses import FileResponse
# 加载环境变量和配置
load_dotenv()
app = FastAPI()
with open("configs/fonts.yaml", "r", encoding="utf-8") as f:
fonts_config = yaml.safe_load(f)
with open("configs/prompts.json", "r", encoding="utf-8") as f:
prompts_config = json.load(f)
# 一键执行流程
def run_pipeline():
try:
# 步骤 1: 排版生成
layout_code = generate_vue_code()
with open("../outputs/generated_code.vue", "w", encoding="utf-8") as f:
f.write(layout_code)
# 步骤 2: 文案生成
text_content = generate_text(prompts_config.get("text_prompt", ""))
# 步骤 3: 图像生成
generate_images(
workflow_path="comfyui_flows/layer_generation.json",
text_content=text_content,
output_dir="images/"
)
# 步骤 4: 合成海报
compose_poster(
layout_path="../outputs/generated_code.vue",
image_dir="images/",
output_path="../outputs/final_poster.png"
)
# 步骤 5: 导出 PSD
export_psd(
input_path="../outputs/final_poster.png",
output_path="../outputs/final_poster.psd"
)
return "../outputs/final_poster.png"
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# API 端点
@app.get("/generate_poster")
async def generate_poster():
output_path = run_pipeline()
return FileResponse(output_path, media_type="image/png")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
```