\u200E
90+行代码写“智能MV生成器”,基于文心大模型API的项目代码开源
发布日期:2022-11-04T07:36:36.000+0000 浏览量:1085次

作者简介:GT,飞桨开发者技术专家(PPDE)、QPT开源项目发起者、AgentMaker开源项目核心成员。

 

文心ERNIE-ViLG是全球最大的跨模态生成模型,它生成图像清晰度高、速度快,针对中文输入和中国元素的理解能力非常强,发布以来吸引了众多开发者和AI绘画用户的关注。



为了展示飞桨开发者开朗向上、共创共享的积极面貌和执桨开源、勇于探索的精神风采,1024程序员节飞桨发布了“飞桨开发者专属主题曲MV”《热AI无限》,我荣幸地受邀参加了MV录制,也体会到了MV制作的不易。我心想,要是有一个“智能MV生成器”,不仅可以让AI成为MV拍摄和剪辑工作的智能助手,还能让每个开发者都生成个性化的MV。

我的AI Studio社区开发者伙伴“ninetailskim”制作出了可通过音频与歌词文件生成歌曲MV的“使用文心大模型制作MV”项目。

受到启发,我在“使用文心大模型制作MV”和iterhui“中秋款文心带你轻松搞定MV制作两个项目的基础上做了进一步改进,做出了可以快速生成指定风格的“飞桨开发者专属主题曲MV生成器”。

以下项目已开源,欢迎大家围观交流。

飞桨开发者专属主题曲MV生成器项目

https://aistudio.baidu.com/aistudio/projectdetail/4818261

“使用文心大模型制作MV”项目

https://aistudio.baidu.com/aistudio/projectdetail/4452910

“中秋款文心带你轻松搞定MV制作”项目

https://aistudio.baidu.com/aistudio/projectdetail/4506607




方案介绍



制作简易的歌曲MV,离不开音乐、歌词和画面三要素,因此我们需要三组基础数据做支撑:音频文件视频文件歌词信息
由于我们已经获得了主题曲的音频文件与歌词信息,所以只需要生成一段能够对的上歌词的视频,即可完成初阶MV的制作。
通过理解中文文本来生成图像,正是文心ERNIE-ViLG的强项。那么我们只需要将每段歌词进行简单的处理,接着调用文心ERNIE-ViLG API生成歌词文意所对应的图片,然后根据生成图片的数量与歌词的时间间隔来决定图片出现顺序,最后拼接所有图像即可生成我们需要的MV视频文件。


代码实现




Step1 安装所需Python依赖

在终端中输入pip install wenxin-api pydub moviepy auditok即可安装文心大模型SDK以及音视频处理依赖。
   
     
  pip install pydub moviepy auditok wenxin-api 

Step2 读取歌词、分隔时间等信息

   
     
# 读取字幕与歌词意象
times = list()
words = list()
prompts = list()
with  open( "PPDE.txt""r") as f:
    lines = f.readlines()
     for line in lines:
         ms = line[:  4]. split( ":")
         time =  int( m) *  60 +  int( s)
        word, prompt = line[ 4: ].replace( "\n"""). split( "|")
        times.append( time)
        words.append(word)
        prompts.append(prompt)

Step3 定义想要的风格,并使用文心ERNIE-ViLG API服务进行生成图像

文心ERNIE-ViLG支持多种稳定艺术风格的图像生成,包括但不限于古风、油画、水彩画、蒸汽波艺术、像素风格、概念艺术、未来主义、赛博朋克等。你可以结合自己对歌曲“画风”的判断,生成不同风格的歌词图片,甚至可以自己定义艺术风格修饰词,实现更独一无二的生成效果。
   
     
import os
import time
import requests

import wenxin_api
from tqdm  import tqdm
from wenxin_api.tasks.text_to_image  import TextToImage

# 在此处填写自己想要的风格,建议在5字以内,不限于像素风、赛博朋克、二次元、未来主义、梵高、中国画等修饰词,可以在https://wenxin.baidu.com/moduleApi/ernieVilg查看支持的风格。
STYLE =  "赛博朋克"

wenxin_api.ak =  "请在https://wenxin.baidu.com/moduleApi/key 中申请AK与SK"
wenxin_api.sk =  "请在https://wenxin.baidu.com/moduleApi/key 中申请AK与SK"

file_dir =  "temp_img"
os.makedirs(file_dir, exist_ok= True)

img_paths = dict()
for prompt_id  in tqdm(range(len(prompts))):
text_prompt = prompts[prompt_id] +  ',' + STYLE
# 探索无限风格需要申请
    input_dict = { "text": text_prompt,  "style""探索无限""resolution""1024*1024"}
     while  True:
         try:
            urls = TextToImage.create(**input_dict)[ 'imgUrls']
             for url_id, url  in enumerate(urls):
                img = requests.get(url).content
                path = os.path.join(file_dir,  f"{prompt_id}_{url_id}.jpg")
                 with open(path,  'wb'as f:
                    f.write(img)
                 if prompt_id  in img_paths:
                    img_paths[prompt_id].append(path)
                 else:
                    img_paths[prompt_id] = [path]
             break
         except:
            print( "发生异常")
            time.sleep( 1)

Step4 合成视频

图片生成完毕后,我们需要让图片按照歌词演唱的时间间隔顺序出现,并合成为一个简单的图片轮播歌曲MV视频。

   
     
import cv2

from PIL  import ImageFont
from PIL  import Image
from PIL  import ImageDraw
from moviepy  import *
from moviepy.editor  import *

font = ImageFont.truetype( "siyuanheiti.otf"50)

final_img_paths = dict()
for step_id  in img_paths:
     for img_path  in img_paths[step_id]:
        im = Image.open(img_path)
         # 在图片上添加文字
        draw = ImageDraw.Draw(im)
        draw.text(( 100900), words[step_id] ,( 2551800), font=font)
        path = img_path.replace( "temp_img""img")
        im.save(path)
         if step_id  in final_img_paths:
            final_img_paths[step_id].append(path)
         else:
            final_img_paths[step_id] = [path]

video = cv2.VideoWriter( 'test.mp4',cv2.VideoWriter_fourcc(* 'mp4v'),  1, ( 10241024))

end_time = times[ -1]
step =  0
for t  in range(end_time):
     if step +  1 == len(times)  and t == end_time:
         break
    img_id = t %  12
     if times[step] < t <= times[step +  1]:
        img = cv2.imread(final_img_paths[step][img_id //  2]) 
        video.write(img)
     if t == times[step +  1]:


        step +=  1

video.release()
video_path =  'test.mp4'
audio_path =  'PPDE.mp3'
audio = AudioFileClip(audio_path)
video = VideoFileClip(video_path)
video = video.set_audio(audio)
video.write_videofile( "output.mp4", audio_codec= "aac")
print( "-------生成完毕-------")
在完成以上步骤后,我们即可获得使用文心ERNIE-ViLG所创作的飞桨开发者专属主题曲MV,效果如下。
赛博朋克风格MV生成效果


总结



目前项目实现还比较简单,还有很多地方可以调优,如字幕的格式和位置可以调整为更符合一般歌曲MV的排版形式。图片之间的过渡可以更自然,还可以添加一些基础的光效素材等等。欢迎大家访问下方链接点击阅读原文,在飞桨AI Studio中一键运行项目,生成自己的飞桨开发者主题曲,也欢迎与我进一步交流。

项目链接

https://aistudio.baidu.com/aistudio/projectdetail/4818261




专题介绍



随着人工智能技术飞速发展,大规模预训练模型(以下简称大模型)的出现使零样本建模成为可能。现在,百度飞桨文心大模型为开发者提供多样化的在线API调用、Prompt-tuning、本地API参数调优等服务,助力各位创意大师“花式”完成代码实践、前端页面搭建等任务。现在,已经有飞桨社区开发者基于飞桨框架和文心大模型在零样本或小样本场景下,完成了兼具技术创新与新颖创意的优质项目。为此,飞桨开发者说专栏特别推出文心大模型专题,邀请飞桨社区开发者show出“脑洞”与开发心得,与大家一同探索用文心大模型完成趣味无穷、高实用价值项目的无限可能。


【文心大模型智能创意赛】

如果你也有基于百度文心大模型开发AI创意项目的好点子,我们为你准备了展示身手的舞台!
由中国计算机学会主办的“2022年第十届CCF BDCI大赛百度自主赛题“模心智创-文心大模型智能创意赛”正在火热进行中。文心大模型提供在线API调用、Prompt-tuning、本地API参数调优等功能,助力各位创意大师完成代码实践、前端页面搭建等任务。诚邀具有奇思妙想的广大开发者开发AI创意项目,飞桨官方亲手pick你出道!

拓展阅读

妙“剪”生花!用AI绘就家乡城市的剪纸画



关注【飞桨PaddlePaddle】公众号
获取更多技术内容~