中文 | English
私人订制双语弹幕合成工具(Bilingual Danmaku Synthesizer Tool,缩写BDST)适用于想要模拟弹幕效果的评论视频制作,基于用户输入外语评论及对应中文翻译自动合成双语弹幕并随机叠加于原视频之上。
用户可以通过改动配制文件中的参数来定制弹幕风格,包括弹幕存活时间、弹幕文字颜色、弹幕字体、弹幕字体大小、弹幕显示区域、弹幕背景颜色等等。演示效果的视频文件及动图在 这里 。
因为这个项目是受 洛飕飕@bilibili 的评论视频启发,这里暂时借用其作品来demo展示。(原作者本人已许可)
脚本语言使用python3,并基于标准库和MoviePy开发。本工具的依赖树:
└── MoviePy (required) ├── FFmpeg (required) ├── ImageMagick (required) └── Pygame (optional)MoviePy 使用 FFmpeg 这一最常用的视频处理开源软件。初次使用MoviePy时,FFmpeg会自动通过镜像安装,所以用户 无需自行安装FFmpeg 。此外,因为本工具涉及文字层的使用, ImageMagick 其作为MoviePy目前在文字处理方面依赖也必须安装( 详情 )。对于本工具, Pygame 可以选择暂不安装。
以下步骤针对从未在Mac上运行过Python的用户,仅供参考。
brew install python3
后即安装成功。
python --version
和
pip --version
,显示版本号即可进行下一步。
pip install moviepy
使用Homebrew安装预编译版ImageMagick,在终端中输入:
brew install imagemagick
或者官网下载压缩包后解压安装。
以下步骤针对从未在Windows电脑上运行过Python的用户,仅供参考。
在Windows上安装Python3:
官网下载Python3.9安装程序,运行安装包后在Setup窗口下方勾选Add Python 3.9 to PATH
后选择Install Now
。
检查Python和pip安装情况:
使用快捷键Win + R
打开左下角窗口输入cmd
打开终端分别输入python --version
和pip --version
,显示版本号即可进行下一步。
安装ImageMagick:
从官网下载Windows安装程序,运行即可。
ImageMagick会安装在C:\Program Files\ImageMagick-[版本号]
路径下,该路径在之后会用到。
安装MoviePy,在终端中输入:
pip install moviepy
在MoviePy中配置ImageMagick环境变量:
打开MoviePy安装目录下的config_defaults.py
,该文件位于C:\Users\[你的用户名]\AppData\Local\Programs\Python39\Lib\site-packages\moviepy
路径下。
在该文件最后一行关于IMAGEMAGICK_BINARY
的配置修改成如下:
IMAGEMAGICK_BINARY = r"C:\\Program Files\\ImageMagick-[版本号]\\magick.exe"
ImageMagick在Windows系统中不能自动识别新添加的字体,所以建议Windows用户使用本工具时准备好字体文件(.ttf, .otf, etc.)。此外,字体文件的名字和路径中也最好不出现除英语外的utf-8
类字符。
用户请先行准备好目标视频。视频格式接受.ogv,.mp4,.mpeg,.avi,.mov等任何FFmpeg支持的格式。
目前脚本只接受TXT格式的文件。请确保评论文件和翻译文件的语句根据行数一一对应,例如对于第100行的评论语句,其对应翻译应该在翻译文件的第100行。这里提供一个例子,后续可能会优化这一步骤。
评论文件的命名格式为comments_[评论语言].txt
,例如英语评论文件请命名为comments_eng.txt
;日语评论文件请命名为comments_jp.txt
。对应的中文翻译文件的命名格式为translation_[评论语言].txt
,例如英语评论的翻译文件请命名为translation_eng.txt
;日语评论的翻译文件请命名为translation_jp.txt
。
因目前评论语言仅支持英语与日语,所以用户至多有四个文件。请将所有文件置于InputFiles/
文件夹或某一特定文件夹内。
用户可以在config_override.py
中添加参数自定义值来覆盖存放于config_default.py
中的默认参数配置。配置文件中包含三大部分,分别为输入、弹幕和输出。
2021年4月10日更新:用户不用再直接修改配置文件,为配置文件设计的GUI已经添加。GUI文件依赖于python标准包内部的Tkinter包,因而兼容性较好。用户可以在终端进入工具路径后,运行python3 GUI.py
,在图形界面中设置配置参数,之后直接点击Start Synthesization,即可跳过后续步骤导出视频。
该部分参数位于关键字input下,主要关于目标视频路径以及TXT输入文件路径。
video_path
目标视频的文件地址[必需]
如果视频在当前文件目录下,
直接输入视频文件名即可,
例如'video_name.mp4'
,
另注意路径表达在不同操作系统中的不同。
audio_path
用于替换的音频文件地址
默认为None
,
即沿用原视频的音轨。
仅限使用MoviePy导出时有效。
file_path
评论与翻译的TXT文件地址
默认在InputFiles/
下,
如果用户直接修改该文件夹中的TXT文件,
则无需添加或修改此参数。
video_duration
目标视频的选取范围
默认为None
,
即整条视频会被使用。
例如要选取目标视频中第10秒到第100秒的部分,
则可以修改为[10, 100]。
仅限使用MoviePy导出时有效。
该部分参数位于关键字danmaku下,主要关于弹幕的外观设计。
fonts
各语言的字体名或字体文件路径
预设字体存放于Fonts/
路径下,
用户可以视需求添加字体然后修改此参数。
若是已经安装在操作系统内的字体,
则可以直接填写字体名称取代路径。
使用moviepy内TextClip.list('font')
可以罗列操作系统内字体。
保险起见,Windows用户请使用字体文件路径,
且文件名和路径中只包含英语字符。
fontsize
评论及翻译字体大小
默认大小为30像素。
comment_color
评论字体颜色
默认颜色为白色,值为'white'
。
使用MoviePy内TextClip.list('color')
可以罗列所有颜色选项。
translation_color
翻译字体颜色
默认颜色为白色,值为'white'
。
使用MoviePy内TextClip.list('color')
可以罗列所有颜色选项。
duration
弹幕存活时间
默认存活时间为10秒。
弹幕运动帧率
默认使用60帧。
最终视频帧数取决于合成中帧率最高的部分。
一般正常视频不超过60帧。
background_rgb
弹幕背景颜色
默认弹幕背景为黑色。
支持RGB格式,例如[255, 0, 0]
是红色。
background_opacity
弹幕背景透明度
默认值为0,即弹幕背景不会开启。
可替换为任一位于[0, 1]的数。
仅限使用MoviePy导出时有效。
coverage
弹幕显示区域
默认值为1,可替换为任一位于(0, 1]的数。
time_range_to_appear
弹幕在视频中可以出现的时间段
默认为None
,
即弹幕可以在任意时间点出现。
例如弹幕只能在前100秒出现,
则可以修改为[0, 100]
。
该部分参数位于关键字output下,主要关于视频的导出选项。
threads
导出时使用线程数
默认线程数为8。
此参数受限于用户电脑CPU配置能提供的线程数。
线程数越高,导出渲染速度越快。
MoviePy源代码仅支持使用CPU,
若想使用GPU加速,请参照备注以及FFmpeg的硬件加速教程。
video_name
导出视频文件名字
默认文件名为'video_danmaku.mp4'
,
导出位置位于本工具文件夹内。
用户如修改编码参数,请相应在此参数中修改文件扩展名。
在上述步骤一切准备就绪后,用户便可以在终端中执行app.py
脚本文件以导出最终视频。
python app.py
MoviePy的导出效率完全取决于FFmpeg的导出效率,而不巧的是MoviePy剪切多个VideoClip时非常昂贵。但即便如此,根据测试经验,封装三分钟左右的视频和200条弹幕的总耗时也不会超过20分钟。未来待MoviePy开发完善,本工具可能会提供新的导出方法以及硬件加速方法。
如果因为您弹幕过多或其他原因导致长达数小时的渲染时间,目前则只能建议您通过降低分辨率和帧率来降低导出时间。如果您的硬件支持FFmpeg(详情),并鉴于MoviePy仍在开发中,本工具暂时提供一种使用FFmpeg的迂回方法。
请修改位于synthesization.py
内synthesize
函数的最后一部分的导出代码成如下:
# Method 1: Write out the final video with moviepy (recommended)
# video = danmakuSystem.get_video_with_danmaku(danmaku)
# export_final_video(video, configs)
# Method 2: Write out the final video with ffmpeg
danmaku_videos = danmakuSystem.get_danmaku_videos_with_mask(danmaku)
export_final_video_ffmpeg(danmaku_videos, configs)
即注释掉第一个方法并取消注释第二个方法。第二个方法可以实现使用FFmpeg的硬件加速目的,但这并不能保证导出时间的缩短,原因是danmaku_videos
是一系列包含透明通道和弹幕运动的文字剪辑,这一部分目前还是只能由moviepy导出,速度较慢。export_final_video_ffmpeg
会先将之前的文字剪辑导出成mov文件,然后和目标视频打包,这一过程则可以使用硬件加速。想要单独导出每个弹幕运动视频的用户也可以尝试这一办法,但不推荐。
如果您选择使用如上办法,请选择适当的视频编码格式,FFmpeg提供的硬件加速编码在这里,例如:对于Mac用户,您可以选择h264_videotoolbox
;对于NVIDIA硬件用户,您可以选择h264_nvenc
。如果您没有在配置文件中修改视频编码,则硬件加速不会执行。
更多参考链接:
Github: Current method to export video with mask #1502
Github: How can I speed up moviepy by gpu? #923
Github: ffmpeg 4.0 NVIDIA NVDEC-accelerated Support ? #790
Github: Concatenating VideoFileClip is too slow #961
Moviepy: FFMPEG tools
Stackoverflow: FFMPEG with moviepy
Stackoverflow: Concat videos too slow using Python MoviePY