python手动和自动ai短剧剧本生成多集分段seedance2分镜提示词代码bfwstoryfootage
代码语言:python
所属分类:其他
代码描述:python手动和自动ai短剧剧本生成多集分段seedance2分镜提示词代码bfwstoryfootage,支持一步一步手动复制提示词去免费ai大模型生成剧本和分镜提示词,还可以接入兼容openai协议的大模型api自动调用生成。
代码标签: python手动 自动 ai 短剧 剧本 生成 多集 分段 seedance2 分镜 提示词 bfw
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
import os
import sqlite3
import json
import urllib.request
import urllib.error
from flask import Flask, request, jsonify, render_template_string
app = Flask(__name__)
DB_NAME = "drama_generator2111.db"
# ==========================================
# 数据库初始化
# ==========================================
def init_db():
conn = sqlite3.connect(DB_NAME)
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS scripts
(id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, background TEXT,
characters TEXT, scenes TEXT, props TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
c.execute('''CREATE TABLE IF NOT EXISTS episodes
(id INTEGER PRIMARY KEY AUTOINCREMENT, script_id INTEGER, episode_num INTEGER, plot TEXT)''')
c.execute('''CREATE TABLE IF NOT EXISTS storyboards
(id INTEGER PRIMARY KEY AUTOINCREMENT, episode_id INTEGER, content TEXT)''')
# 版本记录表
c.execute('''CREATE TABLE IF NOT EXISTS versions
(id INTEGER PRIMARY KEY AUTOINCREMENT, target_type TEXT, target_id INTEGER,
content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
# 系统设置表 (用于保存API配置)
c.execute('''CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT)''')
# 初始化默认设置
c.execute("SELECT count(*) FROM settings")
if c.fetchone()[0] == 0:
default_settings = [
('api_mode', 'manual'),
('base_url', 'https://api.openai.com/v1'),
('api_key', ''),
('model', 'gpt-3.5-turbo')
]
c.executemany("INSERT INTO settings (key, value) VALUES (?, ?)", default_settings)
for col in ['characters', 'scenes', 'props']:
try:
c.execute(f"ALTER TABLE scripts ADD COLUMN {col} TEXT")
except Exception:
pass
conn.commit()
conn.close()
init_db()
def get_db():
conn = sqlite3.connect(DB_NAME)
conn.row_factory = sqlite3.Row
return conn
def save_version(cursor, target_type, target_id, content):
"""保存历史版本"""
if content and str(content).strip() and content != "[]":
cursor.execute("INSERT INTO versions (target_type, target_id, content) VALUES (?, ?, ?)",
(target_type, target_id, str(content)))
# ==========================================
# 提示词配置
# ==========================================
EPISODE_SYSTEM = """你是一个短剧编剧。请根据短剧设定生成连贯分集剧情大纲,同时生成完整的角色、场景、道具设定。
如果角色在不同场景、时间有不同的外貌或服饰特征,请单独列出一个新的角色描述(例如:“林辰-后期黑化”)。
角色描述要求所有维度的设定(包括性别、年龄、脸型、发型、外貌特征、音色、性格、服饰等)都写在一整段连续的文本中,不要分多个字段,每个角色的文本描述不少于80字。
场景描述要求:包含详细的视觉描述(环境建筑、地面材质、光影色调、氛围质感等),不少于50字。
道具描述要求:包含详细的外形、材质、颜色、尺寸描述,不少于20字。
请严格输出JSON格式,不要输出任何其他文字内容。JSON结构如下:
{
"episodes":[{"episode_num": 1, "plot": "本集详细剧情,不少于100字"}, ...],
"characters":[{"name": "角色姓名及状态", "description": "一段包含所有维度设定的详细描述"}, ...],
"scenes":[{"name": "场景名", "description": "详细场景视觉描述"}, ...],
"props":[{"name": "道具名", "description": "详细道具外形描述"}, ...]
}"""
STORYBOARD_SYSTEM_PROMPT = """你是一个专业的短剧编剧和分镜师。你需要根据提供的单集剧情,将其拆解成详细的连贯视频分镜脚本。
要求:
1. 每10秒为一个大片段(例如0-10秒包含多个小镜头),每个片段的分镜头时间都是从0秒开始。
2. 画面文字描述需包含:镜头景别、运动轨迹、光影、构图、人物位置、动作表情、内嵌对白台词、音效或背景音乐。
请严格参考以下【示例格式】进行输出:
【示例开始】
分镜画面
【0-10 秒:山洞】
0-2秒:全景,固定镜头,暖黄光晕,三分构图,林辰位于画面左侧,扶着苏清鸢走进隐秘温泉洞穴,洞穴内雾气缭绕,温泉散发着暖黄色光晕,神秘暧昧氛围, 林辰说:"清鸢,这里有处温泉,灵气浓郁,适合疗伤"。
2-5秒:中景,缓慢推镜,暖黄光晕,中心构图,苏清鸢居画面中心,脸颊微红,轻轻点头,靠在林辰肩上,羞涩温柔氛围, 苏清鸢轻声说:"嗯……麻烦你了"。
5-10秒:全景,固定镜头,林辰与苏清鸢拥抱在一起,天空出现爱心云朵,爱意的音乐。
【10-20 秒:奇遇】
0-4 秒:全景,固定镜头,冷蓝月光,三分构图,林辰独行于山涧草丛,夜色深沉,溪水潺潺,孤独氛围,脚步声与虫鸣音效。
4-7 秒:中景,跟随镜头,冷蓝月光,中心构图,林辰弯腰捡起发光物体,破旧聚宝杯居画面中心,杯身泛起微弱蓝光,神秘氛围,林辰疑惑说:“这是何物?”。
7-10 秒:特写,固定镜头,冷蓝月光,中心构图,聚宝杯纹理清晰,流光转动,林辰手指抚摸杯沿,好奇氛围,奇异嗡鸣音效。
……
【示例结束】
"""
# ==========================================
# 业务逻辑提取 (用于复用)
# ==========================================
def process_episode_reply(script_id, reply_text):
text = reply_text
if "```json" in text:
text = text.split("```json", 1)[1]
if "```" in text:
text = text.split("```", 1)[0]
text = text.strip()
result = json.loads(text)
conn = get_db()
c = conn.cursor()
c.execute("SELECT * FROM scripts WHERE id = ?", (script_id,))
script = c.fetchone()
# 存为历史版本
for field in ['characters', 'scenes', 'props']:
save_version(c, field, script_id, script[field])
characters = json.dumps(result.get('characters',[]), ensure_ascii=False)
scenes = json.dumps(result.get('scenes',[]), ensure_ascii=False)
props = json.dumps(result.get('props',[]), ensure_ascii=False)
c.execute("UPDATE scripts SET characters=?, scenes=?, props=? WHERE id=?",
(characters, scenes, props, script_id))
c.execute("DELETE FROM episodes WHERE script_id = ?", (script_id,))
for ep in result['episodes']:
c.execute("INSERT INTO episodes (script_id, episode_num, plot) VALUES (?, ?, ?)",
(script_id, ep['episode_num'], ep['plot']))
conn.commit()
conn.close()
return {
"status": "success",
"characters": result.get('characters', []),
"scenes": result.get('scenes',[]),
"props": result.get('props',[])
}
def process_storyboard_reply(episode_id, reply_text):
conn = get_db()
c = conn.cursor()
c.execute("SELECT content FROM storyboards WHERE episode_id = ?", (episode_id,))
old_sb = c.fetchone()
if old_sb: save_version(c, 'storyboard', episode_id, old_sb['content'])
c.execute("DELETE FROM storyboards WHERE episode_id = ?", (episode_id,))
c.execute("INSERT INTO storyboards (episode_id, content) VALUES (?, ?)", (episode_id, reply_text))
conn.commit()
conn.close()
return {"status": "success", "content": reply_text}
def call_openai_api(system_prompt, user_prompt):
"""通用请求 OpenAI API 兼容接口"""
conn = get_db()
c = conn.cursor()
c.execute("SELECT key, value FROM settings")
config = {row['key']: row['value'] for row in c.fetchall()}
conn.close()
base_url = config.get('base_url', '').strip().rstrip('/')
if not base_url.endswith('/chat/completions'):
base_url += '/chat/completions'
api_key = config.get('api_key', '').strip()
model = config.get('model', 'gpt-3.5-turbo').strip()
if not base_url or not api_key:
raise Exception("未配置 API Base URL 或 API Key,请在设置中配置。")
headers = {
'Content-Type': 'application/json',
'Authorization': f"Bearer {api_key}"
}
data = {
"model": model,
"messages": [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
],
"temperature": 0.7
}
req = urllib.request.Request(base_url, data=json.dumps(data).encode('utf-8'), headers=headers, method='POST')
try:
# LLM 生成时间较长,设置 180 秒超时
with urllib.request.urlopen(req, timeout=180) as response:
result = json.loads(response.read().decode('utf-8'))
return result['choices'][0]['message']['content']
except urllib.error.HTTPError as e:
err_body = e.read().decode('utf-8')
raise Exception(f"API 请.........完整代码请登录后点击上方下载按钮下载查看















网友评论0