208 lines
5.7 KiB
Markdown
208 lines
5.7 KiB
Markdown
# 自动执行流程说明文档
|
||
|
||
本流程通过多个脚本与配置文件协作,自动生成海报的排版、文案、图像并输出 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)
|
||
|
||
``` |