优化全能创作部分优化脚本

This commit is contained in:
Azmat@qq.com
2026-09-10 18:59:08 +08:00
parent 0d56fdb299
commit 43f80a4d90
12 changed files with 1223 additions and 95 deletions
+34 -2
View File
@@ -948,6 +948,35 @@ _CAPTION_FIELD_INLINE_RE = re.compile(rf"[,;、]?\s*{_CAPTION_WORDS}\s*[
_CAPTION_CLAUSE_RE = re.compile(rf"[,;、]?\s*[^,;。\n]*{_CAPTION_WORDS}[^,;。\n]*[。]?")
_SPEECH_LINE_RE = re.compile(
r"^(\s*)(口播|旁白|台词|对白|解说)\s*[:]\s*(.+)$"
)
_SPEECH_AUDIO_ONLY_PREFIX = "人声(仅音频,由人物口型与配音表达,不出现在画面上):"
def rewrite_speech_as_audio_only(prompt: str) -> str:
"""把「口播:/旁白:/台词:」改写成「人声(仅音频…)」抬头。
全能创作 / 自由创作的 video_prompt 常按秒级分镜写「口播:…」。
裸摆口播原文时,出片模型极易把这段可见文本烧成画面字幕 —— 专业创作
已用同一抬头(_segment_script_text);这里对所有入口统一改写。
已带「仅音频」抬头的行不重复包一层。
"""
out: list[str] = []
for line in (prompt or "").split("\n"):
if "仅音频" in line and "人声" in line:
out.append(line)
continue
m = _SPEECH_LINE_RE.match(line)
if m:
indent, _kind, speech = m.group(1), m.group(2), m.group(3).strip()
if speech:
out.append(f"{indent}{_SPEECH_AUDIO_ONLY_PREFIX}{speech}")
continue
out.append(line)
return "\n".join(out)
def strip_caption_directives(prompt: str) -> str:
"""把正文里所有会让模型联想到「画面文字」的字样抹掉 —— 无论它是要求加字幕还是声明没有字幕。
模型不区分肯定否定,看到「字幕」这个词本身就更容易画出来,所以一律清掉,
@@ -966,15 +995,18 @@ def strip_caption_directives(prompt: str) -> str:
def enforce_no_embedded_captions(prompt: str) -> str:
"""所有视频入口(专业创作 / 一键成片 / 自由创作 / 视频复刻 / 提炼改写)最终汇入这里:
先洗掉正文里的字幕字段,再把最高优先级无字幕禁令置于提示词第一行
"""所有视频入口(专业创作 / 一键成片 / 自由创作 / 视频复刻 / 提炼改写 / 全能创作)最终汇入这里:
把「口播:」改写成仅音频抬头,再洗掉字幕字段,最后挂最高优先级无字幕禁令。
首镜最容易被模型自动加标题,所以不能再把禁令放在长提示词末尾。"""
# 顺序要紧:先摘掉可能已存在的规则本身,再洗正文,最后统一拼回去。
# 反过来的话,清洗器会把规则里「不要字幕…」那半句也当成字幕字样吃掉 → 摘不干净 → 规则拼两遍
# (重复 = 负面词频翻倍 = 更容易出字幕,正是本次要根治的毛病)。
base = (prompt or "").replace(NO_EMBEDDED_CAPTIONS_REQUIREMENT, "").replace(NO_EMBEDDED_CAPTIONS_TAIL, "")
base = base.replace(OPENING_SHOT_DIRECTIVE, "")
base = rewrite_speech_as_audio_only(base)
base = strip_caption_directives(base).strip()
# 首帧最容易被模型自动加标题页 → 规则放开头;末位权重高 → 结尾补一句中性的正面复述。
# 口播改写后再挂洁净规则,避免「口播:」原文被模型烧成字幕。
return f"{NO_EMBEDDED_CAPTIONS_REQUIREMENT}\n{base}\n{NO_EMBEDDED_CAPTIONS_TAIL}".strip()