From 2c5e4580a48adc6ee010a46d8f0053586ddeecf6 Mon Sep 17 00:00:00 2001 From: "Azmat@qq.com" Date: Wed, 2 Sep 2026 09:42:46 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E8=A7=86=E9=A2=91=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=B8=A6=E5=AD=97=E5=B9=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/backend/apps/ai/services.py | 12 +++++++----- core/backend/apps/ai/test_video_caption_policy.py | 3 ++- core/frontend/src/video-remix-page.css | 10 ++++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/core/backend/apps/ai/services.py b/core/backend/apps/ai/services.py index cd3a144..a9dee5e 100644 --- a/core/backend/apps/ai/services.py +++ b/core/backend/apps/ai/services.py @@ -875,7 +875,8 @@ class VideoSubmissionStateUnknown(ProviderOutcomeUnknownError): # 本系统出的任何视频都不带字幕。这条是最高优先级的成片硬性禁令,写得穷尽一点 —— # 实测只写「不要字幕」时,模型仍会自作主张加花字 / 价格贴片 / 购物浮层。 NO_EMBEDDED_CAPTIONS_REQUIREMENT = ( - "【字幕硬性禁令 · 最高优先级】本片是**无字幕成片**。画面中绝对不能出现任何后期文字或图形叠加,包括但不限于:" + "【字幕硬性禁令 · 最高优先级】从第0秒的开场首帧起直到片尾,本片必须是**无字幕成片**。" + "尤其前3秒不得出现任何标题、开场文案、花字或贴片;画面中绝对不能出现任何后期文字或图形叠加,包括但不限于:" "字幕、台词字幕、双语字幕、注音、标题、片头、片尾、花字、艺术字、水印、角标、台标、" "logo 贴片、价格贴片、优惠券、促销标签、倒计时、弹幕、对话气泡、贴纸、表情包文字、" "参数表、成分表、对比图表、评分条、UI 界面、按钮、购物车 / 购买浮层 / 商品卡、进度条、时间码。" @@ -906,11 +907,12 @@ def strip_caption_directives(prompt: str) -> str: def enforce_no_embedded_captions(prompt: str) -> str: """所有视频入口(专业创作 / 一键成片 / 自由创作 / 视频复刻 / 提炼改写)最终汇入这里: - 先洗掉正文里的字幕字段,再追加最高优先级的无字幕禁令。少一个入口都不行。""" + 先洗掉正文里的字幕字段,再把最高优先级的无字幕禁令置于提示词第一行。 + 首镜最容易被模型自动加标题,所以不能再把禁令放在长提示词末尾。""" base = strip_caption_directives(prompt or "").strip() - if NO_EMBEDDED_CAPTIONS_REQUIREMENT in base: - return base - return f"{base}\n{NO_EMBEDDED_CAPTIONS_REQUIREMENT}".strip() + # 统一把规则前置;即便调用方已经加过,也避免第二次拼接或把禁令淹没在正文中。 + base = base.replace(NO_EMBEDDED_CAPTIONS_REQUIREMENT, "").strip() + return f"{NO_EMBEDDED_CAPTIONS_REQUIREMENT}\n{base}".strip() def execute_routed_video_submit( diff --git a/core/backend/apps/ai/test_video_caption_policy.py b/core/backend/apps/ai/test_video_caption_policy.py index f6dacb7..eabafdb 100644 --- a/core/backend/apps/ai/test_video_caption_policy.py +++ b/core/backend/apps/ai/test_video_caption_policy.py @@ -16,6 +16,7 @@ class VideoCaptionPolicyTests(SimpleTestCase): self.assertIn(NO_EMBEDDED_CAPTIONS_REQUIREMENT, prompt) self.assertIn("一位用户在厨房展示商品", prompt) + self.assertTrue(prompt.startswith(NO_EMBEDDED_CAPTIONS_REQUIREMENT)) def test_requirement_is_not_duplicated(self): prompt = enforce_no_embedded_captions(NO_EMBEDDED_CAPTIONS_REQUIREMENT) @@ -24,7 +25,7 @@ class VideoCaptionPolicyTests(SimpleTestCase): def test_requirement_covers_the_overlays_seedance_likes_to_invent(self): """只写「不要字幕」时实测仍会冒出花字 / 价格贴片 / 购物浮层,禁令必须逐个点名。""" - for term in ("花字", "水印", "角标", "价格贴片", "弹幕", "购物车", "进度条", "片尾"): + for term in ("第0秒", "开场首帧", "前3秒", "花字", "水印", "角标", "价格贴片", "弹幕", "购物车", "进度条", "片尾"): self.assertIn(term, NO_EMBEDDED_CAPTIONS_REQUIREMENT, msg=f"禁令漏了「{term}」") # 提示词别处若还残留「字幕」字样,以本条为准 —— 解决自相矛盾导致的偶发出字幕 self.assertIn("以本条为准", NO_EMBEDDED_CAPTIONS_REQUIREMENT) diff --git a/core/frontend/src/video-remix-page.css b/core/frontend/src/video-remix-page.css index f0173b4..60b10a5 100644 --- a/core/frontend/src/video-remix-page.css +++ b/core/frontend/src/video-remix-page.css @@ -393,11 +393,13 @@ .vr-page .remix-prompt-panel .analysis-prompt { width: 100%; - height: 162px; - min-height: 162px; - max-height: 162px; + /* 分镜稿动辄十几行,162px 只能看到两三镜,滚动条里翻稿太难受 —— 按视口给高度, + 矮屏保底 300px,高屏最多 520px,再长才交给内部滚动。 */ + height: clamp(300px, 46vh, 520px); + min-height: 300px; + max-height: 520px; overflow-y: auto; - resize: none; + resize: vertical; padding: 15px; border: 1px solid rgba(0, 47, 167, 0.14); border-radius: 11px;