第一部分:基石搭建 - 环境配置与模型 API 调用
这是整个项目的基础,如果这一步不稳固,后续的一切都无法进行。请务必仔细操作。
步骤 1.1:硬件与软件准备
- 硬件要求(重要):
介绍使用 Python 结合 LM Studio 本地部署 Wan2.2 模型构建 AI 长视频生成智能体的全流程。内容包括环境配置、模型下载与 API 调试、项目结构设计与代码封装、批量视频生成与拼接逻辑,以及用户界面构建与稳健性增强。旨在提供一套完整的本地化视频生成解决方案。
第一部分:基石搭建 - 环境配置与模型 API 调用
这是整个项目的基础,如果这一步不稳固,后续的一切都无法进行。请务必仔细操作。
Wan2.2。Wan2.2-T2V-A14B-GGUF (Text-to-Video)Wan2.2-I2V-A14B-GGUF (Image-to-Video)Q4_K_M 版本。它在质量和性能之间取得了很好的平衡。Q5_K_M 或 Q8_0 以获得更好质量。Q3_K_M,但质量会下降。Wan2.2-T2V-A14B-GGUF。http://localhost:1234。/v1/chat/completions 端点。你需要查看模型信息或尝试不同的端点。通常,它可能是 /v1/images/generations 或一个自定义路径。如果不确定,先保持默认,我们将在 Python 脚本中进行调试。这是验证环境是否成功的'Hello, World!'时刻。
video_agent。video_agent 文件夹内。python test_api.pylion_savanna.mp4 的视频文件。恭喜你,基础环境搭建成功!**404 Not Found**: 说明 API 端点 API_URL 错误。请回到 LM Studio,仔细检查模型页面的 'Developer' 标签页,找到正确的 Endpoint URL,并更新 test_api.py 中的 API_URL。**500 Internal Server Error**: 可能是模型未完全加载,或请求体格式 payload 不正确。检查 LM Studio 主界面,确保模型加载完成。然后,尝试简化 payload,只保留 prompt 和 model 字段。1234 正确。
请务必在这一步花费足够的时间,直到你能够稳定地生成单个视频片段。 这是后续所有工作的基础。创建测试脚本: 在 video_agent 文件夹中,创建一个名为 test_api.py 的文件,并粘贴以下代码:
import requests
import json
import time
# --- 配置区 ---
# LM Studio 本地服务器地址,请根据你的实际情况修改
API_URL = "http://localhost:1234/v1/images/generations"
# 这是一个常见的端点,如果不行,请查看 LM Studio 中模型页面的"Developer"标签页获取正确端点
HEADERS = {
"Content-Type": "application/json",
}
def test_t2v_generation(prompt: str, output_filename: str = "test_output.mp4"):
"""
测试调用 Wan2.2 T2V 模型生成视频
"""
print(f"🚀 正在向 '{API_URL}' 发送请求...")
print(f"📝 提示词:'{prompt}'")
# --- 请求体 ---
# !!! 重要:这个结构是基于常见 API 的猜测,可能需要根据 LM Studio 的实际 API 进行调整 !!!
# 请在 LM Studio 的模型页面 -> "Developer"标签页查看示例请求体
payload = {
"model": "Wan2.2-T2V-A14B-GGUF", # 模型标识符,通常是你加载的模型名
"prompt": prompt,
# 以下参数是可选的,你可以根据需要添加或修改
# "n": 1, # 生成视频的数量
# "size": "832x480", # 视频分辨率
# "steps": 30, # 推理步数,越多越慢但质量可能越好
# "cfg_scale": 7.5, # 引导系数
}
try:
# 发送 POST 请求
response = requests.post(API_URL, headers=HEADERS, json=payload, timeout=300) # 设置 5 分钟超时
# 检查响应状态码
if response.status_code == 200:
print("✅ 请求成功!正在处理响应...")
result = response.json()
# --- 响应处理 ---
# !!! 这是最需要根据实际情况修改的部分 !!!
# API 可能返回视频的 base64 编码,或者一个下载链接,或者直接是二进制流
# 这里我们假设它返回一个包含 URL 的 JSON 对象
if 'data' in result and len(result['data']) > 0 and 'url' in result['data'][0]:
video_url = result['data'][0]['url']
print(f"🔗 视频生成 URL: {video_url}")
# 下载视频文件
print("⬇️ 正在下载视频...")
video_response = requests.get(video_url, stream=True)
if video_response.status_code == 200:
with open(output_filename, 'wb') as f:
for chunk in video_response.iter_content(chunk_size=8192):
f.write(chunk)
print(f"🎉 视频已成功保存为:{output_filename}")
else:
print(f"❌ 下载视频失败:{video_response.status_code}")
else:
print("❌ 响应格式不符合预期,请检查 API 返回的 JSON 结构:")
print(json.dumps(result, indent=2))
else:
print(f"❌ API 请求失败,状态码:{response.status_code}")
print("错误信息:", response.text)
except requests.exceptions.RequestException as e:
print(f"❌ 网络请求出错:{e}")
except json.JSONDecodeError:
print("❌ 解析响应 JSON 失败,服务器可能返回了非 JSON 格式的错误信息。")
print("原始响应:", response.text)
if __name__ == '__main__':
# 确保 LM Studio 已加载模型并启动了服务器
input("请确保 LM Studio 已准备就绪,然后按 Enter 键开始测试...")
test_prompt = "A majestic lion walking slowly across the African savanna at sunset."
test_t2v_generation(test_prompt, "lion_savanna.mp4")
安装 Python 库: 打开你的终端(Windows 上是 CMD 或 PowerShell,macOS/Linux 上是 Terminal),进入项目文件夹,然后运行:
pip install requests
在这一部分,我们将把第一部分的单次调用代码,重构为一个结构化、可复用的系统。我们将实现从一系列文本/图片输入,到生成一系列视频片段,再到将它们拼接成一个完整视频的完整流程。
一个好的项目结构能让代码更清晰、更易于维护。请在你的 video_agent 文件夹中,创建以下目录和文件:
video_agent/
├── src/ # 存放我们的源代码
│ ├── __init__.py # 使 src 成为一个 Python 包
│ ├── model_interface.py # 封装与 LM Studio 的 API 交互
│ ├── generator.py # 负责批量生成视频片段
│ └── editor.py # 负责视频的拼接与编辑
├── temp/ # 存放临时生成的视频片段
├── output/ # 存放最终的成品视频
├── config.py # 存放配置信息(如 API 地址)
└── main.py # 主程序入口,用于测试和整合
创建方法:
.py 文件。macOS/Linux: 在终端中运行以下命令:
cd video_agent
mkdir -p src temp output
touch src/__init__.py src/model_interface.py src/generator.py src/editor.py config.py main.py
src/model_interface.py)我们将把第一部分 test_api.py 的核心逻辑抽象成一个类,方便后续调用。
编写 src/model_interface.py:
# src/model_interface.py
import requests
import json
import os
from typing import Optional
# 导入配置
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from config import T2V_ENDPOINT, I2V_ENDPOINT, T2V_MODEL_NAME, I2V_MODEL_NAME
class ModelInterface:
"""封装与 LM Studio 中 Wan2.2 模型的 API 交互"""
def __init__(self):
self.headers = {"Content-Type": "application/json"}
# 注意:Wan2.2 的 API 可能需要特定的请求体格式,这里的结构是基于常见 API 的推断
# 如果后续调用失败,请首先检查这里的 payload 结构是否与 LM Studio 开发者文档一致
self.default_payload = {
"steps": 30, # 推理步数,可根据性能调整
"cfg_scale": 7.5, # 引导系数
}
def _make_request(self, endpoint: str, payload: dict) -> Optional[dict]:
"""发送 POST 请求并处理通用响应"""
try:
response = requests.post(endpoint, headers=self.headers, json=payload, timeout=300)
response.raise_for_status() # 如果状态码不是 2xx,则抛出 HTTPError
return response.json()
except requests.exceptions.RequestException as e:
print(f"❌ API 请求失败:{e}")
return None
编写 config.py: 将配置项分离出来,便于管理。
# config.py
# LM Studio API 配置
LM_STUDIO_HOST = "http://localhost"
LM_STUDIO_PORT = "1234"
# 根据你在 LM Studio 中确认的端点进行修改
# T2V (Text-to-Video) 端点
T2V_ENDPOINT = f"{LM_STUDIO_HOST}:{LM_STUDIO_PORT}/v1/images/generations"
# I2V (Image-to-Video) 端点 (可能和 T2V 相同,也可能不同,需确认)
I2V_ENDPOINT = f"{LM_STUDIO_HOST}:{LM_STUDIO_PORT}/v1/images/generations"
# 模型名称
T2V_MODEL_NAME = "Wan2.2-T2V-A14B-GGUF"
I2V_MODEL_NAME = "Wan2.2-I2V-A14B-GGUF"
安装 MoviePy: 我们马上需要它来处理视频。
pip install moviepy

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online