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