python实现seedance2图片多图参考ai短剧漫剧分镜脚本生成器代码bfwseedstory手动版

代码语言:python

所属分类:其他

版本2(最新):python+openai兼容api实现seedance2图片多图参考ai短剧漫剧分镜脚本生成器代码bfwseedstory

版本1(旧版):python实现seedance2图片多图参考ai短剧漫剧分镜脚本生成器代码bfwseedstory手动版

代码描述:python实现seedance2图片多图参考ai短剧漫剧分镜脚本生成器代码bfwseedstory手动版,传完整分集剧本,自动生成每一集的seedance2多片段(每个片段10秒)的文本及参考图视频生成分镜脚本,每一步会生成专门的提示词去免费ai模型聊天生成回复后粘贴下一步,一个ai漫剧短剧无需花一分钱就能制作。

代码标签: python seedance 图片 参考 ai 短剧 漫剧 分镜 脚本 生成器 代码 bfwse

下面为部分代码预览,完整代码请点击下载或在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

# ================= 配置区域 =================
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):
    """清理用户粘贴的可能带有 markdown 格式的 JSON 字符串"""
    text = text.strip()
    if text.startswith("```json"): text = text[7:]
    elif text.startswith("```"): text = text[3:]
    if text.endswith("```"): text = text[:-3]
    return text.strip()

# ================= 后端路由 =================
@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 (?, '', '', '')", (pid,))
    conn.commit()
    conn.close()
    return jsonify({"success": True, "id": pid})

@app.route("/project/<int:pid>")
def project_view(pid):
    conn = get_db()
    proj = conn.execute("SELECT * FROM projects WHERE id=?", (pid,)).fetchone()
    if not proj: return "项目不存在"
    data = conn.execute("SELECT * FROM project_data WHERE project_id=?", (pid,)).fetchone()
    images = conn.execute("SELECT * FROM images WHERE project_id=? ORDER BY ref_id", (pid,)).fetchall()
    
    storyboard_val = data['storyboard'] if data and data['storyboard'] else "[]"
    storyboard_safe = json.dumps(storyboard_val)
    
    # 将 images 转换为 list dict,方便前端生成提示词
    images_json = json.dumps([dict(img) for img in images])
    
    return render_template_string(PROJECT_HTML, project=proj, data=data, images=images, storyboard_safe=storyboard_safe, images_json=images_json)

# --------- 处理用户粘贴的设定 JSON ---------
@app.route("/api/project/<int:pid>/extract", methods=["POST"])
def api_extract_manual(pid):
    script_text = request.json.get("script", "")
    settings_str = request.json.get("settings_json", "")
    try:
        # 解析用户粘贴的 JSON
        settings = json.loads(clean_json_string(settings_str))
        
        conn = get_db()
        cursor = conn.cursor()
        cursor.execute("UPDATE project_data SET script=?, settings_json=? WHERE project_id=?", (script_text, json.dumps(settings), pid))
        cursor.execute("DELETE FROM images WHERE project_id=?", (pid,))
        
        ref_id = 1
        for cat in ["characters", "scenes", "props"]:
            for item in settings.get(cat,[]):
                cursor.execute("INSERT INTO images (project_id, ref_id, name, description, file_path) VALUES (?, ?, ?, ?, '')", (pid, ref_id, item.get("name"), item.get("desc")))
                ref_id += 1
        conn.commit()
        conn.close()
        return jsonify({"success": True})
    except json.JSONDecodeError:
        return jsonify({"success": False, "error": "JSON 格式解析失败,请确保粘贴了正确的格式"})
    except Exception as e:
        return jsonify({"success": False, "error": str(e)})

.........完整代码请登录后点击上方下载按钮下载查看

网友评论0