今天我们来教大家

用 Python 自动生成快闪文字视频

最出名的快闪文字视频

当属苹果16年的广告了

文字搭配着音乐节奏闪现

效果简单又震撼

虽说这两年好像已经被做烂了

前两天出去吃个烤串发现店家的广告都是快闪类型的

用 Python 自动生成快闪文字视频_Python开发

但是如果真的想做其实还有点麻烦

不管你是用PPT还是Premier

都得慢慢对齐鼓点节奏

做一个视频怕是要循环这首歌上百遍

做完就不想再听到这首歌了

效果堪比把歌曲设为早晨的闹钟

今天!

悦创来帮一下各位苦逼的视频从业人员

我们用万能的Python

自动生成快闪文字视频!

就算老板要求做两小时的快闪文字视频

都不用害怕了!

首先我用非常出名的一首鬼畜来尝试

改革春风吹满地

原作品为小可儿在B站创作的

https://www.bilibili.com/video/av19390801

可以点击阅读原文观看

然后我们看看由程序自动找鼓点生成的快闪文字视频

上面视频当中

所有的鼓点都是由程序自动找到的

视频的生成也是全部由程序完成

唯一需要手动操作的就是

将文字按照需要切分出来

其实这一步也可以省略

比如下面这个视频

我利用分词模块

将这篇新闻

https://news.163.com/19/0618/20/EHVSFA1J0001875P.html

用快闪文字的方式

呈现出来

这个新闻呈现的方式

是不是很带感呢

当然如果每篇新闻都这么看

估计得累死……

如果你想直接获取这个快闪文字的Python代码

可以在后台回复:快闪文字

接下来我们一步步简单讲解这个代码是如何实现的

首先我们需要用到的模块有

librosa

moviepy

jieba

click

其中

librosa用来分析鼓点节奏

moviepy用来生成视频

jieba用来分词

click用来制作命令行工具

首先导入我们需要的模块

import librosa
from moviepy.editor import TextClip, CompositeVideoClip, AudioFileClip
import jieba
import click

接下来定义我们的主函数main()

其中输入参数有6个

width: 生成视频的宽度

height: 生成视频的高度

text: 存有文字的文本文件地址

music: 背景音乐

word_split: 是否自动分词(不自动分词就按换行切分)

output: 生成视频的文件名

同时我们利用click来帮我们

将这个python文件做成命令行工具

click的用法如下

用 Python 自动生成快闪文字视频_Python教程_02

具体可以看github

https://github.com/pallets/click

于是我们的main()函数变成下面这样

@click.command()
@click.option('--width', prompt='Width', default=360, help='The width of video clips')
@click.option('--height', prompt='Height', default=240, help='The height of video clips')
@click.option('--text', prompt='Text file', default='text.txt', help='The source text file')
@click.option('--music', prompt='Music file', default='改革春风吹满地.mp3', help='The music file')
@click.option('--word_split', prompt='Split words', default=False, help='Split words or not')
@click.option('--output', prompt='Output file', default='FlashText.mp4', help='The output file name')
def main(width, height, text, music, word_split, output):

其中prompt参数表示运行程序时会弹出的输入提示

default为默认值

即用户直接回车时选取的值

接下来在main()函数里

我们完成所有的事情

首先读入存有文字的文本文件

	with open(text, 'r', encoding='utf-8') as f:
		text_str = f.read()

然后我们根据用户选择来看是否要分词

	if word_split:
		seg_list = jieba.lcut(text_str)
		punct = set(''':!),.:;?]}¢'"、。〉》」』】〕〗〞︰︱︳﹐、﹒
		﹔﹕﹖﹗﹚﹜﹞!),.:;?|}︴︶︸︺︼︾﹀﹂﹄﹏、~¢
		々‖•·ˇˉ―--′’”([{£¥'"‵〈《「『【〔〖([{£¥〝︵︷︹︻
		︽︿﹁﹃﹙﹛﹝({“‘-—_…/\\''')
		word_list = list(filter(lambda x: x not in punct, seg_list))
	else:
		word_list = text_str.split('\n')

这里当word_split为True时

我们用jieba.lcut(text_str)获得分词后的列表

类似下图这样

用 Python 自动生成快闪文字视频_Python开发_03

接下来我们用两句话来剔除掉

分词后的列表中的标点符号

其中最主要就是用filter()函数

结合lambda来剔除

算是一个比较简单的剔除符号的方法

而如果word_split为False

那么我们直接将文档以换行符来切分

完成文字的分割以后

我们就来分析音乐鼓点

这里librosa就帮上大忙了

librosa是个非常强大的Python模块

可以分析音频的各种信息

这里我们用到它的beat_track方法

	y, sr = librosa.load(music)
	tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
	beat_times = list(librosa.frames_to_time(beats, sr=sr))
	beat_times.append(beat_times[-1] + 1)

最终我们会得到一个beat_times列表

里面包含了每个鼓点的时间

同时可以注意到最后一行

beat_times.append(beat_times[-1] + 1)

这里我将列表最后一位重复了一下

并往后偏移1秒

主要是方便我们后面处理最后一个鼓点的视频片段

得到了鼓点时间列表以后

我们来开始制作每个文字视频片段

	clips = []
	for index, beat_time in enumerate(beat_times[:-1]):
		if index >= len(word_list):
			break
		print(f'{index + 1}/{len(beat_times)}——{word_list[index]}')
		text_clip = TextClip(
			word_list[index],
			fontsize=width // 8,
			color='white',
			size=(width, height),
			method='caption',
			font='msyhbd.ttc')\
			.set_start(beat_time)\
			.set_end(beat_times[index + 1])
		text_clip = text_clip.set_pos('center')
		clips.append(text_clip)

这里我们用到moviepy

moviepy是我个人非常喜欢的一个python模块

一个非常强大的python视频制作模块

以后有机会再多讲讲这个模块的使用

这里我们用到了moviepy的文字片段

TextClip()

里面第一个参数是具体的文字

然后可以设置字体大小、颜色等

method='caption'是表示这个文字是标题类

当TextClip设置为标题类时

我们可以同时设置size

当文字宽度超过size时会自动换行

然后可以直接链式调用两个方法

set_start()和set_end()

用来设置这个视频片段的起始和结束时间

这里我们就正好设置为某个鼓点和下一个鼓点之间的时间

这样我们就完成了每个文字片段视频的制作

最后来生成完整的视频

	final_clip = CompositeVideoClip(clips)
	audio_clip = AudioFileClip(music)
	final_video = final_clip.set_audio(audio_clip)
	final_video.write_videofile(
		output,
		fps=30,
		codec='mpeg4',
		preset='ultrafast',
		audio_codec="libmp3lame",
		threads=4)

利用moviepy的CompositeVideoClip

来合成多个视频片段clip

用AudioFileClip制作音频片段

然后合成

最后直接用write_videofile()方法生成完整视频

这个方法里可以设置视频、音频编码

以及帧率FPS

最后加上

if __name__ == '__main__':
	main()

就大功告成啦!

这样以后想要制作简单的快闪文字视频

只需要运行这个python文件

根据提示输入信息

用 Python 自动生成快闪文字视频_Python开发_04

就可以等着程序帮你搞定啦

是不是超方便

本期悦创小课堂到这里就结束了啦

欢迎关注AI悦创

我会继续教大家一些好玩有趣的脑洞项目