本地 LLM 实现男频 / 女频短剧剧本生成与结构化导出|对接 AI 漫剧流水线工程实践

简介: 本文提出基于本地Qwen-2.5-7B-Instruct量化模型的红果短剧AI生成方案,针对男频/女频风格差异定制两套编剧Skill提示词模板,配套Python脚本实现剧本生成、结构化解析、分镜JSON转换、TTS配音及FFmpeg成片全流程,全程离线运行,仅需8G显卡,打通「剧本→漫剧→成片」全链路。

摘要

红果类短剧分为男频、女频两大主流赛道,二者在叙事钩子、人物关系、冲突类型、镜头侧重、台词风格上存在显著差异。直接使用通用大模型生成剧本,容易出现题材风格混淆、钩子缺失、文本非结构化,无法直接喂给 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

十、工程踩坑与调优要点

  1. 大模型输出格式乱,解析失败
  • 降低 temperature;在 Skill 系统提示词中强制要求严格输出剧本格式;
  • 解析脚本增加容错,过滤 markdown 多余标记。
  1. 男频女频风格混淆
  • 不要混用 skill 模板,生成前确认加载对应的skill_xxx.txt;
  • 用户 query 里显式写明题材方向,辅助大模型对齐风格。
  1. 剧本大量心理描写,不适合 AI 视频渲染
  • Skill 系统提示词明确禁止内心独白,强制转为动作神态描写;解析脚本可以增加简单过滤正则,剔除 “心里想、暗自思索” 类文本。
  1. 8G 显存运行 Qwen‑7B‑GGUF
  • 必须使用 Q4_K_M 量化版本;n_gpu_layers 根据实际显存微调;关闭其他占用 GPU 程序。
  1. 钩子缺失,生成普通小说文本
  • Skill 模板强制约束开篇钩子、中段反转、结尾悬念;生成后脚本可以简单关键词检测,如果缺少钩子关键词,标记剧本待人工复核。

十一、完整执行流程总结

  1. 选择题材,加载skill_male.txt / skill_female.txt编剧 Skill 模板;
  2. local_llm_drama_gen.py本地大模型生成原始剧本;
  3. parse_drama_script.py原始文本解析为结构化剧本 JSON;
  4. drama_to_scenelist.py转换为 AI 漫剧分镜scene_list.json;
  5. export_dialogue_tts.py提取台词供给本地 TTS 配音;
  6. 送入 ComfyUI/Wan2.2 批量渲染流水线;
  7. FFmpeg 拼接、字幕压制输出短剧成片。

十二、扩展方向

  1. 增加钩子自动检测脚本,自动识别剧本是否包含开篇钩子、结尾悬念,给出剧本质量评分;
  2. 多集批量循环生成,维护全局角色设定,保证多集角色人设统一;
  3. 接入角色特征映射,解析脚本自动绑定 IPAdapter 角色 ID,渲染阶段锁定人物长相。
相关文章
|
云安全 安全 网络安全
|
3天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
|
17天前
|
JSON 程序员 数据格式
最新版Notepad++下载、安装、配置保姆级教程(附官网安装包)
Notepad++ 是一款免费开源、轻量快速的 Windows 文本编辑器,支持多标签、语法高亮、代码折叠与宏录制,体积小、启动快、资源占用低,兼容 x64/x32/ARM 架构,是程序员和文字工作者的高效利器。
4014 1
|
10天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
2062 2
|
16天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
2664 47
|
3天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
555 1
|
13天前
|
Web App开发 人工智能 前端开发
2026 年 AI 浏览器怎么选?Ego Lite、Tabbit、Chrome DevTools MCP 深度对比,开发者到底该用哪个?
2026年AI浏览器选型指南:Ego Lite专注多Agent协同(Mac优先),Tabbit国产首选,原生支持Windows与Codex控制;Chrome DevTools MCP非浏览器而是开发者利器,深度集成Console/Network/Performance调试能力,让AI真正“看懂并验证”前端代码。
1520 3
|
10天前
|
开发者 索引
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
Open Plugin Market 是一个开放插件索引平台,收录800+优质DSH插件,支持分类浏览、智能推荐与随机发现。无需安装市场,粘贴索引地址即可一键接入,网页版直访 dshopen.org,助力小开发者被看见。(239字)
2107 1
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
|
8天前
|
人工智能 Linux API
Magpie, 轻量本地AI网关!免费Token用不完!
Magpie 是开源AI编程模型调度网关,上线一月获1.8万Star。它通过本地高性能网关统一托管多平台API密钥、账号与免费额度,实现跨Agent的模型秒级切换、静默额度轮换与资源复用,显著降低碎片化管理成本。(239字)
Magpie, 轻量本地AI网关!免费Token用不完!

热门文章

最新文章