摘要
红果类短剧分为男频、女频两大主流赛道,二者在叙事钩子、人物关系、冲突类型、镜头侧重、台词风格上存在显著差异。直接使用通用大模型生成剧本,容易出现题材风格混淆、钩子缺失、文本非结构化,无法直接喂给 AI 漫剧渲染流水线。本文基于本地部署开源大模型(Qwen‑2.5‑7B‑Instruct 量化版本),实现男频 / 女频两套编剧 Skill 提示词模板,配套 Python 脚本完成剧本生成、格式校验、剧本清洗、分镜 JSON 转换,输出可以直接对接 ComfyUI/Wan2.2 批量渲染、本地 TTS 配音的标准化数据,全部流程离线本地运行,适配 8G 消费级显卡,打通「剧本生成‑结构化解析‑漫剧渲染‑后期成片」完整链路。
资源说明:配套提示词模板、角色配置、脚本样例资源包: 我用夸克网盘给你分享了「【103】女频男频短剧编剧 skill」 链接:https://pan.quark.cn/s/31b9f71f84b8说明:资源包仅为学习模板,实际业务需要人工校验剧本内容合规性。
AI漫剧模型资源请看这一篇文章:https://developer.aliyun.com/article/1771007?spm=a2c6h.12873639.article-detail.5.227d1ac1Hahx8W
一、业务背景与链路总览
1.1 男频、女频短剧核心风格差异
表格
| 维度 | 女频短剧 | 男频短剧 |
| 核心冲突 | 情感纠葛、豪门恩怨、重生复仇、婆媳虐恋、恋爱拉扯 | 逆袭打脸、身份反转、都市战神、冒险闯关、实力升级 |
| 开篇钩子 | 背叛、误会、羞辱、情感危机 | 打压、欺辱、身份被蔑视、绝境逆袭 |
| 镜头侧重 | 人物表情特写、神态、服装光影氛围感 | 动作场面、对峙打斗、气场、道具排场 |
| 台词特征 | 情绪细腻,大量人物对话 | 短句干脆,冲突感强,爽点密集 |
编剧 Skill 的核心:给本地 LLM 注入对应题材的系统提示,强制约束钩子、反转、结尾留悬念的短剧写作范式,避免大模型输出小说式大段心理描写,输出强视觉化剧本文本,便于后续转为 AI 漫剧分镜。
1.2 完整流水线链路
本地Qwen大模型 + 男女频编剧Skill模板 → 原始短剧剧本markdown输出 → Python脚本:剧本清洗、格式校验、角色抽取 → 转换为标准化分镜JSON → ComfyUI/Wan2.2批量渲染漫剧视频 → 台词提取送入本地TTS → FFmpeg音视频混流、字幕压制输出成片
1.3 硬件环境
- 显卡:NVIDIA 8G 显存,使用 GGUF‑Q4_K_M 量化本地大模型
- CUDA 版本:12.1
- 依赖:llama‑cpp‑python、json、re、pydantic
二、环境依赖安装
# 核心本地大模型推理库,用于加载GGUF量化模型 pip install llama‑cpp‑python pydantic re json -i https://pypi.tuna.tsinghua.edu.cn/simple
三、Skill 系统提示词模板(男频 / 女频)
这是编剧 Skill 核心,可保存为 txt 文件,脚本运行时读取注入大模型上下文。
女频系统提示 skill_female.txt
你是专业女频竖屏短剧编剧,严格遵守短剧创作规则: 1.每一集开篇3‑5秒必须抛出情绪钩子:背叛、误会、羞辱、情感危机; 2.单集60‑90秒,对话优先,减少大段心理描写,把心理活动转为动作神态; 3.单集中段设置小反转,结尾必须留下悬念钩子,引导看下一集; 4.输出剧本格式:【集名】、场景、人物、动作(括号)、台词; 5.输出不要多余解释,只输出剧本; 6.输出要适合9:16竖屏画面生成,动作描写具备画面可渲染性。
男频系统提示 skill_male.txt
你是专业男频竖屏短剧编剧,严格遵守短剧创作规则: 1.开篇立刻制造绝境、被欺辱、身份被蔑视的钩子; 2.单集60‑90秒,爽点密集,短句对话,侧重对峙、气场、冲突; 3.中段安排小打脸反转,结尾留下身份悬念或者危机钩子; 4.输出剧本格式:【集名】、场景、人物、动作(括号)、台词; 5.禁止大段内心独白,全部转化为可视的动作行为; 6.输出适配9:16竖屏AI视频生成,所有描述必须可以转为画面。
四、Pydantic 剧本数据结构定义(做输出格式约束)
新建 drama_schema.py,强类型约束剧本解析输出,保证后续流水线字段统一。
from pydantic import BaseModel, Field from typing import List, Optional class SingleShot(BaseModel): """单场镜头结构,对接漫剧渲染""" scene_title: str = Field(description="场景名称,内/外,日/夜,地点") character_list: List[str] = Field(description="本场出场角色") action_desc: str = Field(description="动作神态描述,用于生成画面提示词") dialogue: str = Field(description="角色对话,用于TTS配音") hook_tag: Optional[str] = Field(description="钩子标记:开篇钩子 / 中段反转 / 结尾悬念") class DramaEpisode(BaseModel): """单集短剧""" episode_no: int episode_title: str genre_tag: str = Field(description="男频 / 女频") shot_list: List[SingleShot] class FullDramaScript(BaseModel): series_name: str character_setting: dict episodes: List[DramaEpisode]
五、本地 LLM 调用封装脚本:加载 Skill 模板生成剧本
新建 local_llm_drama_gen.py
from llama_cpp import Llama import os class LocalDramaLLM: def __init__(self, model_path: str, skill_system_prompt_path: str): """ :param model_path: Qwen2.5‑7B‑Instruct‑Q4_K_M.gguf模型路径 :param skill_system_prompt_path: skill_male.txt / skill_female.txt """ self.llm = Llama( model_path=model_path, n_ctx=8192, n_gpu_layers=-1, # 全部层卸载到GPU,8G显卡Q4模型可用 temperature=0.72, top_p=0.8, max_tokens=1800 ) with open(skill_system_prompt_path, "r", encoding="utf‑8") as f: self.system_prompt = f.read() def generate_episode_script(self, user_query: str) -> str: """输入创作要求,返回原始剧本文本""" messages = [ {"role":"system","content":self.system_prompt}, {"role":"user","content": user_query} ] output = self.llm.create_chat_completion(messages=messages) resp_text = output["choices"][0]["message"]["content"] return resp_text if __name__ == "__main__": # =========切换男女频只需要修改skill路径========= skill_file = "./skill_female.txt" llm_gen = LocalDramaLLM( model_path="./models/qwen2.5‑7b‑instruct‑q4_k_m.gguf", skill_system_prompt_path=skill_file ) # 用户输入创作需求 req = "写女频重生短剧第1集,女主重生回到订婚宴被羞辱的时刻" raw_script = llm_gen.generate_episode_script(req) with open("./raw_drama.txt","w",encoding="utf‑8") as fw: fw.write(raw_script) print("原始剧本生成完成,保存 raw_drama.txt") print(raw_script)
运行命令:
python local_llm_drama_gen.py
参数调优说明:
- temperature=0.7‑0.75,保证剧情多样性;写严谨剧本可下调至 0.55;
- n_gpu_layers=-1:全部层 GPU 加速;显存不足设置为 20‑30。
六、剧本解析脚本:原始文本解析为结构化 JSON(对接 AI 漫剧)
新建 parse_drama_script.py,读取大模型输出的原始剧本,正则抽取场景、人物、动作、对话,输出符合之前漫剧流水线的 JSON 格式。
import re import json from drama_schema import FullDramaScript,DramaEpisode,SingleShot class DramaTextParser: def __init__(self, genre_tag="女频"): self.genre_tag = genre_tag # 匹配角色台词 【角色名】(动作)台词 self.pat_dialogue = re.compile(r"【(.*?)】\s*((.*?))\s*(.*?)(?=【|$)", re.S) self.pat_scene_head = re.compile(r"第(\d+)场\s*(.*?),(内|外),(日|夜)") def parse_raw_text(self, raw_text:str, ep_no:int, ep_title:str): shot_result = [] scene_blocks = re.split(r"第\d+场", raw_text) for block in scene_blocks: if len(block.strip()) <10: continue scene_match = self.pat_scene_head.search(block) scene_name = scene_match.group(0) if scene_match else "通用场景" dialog_items = self.pat_dialogue.findall(block) char_list = [] action_all = [] dialogue_all = [] for char_name,action,words in dialog_items: char_list.append(char_name.strip()) action_all.append(action.strip()) dialogue_all.append(f"{char_name.strip()}:{words.strip()}") shot_item = SingleShot( scene_title=scene_name, character_list=list(set(char_list)), action_desc=";".join(action_all), dialogue=";".join(dialogue_all), hook_tag="auto" ) shot_result.append(shot_item.model_dump()) ep = DramaEpisode( episode_no=ep_no, episode_title=ep_title, genre_tag=self.genre_tag, shot_list=shot_result ) return ep.model_dump() if __name__ == "__main__": with open("./raw_drama.txt","r",encoding="utf‑8") as f: raw = f.read() parser = DramaTextParser(genre_tag="女频") ep_data = parser.parse_raw_text(raw,ep_no=1,ep_title="订婚宴的重生") out_json = {"episodes":[ep_data]} with open("./drama_struct.json","w",encoding="utf‑8") as fw: json.dump(out_json,fw,ensure_ascii=False,indent=2) print("结构化剧本输出 drama_struct.json")
运行:
python parse_drama_script.py
七、转换脚本:结构化剧本 → AI 漫剧分镜 scene_list.json
把解析后的剧本,自动生成画面正向 / 反向提示词,输出给batch_scene_render.py批量渲染脚本。 新建 drama_to_scenelist.py
import json def convert_drama_to_scene(drama_json_path, out_scene_json, style_tag="女频漫剧"): with open(drama_json_path,"r",encoding="utf‑8") as f: drama_data = json.load(f) scene_output = [] for ep in drama_data["episodes"]: for idx,shot in enumerate(ep["shot_list"]): action_text = shot["action_desc"] scene_env = shot["scene_title"] pos_prompt = f"9:16竖屏,{style_tag},{scene_env},{action_text},人物面部稳定,画风统一,镜头稳定,柔和光影" neg_prompt = "五官崩坏,肢体畸形,闪烁,画风突变,水印,文字,畸形手指" scene_output.append({ "scene_id":f"ep{ep['episode_no']}_shot{idx+1}", "scene_description":f"{scene_env} {action_text}", "dialogue": shot["dialogue"], "positive_prompt":pos_prompt, "negative_prompt":neg_prompt, "frame_count":24 }) with open(out_scene_json,"w",encoding="utf‑8") as fw: json.dump(scene_output,fw,ensure_ascii=False,indent=2) print(f"漫剧分镜输出 {out_scene_json},可送入批量渲染流水线") if __name__ == "__main__": convert_drama_to_scene("./drama_struct.json","./scene_list.json",style_tag="女频漫剧")
运行:
python drama_to_scenelist.py
八、台词提取脚本,输出给本地 TTS(FishSpeech/CosyVoice)
新建 export_dialogue_tts.py
import json def export_tts_text(scene_json, out_txt): with open(scene_json,"r",encoding="utf‑8") as f: data = json.load(f) lines = [] for shot in data: dlg = shot.get("dialogue","") if dlg: lines.append(dlg) with open(out_txt,"w",encoding="utf‑8") as fw: fw.write("\n".join(lines)) print(f"TTS台词文件输出 {out_txt}") if __name__ == "__main__": export_tts_text("./scene_list.json","./tts_input.txt")
九、FFmpeg 后期批量处理指令(剧本生成之后漫剧成片收尾)
9.1 分镜视频拼接
ffmpeg -f concat -safe 0 -i filelist.txt -c copy ep1_raw.mp4
9.2 嵌入 srt 字幕,适配短剧平台
ffmpeg -i ep1_raw.mp4 -vf "subtitles=subtitle.srt:force_style='FontName=SimHei,Fontsize=26,PrimaryColour=&H00ffffff&,Outline=2'" -c:a copy ep1_final.mp4
9.3 统一输出 9:16 竖屏编码规范
ffmpeg -i ep1_final.mp4 -c:v libx264 -preset medium -crf 23 -vf scale=408:720 -c:a aac -b:a 128k ep1_export.mp4
十、工程踩坑与调优要点
- 大模型输出格式乱,解析失败
- 降低 temperature;在 Skill 系统提示词中强制要求严格输出剧本格式;
- 解析脚本增加容错,过滤 markdown 多余标记。
- 男频女频风格混淆
- 不要混用 skill 模板,生成前确认加载对应的
skill_xxx.txt; - 用户 query 里显式写明题材方向,辅助大模型对齐风格。
- 剧本大量心理描写,不适合 AI 视频渲染
- Skill 系统提示词明确禁止内心独白,强制转为动作神态描写;解析脚本可以增加简单过滤正则,剔除 “心里想、暗自思索” 类文本。
- 8G 显存运行 Qwen‑7B‑GGUF
- 必须使用 Q4_K_M 量化版本;n_gpu_layers 根据实际显存微调;关闭其他占用 GPU 程序。
- 钩子缺失,生成普通小说文本
- Skill 模板强制约束开篇钩子、中段反转、结尾悬念;生成后脚本可以简单关键词检测,如果缺少钩子关键词,标记剧本待人工复核。
十一、完整执行流程总结
- 选择题材,加载
skill_male.txt/skill_female.txt编剧 Skill 模板; local_llm_drama_gen.py本地大模型生成原始剧本;parse_drama_script.py原始文本解析为结构化剧本 JSON;drama_to_scenelist.py转换为 AI 漫剧分镜scene_list.json;export_dialogue_tts.py提取台词供给本地 TTS 配音;- 送入 ComfyUI/Wan2.2 批量渲染流水线;
- FFmpeg 拼接、字幕压制输出短剧成片。
十二、扩展方向
- 增加钩子自动检测脚本,自动识别剧本是否包含开篇钩子、结尾悬念,给出剧本质量评分;
- 多集批量循环生成,维护全局角色设定,保证多集角色人设统一;
- 接入角色特征映射,解析脚本自动绑定 IPAdapter 角色 ID,渲染阶段锁定人物长相。