LLM 在视频管道中的作用
如果你正在构建用于 NSFW 视频脚本的 LLM API 工作流,首先要确定的是分工。语言模型负责撰写。单独的视频模型、编辑器或拍摄团队负责制作画面。该服务仅提供第一部分:一个开放权重文本模型,针对合法成人用途进行了优化,能够针对问题直接回答而不进行内容拒绝,并通过 OpenAI 兼容的接口提供服务。它不会渲染帧、合成语音或创建图像,也不提供嵌入或微调功能。
这仍然涵盖了面向成人受众的项目的大量工作,例如小说、角色扮演和伴侣式叙事。该模型可以起草处理方案,将其拆分为场景,撰写对话和旁白,生成逐镜头列表,并为下游使用的任何视频工具编写提示词。NSFW 流水线页面描述了文本阶段如何与堆栈的其余部分连接。
有一条固定规则适用于所有请求:禁止涉及未成年人的性内容。构建系统提示词以确保每个角色都是成年人,并将此作为项目要求,而非事后补充。
四阶段管道
当每次调用只完成一项工作并将结构化输出传递给下一步时,脚本工作流效果最佳。实际布局如下:
- 故事圣经。 包含角色(均为成年人)、背景、基调和重复细节的文档。你只需编写一次,并在每次调用时发送。
- 大纲。 一次调用将前提转化为 8 到 15 个节拍摘要。
- 场景剧本。 每个情节一次调用,生成对话、动作线和旁白,利用故事圣经和前一个场景保持连贯性。
- 镜头列表和提示词。 每个场景的最终调用返回 JSON 格式数据:镜头、时长、镜头说明以及你的视频工具所需的提示词字符串。
这样拆分可保持输出简短,使每个结果更易于审查,若不满意则重新生成的成本更低。这也意味着失败的调用只影响一个场景,而非整个剧本。
设定规则的系统提示词
系统提示词包含基调、格式和限制。无拒绝行为的模型仍会遵循指令,因此提示词的质量决定剧本的质量。具体说明类型、视角和省略内容。以下是面向成人观众的虚构作品起点,保持专业风格:
SYSTEM = '''You are a screenwriter for adult-audience fiction videos.
All characters are adults aged 25 or older, and you state each age in the character sheet.
Write in present tense, third person, with short visual action lines.
Keep dialogue natural and under 25 words per line.
Build tension and character through setting, glances and subtext.
Never include minors in any role or reference.
Follow the story bible exactly; do not change names, ages or relationships.
When asked for JSON, return only the JSON object.'''
根据项目调整。黑色电影悬疑片和浪漫喜剧需要不同的指令,提示词中的一行风格示例通常比一段形容词更能引导模型。
以 JSON 模式生成分镜列表
对于分镜列表阶段,你需要代码可读取的输出。JSON 模式强制执行可解析对象。传递 response_format={"type": "json_object"},在提示词中命名键并保持低 temperature。此示例使用 Python openai 包,配合本站的 Base URL 和模型 ID uncensored。
import json, os
from openai import OpenAI
client = OpenAI(
base_url="https://api.nsfwvideogenerator.cc/v1",
api_key=os.environ["NOTRACK_API_KEY"],
)
SYSTEM = open("system_prompt.txt").read()
BIBLE = open("story_bible.txt").read()
def shot_list(scene_text):
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": (
"Story bible:\n" + BIBLE +
"\n\nScene script:\n" + scene_text +
"\n\nReturn a JSON object with key 'shots': a list of objects with "
"'number', 'seconds', 'camera', 'action' and 'video_prompt'."
)},
],
response_format={"type": "json_object"},
temperature=0.3,
seed=7,
)
data = json.loads(resp.choices[0].message.content)
return data["shots"]
for shot in shot_list(open("scene_03.txt").read()):
print(shot["number"], shot["seconds"], shot["video_prompt"])
在传递结果前进行验证。检查 shots 是否存在,seconds 是否为数字,以及提示词字符串是否非空。如果解析失败,重试一次。失败或被拒绝的请求不收费,因此错误调用的重试不产生额外费用。
创意文本的关键设置
不同阶段需要不同的设置,API 传递常规参数:temperature、top_p、stop、seed 以及频率和存在惩罚。
- 大纲和对话: temperature 0.8 到 1.0 以增加多样性。生成两到三个变体并选择一个。
- 分镜列表: temperature 0.2 到 0.3,加上固定
seed,以便相同输入的重新运行具有可比性。 - 重复: 长场景有时会循环同一短语。较小的频率惩罚(如 0.3)有帮助。
- 长度控制:
max_tokens是可选的,但对场景设置 800 的上限可使输出更紧凑。stop序列(如"END SCENE")允许你在要求模型写入的标记处结束。 - 流式输出: 如果作家实时观看输出,请开启
stream: true。请注意,流式输出会占用并发槽位直到结束。
快速入门 列出了所有支持的参数,接口为 POST /v1/chat/completions 和 GET /v1/models。
利用 100k 上下文窗口保持连贯性
连贯性是生成剧本的常见失败点:名字改变、年龄漂移、道具消失。上下文窗口为 100,000 token(提示词加补全),足以将完整的故事圣经、大纲和几个已完成场景放入每次请求。在此规模的项目中,你不需要检索系统。粘贴事实,让模型每次读取。
上下文并非免费,但很便宜。假设你的故事圣经和大纲总计 20,000 token,你编写 50 个场景,每次调用返回约 600 token:
- 输入:50 x 20,000 = 1,000,000 token x 每 1M $0.15 = $0.15
- 输出:50 x 600 = 30,000 token x 每 1M $0.50 = $0.015
- 总计:50 个场景 $0.165
对相同的 50 个场景添加分镜列表环节,每次输入 3,000 token,输出 500 token:输入 150,000 token 成本 $0.0225,输出 25,000 token 成本 $0.0125,额外 $0.035。完整剧本和分镜列表成本约 $0.20,低于可从 API 密钥页面 领取的 $0.50 试用额度。
请注意,窗口必须同时容纳提示词和答案。20,000 token 的故事圣经留有充足空间,但 95,000 token 的提示词留给补全的空间很少。
审查和修复输出
将每个生成的场景视为初稿。三项检查可在达到视频工具前捕获大多数问题。首先,运行一致性检查:将完成的剧本连同故事圣经一起发送,要求模型列出任何名字、年龄、地点或时间线不一致的地方。第二次低 temperature 调用成本低,常能发现肉眼遗漏的漂移。其次,大声朗读对话。屏幕上看起来正常的台词在口述时可能笨拙,配音演员或文本转语音工具会立即暴露问题。第三,检查分镜时长总和是否符合计划长度。模型在算术上较松散,因此在代码中累加 seconds 字段,而非信任模型计算的总和。
当场景未达预期时,避免重写整个系统提示词。在用户消息中添加一条纠正指令,如“更短的动作线”或“更多对话,更少描述”,并仅重新生成该场景。保持故事圣经和系统提示词固定,同时每次只改变一条指令,可明确哪些更改有效。seed 参数在此很有用,因为固定种子配合小幅度提示词编辑可隔离编辑效果。
限制、诚实和下一步
构建前有一些明确限制。模型仅处理文本,因此所有视频、图像和音轨必须来自其他工具。它是由独立提供商运行的单一开放权重模型,并非任何大型供应商的官方 API。质量随提示词变化,因此计划由人工审查每个剧本;将输出视为草稿。
关于吞吐量,完整密钥允许 8 个并发请求和每分钟 300 个请求,而试用密钥允许 2 个和 60 个。如果你并行编写场景,请调整工作池大小以匹配。带有 rate_limited 或 concurrency 的 429 错误表示需要减速;带有 Retry-After: 5 标头的错误表示服务短暂过载,请等待五秒后重试。提示词不用于训练。
付费额度从 $20 充值开始,最高 $500 的任意整数金额,$50 以上赠送 5%,$100 以上赠送 10%,$200 以上赠送 15%。仅支持加密货币支付,TRC20 上的 USDT 或 Base 上的 USDC,额度永不过期。当前条款见 定价页面。对于上述项目,$20 可覆盖数十个完整剧本。
