当下自媒体账号中有大部分都是影视剧讲授的内容,如果看得多了你会创造很多内容情节讲解的都大同小异,本身影视剧翻来覆去就那么点东西,我就琢磨了下这些能不能用Python直接一键天生这种讲授视频。

答案是可以的,我考试测验地做了几个发在我的抖音账号上。

目前版本是1.0版本功能有限,未来会连续在更新算法的根本上更新脚本。
这里先容大体的制作思路和方法和原创你们想要问的问题。

既然正儿八经地讲技能没人看那么就做这么一个好试试吧。

全网首创Python算法自动剪辑视频影视剧讲授第一版

软硬件、技能需求CPU最好是I7-8750以上,要不整系统编制作会非常慢Python版本3.6以上Moviepy模块暂时不支持GPU,因此显卡好坏忽略须要会写爬虫,抓视频素材。
须要节制常规的文章洗稿方法,不然视频内容没法做须要节制常规的window系统操作,否则剪映某些操作无法完成须要会操作Moviepy模块,不会的看我专栏里的对应先容和操作方法须要1-N个手机号,用于申请百度AI的免费API利用须要有耐心数据获取

这里的数据获取分两部分

能自己找到完全的电影素材,mkv格式最佳,mp4也能凑合用。
比如去某些程序员论坛,这里影片都是质量非常高的原片而且无水印。
不要问打马赛克的地方,老司机都懂的。

能自己写爬虫脚本抓取别人的电影讲授视频,并去水印等等。
这个对付一些程序员新手来说略有难度。
比如说抖音吧抓取的视频,文章的水印你忽略哈。

根本素材准备

这个对付之前《月产10000个中药科普短视频方法,Python编程AI教程》制作的需求素材相对付大略一些。

做一个片头,一个水印就行了。

流程与代码

理解业务处理制作流程有助于理解代码,或者流程理解了代码就很随意马虎。

先看一下整体的工程目录,然后一步一步说。

根本数据运用部分

便是把你抓取的原影视剧文件或者讲授视频下载到 source_video 下名称随意,只放1个,系统会自动识别名称。

配置韶光和毫秒的转换方法,挺大略的玩python的都会,不会的自己对照着敲一遍。

必须手动的部分

便是剪辑到原来的片头,比如说电影这种无用无法配讲授的镜头,实在就掐头去尾就行。

用moviepy剪切测试一下。

test_start_time = 5.7 test_end_time = 200 # 手动测试片头从对合时光切分video_base = VideoFileClip("source_video/" + video)video_base = video_base.subclip(test_start_time,test_end_time)video_base.write_videofile("temp_data/cut_start.mp4")

设置画面截取的范围,有的电影或者视频是带黑边的要剪掉。

# 利用系统自带画图功能选择截取的坐标点x1,y1 = 0,120 # 裁剪区域左上角坐标x2,y2 = 1920,960 # 裁剪区域右下角坐标width,height = None,None # 宽度和高度x_center,y_center = None,None # X、Y轴中央点坐标# 剔除高下黑边选取影响范围video_base = VideoFileClip("temp_data/cut_start.mp4")video_base = (video_base.fx(vfx.crop,x1,y1,x2,y2)).resize((1920, 1080))video_base.write_videofile("temp_data/cut_frames.mp4")

然后按照像素框裁剪掉你须要的全体影片,并重置画面像素大小。

# 打算开始和截至韶光start_time = 200 # 这里根据影片开头的韶光设置video_base = VideoFileClip("source_video/" + video) # 手动测试片头从对合时光切分end_time = video_base.duration# 手动测试片头从对合时光切分video_base = VideoFileClip("source_video/" + video)# 按照测测试号的韶光进行截取video_base = video_base.subclip(test_start_time,end_time)# 剔除视频无用部分video_base = (video_base.fx(vfx.crop,x1,y1,x2,y2)).resize((1920, 1080))video_base.write_videofile("temp_data/"+ video)

字幕处理方法

为了省钱用免费的剪映自动识别字幕,视频扔进去自动识别。
如果有钱用科大讯飞或者百度的也行。
终极效果是一样的,而且可以利用一些算法自动提取正文内容的择要,方法百度上都有自己问。

字幕导出是剪映对应目录下的这个文件 draft_content.json 。

用代码解析一下就好天生韶光轴数据列表用于后续的编辑。

黄色部分用于洗稿用的,便是按照你的理解编辑对应片段就行了,将做好的excel表格放到 temp_mp3 下。

文稿匹配拆分方案2,拆分韶光进行进行文稿重塑

这里要把稳的是影片你要自己先看过一遍,否则你都不知道里面演的是什么,可能后期做字幕会很尴尬。
便是有选择地选择稿件中的笔墨信息,也可以根据自己的理解改写。

写好的稿子之后再实行天生合针言音方案

如果视频太长了稿子太长可以进行切分分成几个部分,每个部分限定字数利用each_str 实现。

# 文稿处理完毕后读取进行稿件拼接df = pd.read_excel("temp_mp3/文稿2.xlsx")df.dropna(axis=0,inplace=True)df.reset_index(drop=True,inplace=True)strs = ""for i in range(len(df)): strs = strs + df["new_content"][i] + "\n"with open("temp_mp3/文稿2_new.txt",'w',encoding='utf-8') as f: f.write(strs)# 利用新的数据重复方案1的步骤天生新的稿子# 文稿2_new == 文稿1with open("temp_mp3/文稿2_new.txt",encoding='utf-8') as f: txt_data = f.read()# 将文稿2.xlsx数据格式转换成文稿2.txt按行读取data_list=df[["time_str_1","time_str_2","new_content"]].values.tolist()# 单个文稿设置笔墨总长度each_str = 2500# 终极文稿超出字数会新建文档看情形自己调配

匹配文稿语音合成

用API吧,如果自己有把握稿子不会念错自己念录制也行。

根据之前做好的excel表格把影片中无用的部分剪切掉

剪切的标准是韶光点,便是excel表格中设置的韶光点,有字幕讲授的部分要,无字幕讲授的部分直接砍掉,例如下面赤色框的部分。
根据这个韶光节点会自动进行拼接。

天生的音频文件合并

这里要把稳的是你制作的片段部分如果想和字幕对上须要进行一个加速。
要么视频加速要么音频加速,如果是用moviepy的话用视频加速,由于音频加速会有些走掉。
如果是用mmpeg合造诣无所谓了。

加速的公式合成代码。

# 读取MP3配音文件 audio = AudioFileClip("temp_mp3/"+ file_name +"/all.mp3") # 记录MP3的韶光 audio_time = audio.duration # 读取MP4视频文件 video = VideoFileClip("temp_mp4/"+ file_name +".mp4") # 记录MP4的韶光 video_time = video.duration # 给视频进行加速 合营音频文件的字幕 factor = video_time/audio_time # 倍速播放倍数,视频韶光/音频韶光便是视频加速的韶光 final_duration = None # 倍速播放持续韶光 ,可以为空表使全部 video = video.fx(vfx.speedx, factor , final_duration)

末了直接等待结果的视频出来之后轻微手动加工一下就可以发自媒体啦。

伪原创的谣言

这个怎么说呢只有你试过了才知道弗成。
网上有很多方法还有卖各种软件的,我只能见告你这个是教智商税,你买了往后完备没效果。

网上卖的软件能买么?

比如某地方卖的这个工具,这里面除了神经网络所有的功能都用moviepy能实现,不可信。

至于你会问神经网络去重?这玩意是用GPU跑的,你的机器没有配置对应的开拓环境是实行不起来的。
用过的人都知道CPU和GPU处理的视频韶光频年夜概是20比1的样子。

这种能公开出来的人家平台就会不知道么?很随意马虎被破解的。
只能自己去逐步考试测验方法,然后自己用便是了。

毕竟好用能用的东西没人会拿出来卖的。

修正MD5?

代码实在很大略直接可以一步出结果,但是你能想到字节的工程师就想不到么?

def get_file_md5(file_path): """ 分段读取,获取文件的md5值 :param file_path: :return: """ with open(file_path, 'rb') as file: md5_obj = hashlib.md5() while True: buffer = file.read(8096) if not buffer: break md5_obj.update(buffer) hash_code = md5_obj.hexdigest() md5 = str(hash_code).lower() return md5def modify_file_md5(file_path): """ 修正文件的md5值 :param file_path: :return: """ with open(file_path, 'a') as file: file.write("####&&&&")