python+openai兼容api实现seedance2图片多图参考ai短剧漫剧分镜脚本生成器代码bfwseedstory
代码语言:python
所属分类:其他
版本2(最新):python+openai兼容api实现seedance2图片多图参考ai短剧漫剧分镜脚本生成器代码bfwseedstory
版本1(旧版):python实现seedance2图片多图参考ai短剧漫剧分镜脚本生成器代码bfwseedstory手动版
代码描述:python+openai兼容api实现seedance2图片多图参考ai短剧漫剧分镜脚本生成器代码bfwseedstory,传完整分集剧本,自动生成每一集的seedance2多片段(每个片段10秒)的文本及参考图视频生成分镜脚本
代码标签: python openai 兼容 api seedance 图片 参考 ai 短剧 漫剧 分镜 脚
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
import os
import json
import sqlite3
from flask import Flask, request, jsonify, render_template_string, send_from_directory
from werkzeug.utils import secure_filename
from openai import OpenAI
# ================= 配置区域 =================
API_KEY = "sk-" # 请替换为您的真实 API Key
BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
MODEL_NAME = "qwen3.5-flash"
UPLOAD_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'uploads')
DB_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'app_data.db')
if not os.path.exists(UPLOAD_FOLDER): os.makedirs(UPLOAD_FOLDER)
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# ================= 数据库初始化 =================
def init_db():
conn = sqlite3.connect(DB_FILE)
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS projects (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP)''')
c.execute('''CREATE TABLE IF NOT EXISTS project_data (project_id INTEGER PRIMARY KEY, script TEXT, settings_json TEXT, storyboard TEXT)''')
c.execute('''CREATE TABLE IF NOT EXISTS images (id INTEGER PRIMARY KEY AUTOINCREMENT, project_id INTEGER, ref_id INTEGER, name TEXT, description TEXT, file_path TEXT)''')
conn.commit()
conn.close()
init_db()
def get_db():
conn = sqlite3.connect(DB_FILE)
conn.row_factory = sqlite3.Row
return conn
# ================= 大模型核心逻辑 =================
def clean_json_string(text):
text = text.strip()
if text.startswith("```json"): text = text[7:]
if text.startswith("```"): text = text[3:]
if text.endswith("```"): text = text[:-3]
return text.strip()
def generate_settings(script_text):
system_prompt = """你是一个顶级的电影美术指导。请提取剧本设定,同一个角色在不同时期不同场景外形差异较大要单独列出,例如“主角-小时候,主角-老年”。必须以JSON格式输出。
{
"characters":[{"name": "角色名", "desc": "性别年龄长相脸型发型外貌服饰特征音色综合描述"}],
"scenes":[{"name": "场景名称", "desc": "环境氛围细节详细描述"}],
"props":[{"name": "道具名称", "desc": "材质外观特征综合描述"}]
}"""
response = client.chat.completions.create(
model=MODEL_NAME, messages=[{"role": "system", "content": system_prompt}, {"role": "user", "content": f"剧本:\n{script_text}"}],
temperature=0.7
)
return json.loads(clean_json_string(response.choices[0].message.content))
def format_settings_text(images):
return "【世界观设定参考】\n" + "\n".join([f"- {img['name']}(参考图{img['ref_id']}):{img['description']}" for img in images])
def generate_episode_storyboard(script_text, settings_text, episode_num, mapping_str):
system_prompt = f"""你是一个顶级的影视分镜导演。
【核心强制要求】
1. 你需要以提供的剧本为提示词,单独生成【第 {episode_num} 集】的详细多个分镜片段,每个片段10秒,每个片段内部时间轴从0秒开始。
2. 包含:景别、镜头运动、光线、构图、场景环境、动作、台词。
3. 标记要求☆☆☆:凡提到以下元素,必须带上后缀:{mapping_str}
4. 直接输出该集分镜所有片段,无需任何寒暄或前言,画面无贴纸无字幕无遮挡。
【输出格式严格参考以下示例】:
###
【片段1】
[0-3秒] 全景,推镜头...张磊(参考图1)位于画面左侧(“这是我应得的!”)出现了。
[3-7秒] 特写...赵大虎(参考图2)位于画面右侧(“你也配?”)一脚踹了过去。
...
涉及元素:张磊(参考图1)、赵大虎(参考图2)
角色音色:张磊(青年男性,25 岁左右,声线沉稳干净,语速适中,咬字清晰自然,情绪温和舒展,无明显尖锐或沙哑感,整体通透有质感)、赵大虎(35 岁男性音色,声线低沉略带沙哑,语气张扬跋扈,尾音带挑衅感,咬字硬朗有力,气息强势外放,态度傲慢嚣张,自带压迫感)
###
【片段2】
...
"""
response = client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"{settings_text}\n\n【剧本内容】\n{script_text}\n\n请开始生成【第 {episode_num} 集】的分镜片段:"}
],
temperature=0.7
)
return response.choices[0].message.content
# ================= 后端路由 =================
@app.route("/")
def index():
conn = get_db()
projects = conn.execute("SELECT * FROM projects ORDER BY id DESC").fetchall()
return render_template_string(INDEX_HTML, projects=projects)
@app.route("/api/projects", methods=["POST"])
def create_project():
name = request.json.get("name", "未命名项目")
conn = get_db()
cursor = conn.cursor()
cursor.execute("INSERT INTO projects (name) VALUES (?)", (name,))
pid = cursor.lastrowid
cursor.execute("INSERT INTO project_data (project_id, script, settings_json, storyboard) VALUES (?, '', '', '')",.........完整代码请登录后点击上方下载按钮下载查看















网友评论0