优化脚本

This commit is contained in:
Azmat@qq.com
2026-08-31 11:57:34 +08:00
parent f59e9d0418
commit cbd4f362d9
20 changed files with 261 additions and 74 deletions
+28 -13
View File
@@ -86,9 +86,9 @@ PRODUCT_PROMPT = (
"严格遵守每镜的新商品动作、场景与口播;不要恢复参考片原商品、原动作、原卖点或原台词。"
)
CHARACTER_PROMPT = (
"按下面这份分镜稿生成视频镜头数量、每镜时长、景别、机位、运镜、商品、场景、口播全部按稿执行,"
"不要增删镜头、不要改顺序"
"把稿里的原人物换成@目标角色,五官、发型、体态以参考图为准"
"以@参考视频镜头、人物动作、场景、节奏、口播和剪辑为唯一基准生成视频。"
"将画面中所有可见的原人物替换为@目标角色;五官、发型、体态和服装以角色参考图为准"
"保留原商品、场景、镜头运动、动作顺序和声音节奏,不添加字幕、花字或额外人物"
)
# 拆解期间的占位提示词。真正的提示词在 worker 拆完后回写。
@@ -625,11 +625,18 @@ def submit_video_replace(*, team, user, params: dict):
"feature": FEATURE,
}
# 分镜用「提炼提示词」同一套拆。原片只当拆解源,不进审核列表、也不传火山。
from .video_digest import resolve_digest_model_config
# 商品复刻需要 Gemini 拆镜后重构商品语义;角色复刻直接交给 Seedance 2.5
# 原视频与角色图都先进入同一火山素材库审核,再以 asset:// 作为参考。
if replace_mode == "product":
from .video_digest import resolve_digest_model_config
if resolve_digest_model_config() is None:
raise ValueError("视频提炼模型未配置,请联系管理员")
if resolve_digest_model_config() is None:
raise ValueError("视频提炼模型未配置,请联系管理员")
else:
image_refs = [
_owned_ref(video, kind="video", role="reference_video", label="参考视频"),
*image_refs,
]
# 商品图/角色图仍要过审才能当生成参考。提前送审 → 审核和提炼并行跑,明确不过审的直接 400。
review_state = _ensure_replace_refs_reviewed(team, image_refs)
if review_state == "failed":
@@ -648,11 +655,11 @@ def submit_video_replace(*, team, user, params: dict):
user=user,
params={
**base_params,
"prompt": DIGEST_PENDING_PROMPT,
"prompt": DIGEST_PENDING_PROMPT if replace_mode == "product" else CHARACTER_PROMPT,
"references": image_refs,
"extra_payload": extra,
},
digest_pending=True,
digest_pending=replace_mode == "product",
)
@@ -670,7 +677,11 @@ def advance_video_replace(task):
# worker 还在拆参考视频,提示词都没生成,别当成「审核中」反复送审。
# worker 挂了也不会永远卡着:CREATED 超 16 分钟由 _reap_stale_free_video_tasks 回收退费。
return task
references = _image_refs(payload.get("references") or [])
references = (
_image_refs(payload.get("references") or [])
if payload.get("replace_mode") == "product"
else list(payload.get("references") or [])
)
try:
state = _ensure_replace_refs_reviewed(task.team, references)
except ValueError as exc:
@@ -701,9 +712,10 @@ def advance_video_replace(task):
def start_replace_generation(task):
"""审核过了:整份分镜稿一次交给 Seedance 2.5。只带商品图/角色图,不传用户原片。"""
payload = dict(task.request_payload or {})
payload["references"] = _image_refs(payload.get("references") or [])
payload.pop("shot_plan", None)
payload.pop("shot_total", None)
if payload.get("replace_mode") == "product":
payload["references"] = _image_refs(payload.get("references") or [])
payload.pop("shot_plan", None)
payload.pop("shot_total", None)
task.request_payload = payload
task.save(update_fields=["request_payload", "updated_at"])
return start_pending_free_video(task)
@@ -719,6 +731,9 @@ def run_replace_digest(task) -> None:
if not is_video_replace_task(task) or task.status != AITask.Status.CREATED:
return
payload = task.request_payload or {}
# 角色复刻没有 Gemini 拆镜环节;审核通过后由 advance_video_replace 直接提交 Seedance。
if payload.get("replace_mode") == "character":
return
if not payload.get("digest_pending"):
return