优化脚本
This commit is contained in:
@@ -494,7 +494,11 @@ _CREATIVE_DIRECTION = """
|
||||
- 痛点镜:拍得到的细节,而非抽象感受。例如「开会前刘海粘成一绺」而不是「头发很油」。
|
||||
- 卖点镜:只证明一个卖点,必须写清「原本卡在哪里 → 手怎么使用商品 → 眼前有什么变化」。
|
||||
不准只报参数、堆形容词或重复商品名。
|
||||
- CTA 镜:回到前面那个具体情境,给一个自然的选择/动作;不要硬喊「赶紧下单」。
|
||||
- CTA 镜:回到前面那个具体情境,说清**谁适合、为什么值得试**,用一句像跟朋友说话的口语收尾。
|
||||
**禁止平台指令腔**:小黄车、购物车、点下方、点击购买、立即购买、马上/赶紧下单、抢购、秒杀、
|
||||
手慢无、别犹豫、买它、闭眼入、上车 —— 这些一出现整条就掉回广告,观众直接划走。
|
||||
合格例子:「你要是也天天下午三点犯困,可以试试这个」「链接放这儿了,先看看合不合适」。
|
||||
紧迫感只能来自商品资料里的真实事实,没有就不制造;画面里也不许出现购买浮层或价格贴片。
|
||||
|
||||
### 画面与台词必须互相提供新信息
|
||||
- 每个 15 秒场只安排**一个连续的核心动作链**,例如「拆开 → 倒入 → 颜色变化」,
|
||||
@@ -517,7 +521,7 @@ _CREATIVE_DIRECTION = """
|
||||
```
|
||||
【本镜任务】这一段要让观众看懂的变化或悬念。
|
||||
【光线氛围】光源方向与性质(窗光/顶光/台灯/逆光);色温冷暖;明暗对比;整体色调。全片各镜保持一致。
|
||||
【声音】台词/旁白状态;音效;背景音乐;字幕。没有就写「无」;没有配乐写「无配乐,仅同期声」。
|
||||
【声音】台词/旁白状态;音效;背景音乐。没有就写「无」;没有配乐写「无配乐,仅同期声」。**不要写字幕这一栏** —— 本系统出的视频一律无字幕。
|
||||
【画面内容】
|
||||
0-3s:景别;机位高度与角度;运镜;主体在画面中的位置;具体动作;情绪或信息变化。
|
||||
3-8s:景别;机位;运镜;手与商品的空间关系(哪只手、握哪里、从哪个方向入画);可见细节。
|
||||
@@ -536,8 +540,9 @@ _CREATIVE_DIRECTION = """
|
||||
- **禁止抽象词**:「展示商品」「呈现质感」「体现高级感」「氛围到位」「传递温暖」——
|
||||
这些不是画面,是评价。要写成「杯壁上的水珠顺着往下滑」「她眉头松开,肩膀塌下来」。
|
||||
- **禁止心理描写**:模型拍不出「她内心很纠结」,要写「她拿起又放下,手指在包装边缘停了两秒」。
|
||||
- **禁止画面里出现文字**:不要写字幕、花字、标题、价格贴片、UI、弹窗、对比图表;
|
||||
商品包装上原有的真实文字除外。
|
||||
- **禁止画面里出现文字**:本系统出的**任何视频都不带字幕**。不要写字幕、花字、标题、片头片尾、
|
||||
水印、角标、价格贴片、优惠标签、弹幕、对话气泡、贴纸、参数表、对比图表、UI、按钮、购物浮层;
|
||||
口播和台词只以声音存在。商品包装上原有的真实文字除外。
|
||||
- **禁止一镜内跨场景/跨时间蒙太奇**:15 秒是**一个连续的动作链**,同一地点、同一光线、
|
||||
同一套衣服。要换环境就换到下一镜,并在 entity_refs 里换成另一个 scene。
|
||||
|
||||
@@ -546,10 +551,20 @@ _CREATIVE_DIRECTION = """
|
||||
包装、光线、地点或色调。每一镜的【光线氛围】要和相邻镜衔接得上(同一场戏不能上一镜暖黄台灯、
|
||||
下一镜冷白日光)。商品的用法要符合物理常识:热饮有蒸汽、液体会流动、包装要先打开才能取出内容物。
|
||||
|
||||
输入如果是 `【镜头 01】` 导演分镜稿,把原稿的景别、机位、运镜、动作、表情、音效、背景音乐、字幕、备注
|
||||
折进对应栏,不要压成一句画面摘要。
|
||||
输入如果是 `【镜头 01】` 导演分镜稿,把原稿的景别、机位、运镜、动作、表情、音效、背景音乐、备注
|
||||
折进对应栏,不要压成一句画面摘要。**原稿里的「字幕 / 花字」一栏一律丢弃**,绝不搬进新脚本 ——
|
||||
参考视频有字幕不代表我们的成片要有。
|
||||
"""
|
||||
|
||||
# CTA 平台指令腔:一出现整条就从「真人分享」掉回「电视购物」,且换平台就穿帮。
|
||||
# 用户明确要求全系统去掉「小黄车」那套话术,这里做成硬闸,模型跑偏就打回重写。
|
||||
_CTA_BANNED_PHRASES = (
|
||||
"小黄车", "购物车", "点下方", "点击下方", "点下面", "点击购买", "立即购买", "立刻购买",
|
||||
"马上下单", "赶紧下单", "立即下单", "抓紧下单", "抢购", "秒杀", "手慢无", "别犹豫",
|
||||
"买它", "闭眼入", "上车", "冲鸭",
|
||||
)
|
||||
|
||||
|
||||
# 这些句式几乎总会让首屏像模板广告。只作为生成后的最后一道门,不替代模型的创作判断。
|
||||
_GENERIC_HOOK_PHRASES = (
|
||||
"大家好", "今天", "给大家", "给你们", "给姐妹", "分享一下", "推荐一下",
|
||||
@@ -739,7 +754,8 @@ def build_agent_messages(
|
||||
"并写清哪只手、从哪个方向入画、握商品哪里,以及真实用法"
|
||||
"(茶=热水+蒸汽+茶汤变色,禁止茶包丢进冷白开;禁止悬浮肢体、商品凭空出现)。"
|
||||
"只写拍得出来的东西:禁止「展示商品/呈现质感/体现高级感」这类评价词,禁止心理描写,"
|
||||
"禁止画面里出现字幕花字标题价签,禁止一镜内跨场景跨时间。"
|
||||
"禁止画面里出现任何文字叠加(字幕/花字/标题/水印/角标/价签/购物浮层),口播只以声音存在;"
|
||||
"禁止一镜内跨场景跨时间。"
|
||||
f"禁止一句空画面撑满 {SEGMENT_DURATION_MAX} 秒。允许另给 beats 数组,后端会折进 visual。\n"
|
||||
)
|
||||
if fmt == "oral":
|
||||
@@ -817,8 +833,9 @@ def build_agent_messages(
|
||||
"【任务】参考视频改写:用户给了一份逐镜拆解稿。"
|
||||
"照搬它的镜头顺序、每镜时长比例、景别、机位、运镜、人物动作和声音层次,"
|
||||
"把人物、商品、品牌、台词全部换成当前商品。"
|
||||
"写 visual 时把拆解稿里的景别/机位/运镜/人物动作/表情/音效/背景音乐/字幕/备注"
|
||||
"写 visual 时把拆解稿里的景别/机位/运镜/人物动作/表情/音效/背景音乐/备注"
|
||||
"折进【声音】和【画面内容】的秒级分镜,不要压成一句画面摘要。"
|
||||
"**拆解稿里的「字幕」栏一律丢弃**,不要搬进新脚本 —— 我们的成片不带字幕。"
|
||||
"原稿写「无 / 不可见 / 听不清」的栏不要编造。"
|
||||
"钩子、已选结构的核心步骤和商品事实必须能对上。"
|
||||
"每镜旁白要能撑满指定时长;画面必须按秒拆分镜,够导演在 15 秒里切 3–5 刀。\n"
|
||||
@@ -1044,6 +1061,24 @@ def assert_script_has_a_hook(draft: dict) -> None:
|
||||
raise ValueError("开场像泛泛推荐,请直接从具体场景、反差或问题切入")
|
||||
|
||||
|
||||
def assert_cta_is_not_shouty(draft: dict) -> None:
|
||||
"""拦住「点下方小黄车」那套平台指令腔:CTA 要回到情境、点名谁适合,不是喊口号。
|
||||
扫全片口播/对白(不只 CTA 镜),因为这类话经常顺手塞进末镜旁白的最后一句。"""
|
||||
for index, seg in enumerate(draft.get("segments") or []):
|
||||
if not isinstance(seg, dict):
|
||||
continue
|
||||
speech = _speech_text(seg)
|
||||
hit = next((phrase for phrase in _CTA_BANNED_PHRASES if phrase in speech), None)
|
||||
if hit:
|
||||
raise ValueError(
|
||||
f"第 {index + 1} 镜出现了平台指令腔「{hit}」,请改成回到具体情境、点名谁适合的自然口语收尾"
|
||||
)
|
||||
hook = str(draft.get("hook") or "")
|
||||
hit = next((phrase for phrase in _CTA_BANNED_PHRASES if phrase in hook), None)
|
||||
if hit:
|
||||
raise ValueError(f"钩子里出现了平台指令腔「{hit}」,请换成具体场景或反差")
|
||||
|
||||
|
||||
def assert_intra_shot_beats(seg: dict, index: int, duration: int) -> None:
|
||||
"""15 秒场必须按秒拆出分镜,否则下游视频只能对着一句空描述乱编。"""
|
||||
need = min_beats_for_duration(duration)
|
||||
@@ -1727,6 +1762,7 @@ def stream_script_agent(
|
||||
selling_titles=selling_titles,
|
||||
)
|
||||
assert_shot_density(candidate, fmt)
|
||||
assert_cta_is_not_shouty(candidate)
|
||||
return candidate
|
||||
|
||||
routed_stream = stream_routed_text_request(
|
||||
|
||||
Reference in New Issue
Block a user