AI视频短片生成
Powered By: 搬砖队全体成员

完整视频演示

语音嘴唇同步视频演示

准备工作

开发思路

  • 利用自定义生成的小说数据集训练模型
  • 根据所生成的小说生成人物形象及故事视频

环境

  • 系统:任何系统均可,推荐使用魔搭镜像
  • 显卡:推荐A10、RTX3090、RTX4090、A100等
  • 模型:qwen2-7b-instruct
  • 框架:魔搭轻量训推框架SWIFT

1.1 准备数据集

  1. 数据收集与整理:收集小说文本并整理
  2. 数据集格式分析:以单轮对话的形式制作数据集
    示例格式
    
    system,query,response
    00000,11111,22222
    00001,aaaaa,bbbbb
    00002,AAAAA,BBBBB
    
    {"system": "00000", "query": "11111", "response": "22222"}
    {"query": "aaaaa", "response": "bbbbb"}
    {"query": "AAAAA", "response": "BBBBB"}
                                            
  3. 数据集生成:
    • 切分整篇小说,获取2000字符左右的片段(用句号作为切分符号,然后合并成段落)
      Python 代碼
      
      def get_novel_text(data): 
          sentences = data.split('。')
          paragraphs = []
          current_paragraph = ''
          for sentence in sentences:
              if len(current_paragraph) + len(sentence) <= 2200:
                  current_paragraph += sentence + '。'
              else:
                  paragraphs.append(current_paragraph.strip())
                  current_paragraph = sentence + '。'
          if current_paragraph:
              paragraphs.append(current_paragraph.strip())
          return paragraphs
                                                      
    • 三种类型的数据集:
      • 调用qwen2-7b-instruct模型,生成小说片段的summary(有固定的格式及小说的骨骼脉络),将summary添加一定的prompt语句,作为每条数据的query,response则为小说片段原文
        示例格式
        
        system = """
        根据提供给你的小说段落,帮我生成一个小说/故事的总结,总结中要包含小说的人物形象,剧情概述等关键要素,不超过250字,不要回答任何其他内容。
        请参考下面的例子,输出要严格按照下面的格式!!!!!!!
        
        小说的风格和主题:
        xxxxxxxxxxxxxxxx
        
        人物形象:
        人物1:xxxxxx
        人物2:xxxxxx
        人物3:xxxxxx
        
        剧情概述:
        开头:xxxxxxx
        高潮:xxxxxxx
        结尾:xxxxxxx
        """
                                                                
        Python 代碼
        
        for paragraph in paragraphs:
            messages = [
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": system + paragraph}
            ]
                                                                
        Python 代碼
        
        jsonl_data.append({"query": "根据以下对小说的总结和描述,帮我生成一篇2000字左右的小说,要有情节叙述和人物对话:\n"+response+"\n现在我们开始:", "response": paragraph})
                                                                
      • 采取前一个paragraph的末尾作为query中的参考文本,并要求大模型对其扩写采取前一个paragraph的末尾作为query中的参考文本,并要求大模型对其扩写
        Python 代碼
        
        query = f"下面是前一个章节的结尾部分,请帮我进行扩写,扩写的内容一定要贴合前一个章节的内容,\
                        情节一定要生动且丰富,要同时有情节叙述和人物对话:{context}"
                                                                
      • 采取当前paragraph的概述(不超过60字)作为query中的参考文本,并要求大模型对其扩写
        Python 代碼
        
         system = """
        根据提供给你的小说段落,帮我生成一个小说/故事的总结,总结不需要特别详细,字数不要超过60个汉字字符!!!!!
        下面是小说/故事内容:\n
        """
                                                                
        Python 代碼
        
        jsonl_data.append({"query": "下面是前一个章节的简要概括,请帮我进行扩写,扩写的内容一定要贴合概括中的内容,\
            情节一定要生动且丰富,要同时有清洁叙述和人物对话:\n"+response+"\n现在我们开始:", "response": paragraph})
                                                                
    • 整合已有query+response,生成用于训练的.jsonl文件
    • 合并数据集文件
  4. 数据清洗
    • 剔除token过长或者过短的query-response对
    • 清理数据集文件中的特殊符号

1.2 训练

  • 利用已生成的jsonl数据集训练模型:采用Lora进行训练

CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model_type qwen2-7b-instruct \
    --sft_type lora \
    --output_dir output \
    --dataset train.jsonl \
    --num_train_epochs 1 \
    --max_length 2048 \
    --check_dataset_strategy warning \
    --lora_rank 8 \
    --lora_alpha 32 \
    --lora_dropout_p 1 \
    --lora_target_modules ALL \
    --gradient_checkpointing true \
    --batch_size 1 \
    --learning_rate 3e-5 \
    --gradient_accumulation_steps 16 \
    --max_grad_norm 1.0 \
    --warmup_ratio 0.03 \
    --eval_steps 100 \
    --save_steps 100 \
    --save_total_limit 2 \
    --logging_steps 10 \
    --do_sample True \
    --top_k 20 \
    --top_p 0.9
                                
  • do_sample: 如果设置为True,则模型会在每一步选择最有可能的词之前进行随机采样,这有助于增加多样性并减少重复。
  • top_k: 只考虑最可能的前k个词汇进行采样。较高的值可能会导致更多的多样性,但也可能导致更低的质量。
  • top_p: 也称为nucleus sampling,它会选择累积概率达到或超过p的词汇集合。这有助于平衡多样性和文本质量。

1.3 推理

  • 利用训练完的checkpoint直接推理/部署webui即可

CUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'output/qwen2-7b-instruct/v3-20240729-012301/checkpoint-xx'
                                

export GRADIO_ROOT_PATH=/dsw-xxxxxx/proxy/7860/
CUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'output/qwen2-7b-instruct/v1-20240729-182725/checkpoint-xx'
                                

Part 2: 角色形象设计

工具:MidJourney

MidJourney Bot Image
  1. 角色形象确定
    1. 直接进入随机新手频道(#newbies-xx),在文本框中输入/imagine 指令,接着用英文输入对所需图像的描述,等待MidJourney生成图片。
    2. 如果已经有大概需要的风格场景画面构图等,可以使用查图的方法,即进入频道后在文本框中输入/describe 指令并上传参考图,等待MidJourney生成对应的词条描述,相似词条可以更好生成类似风格的图像
      (也可以使用--cref URL +--cw 来尽力使生成人人物角色形象保持一致)
    MidJourney Generated Image
  2. MidJourney会先生成35张图片并发送在频道中,可以点击图片查看并保存。同时,如果想对生成图片进行进一步修改,可以使用U1(以及U234)和V1(以及V234)进行操作。U=upscale,V=variation。

    现在MidJourney有upscale/variation(subtle),upscale(creative),variation(strong)以及variation(Region)的操作选项,配合更改prompt可以更好地生成图像。

  3. 场景cg生成
  4. 大致与角色形象生成的路径步骤相同,但是可以加入一些高级指令以自定义和优化图像。例:

    1. --ar xx:xx 可以设置图像的长宽比比例,--s xxx可以设置图像的风格(即艺术程度,默认50,如果需要让图像更拟真则建议较低),--v x可以选择版本,也可以选择其他更特定模型(e.g. niij 6)
    2. --uplight 可以调亮图像,--upbeta 可以优化生成算法
  5. 问题
    1. 由于需要保持人物和背景的尽可能一致,风格较低一般会选择低些,默认约50。会导致画面颗粒感,需要后期调整。从而在进一步生成或使用AI视觉生成工具时,人物或物件背景显示可能会出现问题。
    2. 这也是为什么如果人物需要配合场景动画的话有时需启用高风格选项以预见不期望的原因。
    3. 对于版本(v)的选择问题,v1版本的light(低风格)生成的图片对比度强,对比度较高。
    4. 对于prompt以上下文的描述性较不足,即使该次prompt较完整时regional variation可能依然出现问题,只能适量避免。
    5. 随机性较强。

Part 3: 视频分镜头生成

  • 工具:可灵AI
  • 将midjourney生成好的图片上传,并且根据想要的效果撰写prompt,字数不建议太长,描述简洁明了。
  • 得到的效果如果不好,再根据缺陷调整prompt,如果依旧不满意可以返回上一步重新上传新的midjourney生成的图片

Part 4: 人物语音生成及视频剪辑

  1. 分镜头剪辑:
    • 工具:Clipchamp
    • 人物语音生成可以在右侧工具栏选择想要的符合人物形象的语音,并且可以根据当前故事环境选择人物的情感,语速,更加贴近小说故事背景。
  2. 视频背景音效:
    • 工具:剪映
    • 通过剪映将视频片段合成一起,并且加入音效例如风声…