优化脚本
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user