解决视频生成带字幕问题

This commit is contained in:
Azmat@qq.com
2026-09-02 09:42:46 +08:00
parent 5e02c1081a
commit 2c5e4580a4
3 changed files with 15 additions and 10 deletions
+7 -5
View File
@@ -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(
@@ -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)