AI漫画推文生成工具

628 阅读9分钟

背景

近期在短视频发现一个AI漫画推文的赛道,经过深入了解后发现他们是通过,一套AI工具+自动化剪辑实现的,因为目前ai在各种行业的的应用都比较火,所以抱着学习的态度去开发了一款AI漫画生成工具,实现了对ai漫画小说素材的批量生成,并且在自己的实测中最高一条视频播放了突破了10w+,接下来将详细介绍这款工具如何实现

c34b3c683e6e8c2cd85b67b40d331b13.png

项目说明

本项目构建了一套基于生成式AI的工业化数字内容生产系统,专注于短视频平台的高流量漫画小说领域。系统深度融合多模态大模型技术,实现从文字到视频的端到端自动化生产:通过智能语音合成生成专业级配音,结合AI绘画引擎(支持MidJourney云API与本地ComfyUI工作流双模式)批量生成高精度漫画分镜,并基于DeepSeek-V3大语言模型实现智能分镜脚本解析、动态提示词优化及角色画风一致性控制。最终通过自动化剪辑脚本(pyjianying)实现语音-字幕-关键帧的毫秒级对齐,输出广播级质量的短视频内容。在商业化验证阶段,该系统生产的20分钟中视频在初始权重账号(粉丝<100)测试中实现单条突破10W+播放量。

客户端界面

image.png

固定小说角色配置

image.png

comfyui 工作流 模式

image.png

discor + MidJourney 操作模式

image.png

自动化剪辑效果

image.png

模块拆解

整个项目大概分为三个模块

  • 编辑客户端
  • 文本生图模型
  • 剪辑脚本

接下来我将从这三个模块展开讲解实现方案。

客户端操作界面

客户端操作界面使用electron + vue 实现的,至于为什么选用这个方案:我有一台window系统电脑,还有一个mac笔记本所以我想一套代码多端运行,其次我是一名前端开发vue和nodejs我熟,然后开干。

这个客户端就类似一个Agent智能体,通过输入的小说内容(配音后的字幕srt文件),和不同的大模型交互然后输出和保存最后的素材。其中接入了DeepseekV3 实现字幕分镜头。也就是下图这部分,这几个字幕对应一张图:

image.png

对于DeepseekV3调用的输入就是整个小说字幕列表+人物风格 然后将这两个进行提示词编排,拼接成完整的prompt后丢给deepseekV3 然后deepseekV3 根据我定义的mcp协议返回我对应格式的分镜结果。然后根据分镜结果对字幕列表进行分割,如果对分割结果不满意的,可以手动的对其拆分和合并。 这块的问题或者困难点在于如何保证模型token不超限制和保证输出数据格式。

  • 对于如何使模型token不超过限制这一点可以通过分块的方式解决,简单点来说就将100行字幕作为一个块丢给大模型进行一次分镜,然后循环的将整个字幕文件处理完成。
  • 对于模型输出稳定的格式,可以调节模型的topp 和 temperature 使其输出相对稳定,并且在代码中对返回结果进行格式校验,如果不通过则重新生成一遍,这里我做了三次重试限制,目前还没有发现连续失败三次的情况。

调用deepseekV3 完成分镜的同时也进行和一波当前镜头人物和背景的生成,也就是对应下图这部分:

image.png

也就是说这一部分是由deepseekV3 分镜的同时完成的,这一块的prompt编排如下,简单来说就是告诉大模型我需要什么,你按照什么格式输出。

    const prompt = `
    帮我给下面这个小说字幕进行一下分镜处理,并且为每个分镜生成一段人物描述和背景/环境描述用于描述当前镜头中的展示内容,主要描述镜头中的人物性别,年龄,发型,面部表情,身穿的衣服,以及人物的肢体动作等等。并且我会告诉你小说中人物的特征集合,请选择一个特征集中的人物或者多个对其增强动作描述和表情描述后使用,如果人物不在特征集中,请你想象一个人物特征来使用,尽可能的使用特征集中的一个人物特征。
    重点说明:每个镜头不要超过3个字幕
    小说字幕为:

    ${text}

    人物特征集为:

    ${personList}

    按照这个JSON格式回复:

    [
        // 第一个镜头
        {   
            "subTextList":[index1,index2,index3,....当前镜头包含字幕的index列表,注意:每个镜头1到3个index,即这个字幕公用一个镜头,但是每个镜头不要超过3个字幕,要保证当前最后一个index是和下一个分镜的第一个index是连续的,保证所有的字幕都有对应的镜头],
            "persons":"当前分镜描述,主要描述镜头中的人物性别,年龄,发型,面部表情,身穿的衣服,以及当前人物做出一个什么样的身体姿势等等,注意所有的人物都要对其特征进行描述,不要出现人名。如果镜头中有两个人的话可以描述一下他们互相之间的动作",
            "bgc":"人物所在的地点,如在房间,在马路,在学校,在办公室等等的简短描述,只描述实体不要描述光线等。", 
            "think":"简短的思考解释下为什么让这几个字幕的index 在一个镜头中,以及当前分镜中最后一个index是否达到整体的最后一个index"
        },
        // 第二个镜头
        {   
            "subTextList":[index1,index2,index3,....当前镜头包含字幕的index列表,注意:每个镜头1到3个index,即这个字幕公用一个镜头,但是每个镜头不要超过3个字幕,要保证当前最后一个index是和下一个分镜的第一个index是连续的,保证所有的字幕都有对应的镜头],
            "persons":"当前分镜描述,主要描述镜头中的人物性别,年龄,发型,面部表情,身穿的衣服,以及当前人物做出一个什么样的身体姿势等等,注意所有的人物都要对其特征进行描述,不要出现人名。如果镜头中有两个人的话可以描述一下他们互相之间的动作",
            "bgc":"人物所在的地点,如在房间,在马路,在学校,在办公室等等的简短描述,只描述实体不要描述光线等。",
            "think":"简短的思考解释下为什么让这几个字幕的index 在一个镜头中,以及当前分镜中最后一个index是否达到整体的最后一个index" 
        },
        // 。。。 后续分镜
    ]   
    `

人物特征集是提前设置好的,在页面上上也就是这部分,在代码中的体现就是一个字符串列表。

image.png

接下来是对文生图模型的调用了,因为现在的文生图模型基本都是只支持英文的,所以这一步需要将中文转换为英文的操作,我这里用了两种方式:

  • 通过LLM转,特点就是这种方式模型可以在对其内容进行扩充。
  • 接入翻译api,我这里使用的是百度的翻译api

着两种方式也就这个:

image.png

接下来就是生成图片和保存了,如何生成图片这个后面章节说,保存的话简单来说就是保存一个配置,里面要包含每段字幕对应的图片地址,以及字幕本身的信息,这里我就使用json来保存了,大概长这样,一个超长list:

image.png

这个是为了方便后续剪影脚本读取和自动化剪辑,差不多客户端的核心功能基本就这些。

文本生图模型

这里介绍下文生成模型,我这里使用了两种方式调用,调用购买的MidJourney模型,另一种是调用部署在本地的comfyui工作流中的模型,接下啦介绍下这两种模型。

MidJourney

这是一款付费的模型,并且调用起来非常难受,因为本身没有提供api只能通过discord 聊天室交互,但好在discord提供了自己的api调用,所以我在实现这块调用是通过代码操作discord api 向指定频道中发送生图指令,然后监听频道中MidJourney机器人的消息,获取生成后的图片,这个东西的优点在于不依赖设备性能,毕竟是调用第三方的服务,但缺点也很明显,因为不稳定,并且midjourney禁止批量化操,被逮到后要封号,所以调用时候不能调的太猛。

image.png

comfui

这种是本地部署方案,也是我常用的方案,这套方案相对于midjourney他的输出更问题,当然这是因为模型是部署在本地电脑上的,所以对设备的性能要求相对较高,下面是我自己电脑实测图 使用flux dev fp8 模型加一个lora 生成1024x1024图片的实测:

image.png

基本上将 32G内存 + 4060 8G显存都拉满了,生成一张图片大约110秒。但是很稳定。 这里的flux生成漫画图片的loar是我通过收集数据标注后微调出来的效果,可以看出还是很稳定的。

这一块comfui的安装和部署,就不细讲了,可以去comfui官网看看。

自动化剪辑

这一块是将上面生成的素材,自动化的导入剪影完成字幕和图片对齐,并且做到图片上下左右移动的效果,也就是将图片开始和结尾的地方都打上关键帧

image.png

这块使用了一个python开源项目实现的,感兴趣的可以看看:github.com/GuanYixuan/…

开源代码部分

因为这个东西不是我一次性设计好的,而是经过多次尝试和调整写出来的,所以代码写的非常乱(除了我没人能看懂),所以要等我优化一波代码后在公开,尽情期待后续消息。