POLOXUE's BLOG

POLOXUE's BLOG

27 Nov 2023

基于 Python 视频搬运 Part 1 - 先导篇

本文介绍如何基于 Python 实现的从 YouTube 自动化搬运视频到国内平台的命令行工具,计划命名为 mvideo,即 move video 的意思。

这个工具我已经有了一个版本,但我想把它作为一个案例,把它做成一个系统化的工具,便于后续扩展,故而,就借着视频平台以视频的形式一步一步实现这第一个版本。

前言

话说,我为什么会想开发这样一款视频搬运工具呢?

出国的几年,在 Youtube 发现不少免费的教程视频。或许是因为 Youtube 广告机制收入不菲,与程序员有关的免费教程和频道非常之多。我就想着搬运一些视频分享到国内的小伙伴。

搬运的话,手动或自动化搬运皆可。但为搬运更多视频,能自动化肯定是最好的,而且技术视频搬运这事情也不挣啥钱,纯纯的慈善事业,还是要更多地专注于其他事情。

我对这个工具的期望是能支持从下载、字幕识别、翻译、字幕制作、封面制作,甚至是多视频合成,或者大视频拆分,最终自动上传。

另外,由于我希望搬运的视频是我看过的,所以我没有做自动监听频道直接搬运的能力。后期可以考虑,对于一些优质频道,无脑搬运也不是不行。

我从网上搜罗了不少资料,花了一星期的时间,最终写出了这个小工具。除了大视频的拆分,其他基本都已经支持了。还有,自动发布当前只支持 bilibili。

我在 B 站顺便还开通了一个频道 - Youtube技术视频,用于我的日常视频搬运。

方案

资源下载,Youtube 资源的下载使用的 pytube 实现,一款轻量的用于下载 Youtube 资源的 Python 包。

字幕制作,这其中主要涉及两点内容,分别是语音的文字识别和翻译。

字幕识别,使用 openai 开发开源的语音识别系统 whisper,它支持多种模型,断句不错,而且精度比视频平台默认的文字转语音准确率看起来更好。

字幕翻译,使用的是 python 的翻译库 translators ,它实现市面上大部分翻译渠道的对接,如 baidu, qqFanyi, google, bing 等都是支持的。如果想要高品质的翻译,则是需要花钱的,我当前只集成了 deepl 和 qqFanyi 两个付费的翻译器。

视频合成,包括封面和其他一些图片制作,字幕、音视频的合成,使用的是 python 的 moviepy 库实现,它基于如 ffmpeg 和其他一些图片、视频处理库的一个易用使用 Python 音视频剪辑库。

自动发布,通过 selenium 实现,当前支持持 B 站,不过,很多视频平台都有提供开放平台 OpenAPI,可以通过接口管理视频,暂时还没去暂时,到最后也可以考虑下。

项目需求

接下来,说明下这个项目的目标。毕竟,做项目要有需求的不是。

为了使项目的整体结构清晰,我将这个搬运项目不同功能拆解到了不同的命令上。效果上,有点以类似项目管理的方式。

核心四个基本步骤,如下所示:

init, 实现项目初始化和音视频素材下载;transcribe,用于生成原始和翻译字幕;make,用于合成成品视频; publish,用于发布视频到特定视频平台。

创建项目

新建视频搬运项目

1
2
3
mkdir project_directory
cd project_directory
mvideo init --urls "https://youtube.com/watch?v=xxxx" 

亦或是

1
mvideo init --playlist "https://www.youtube.com/playlist?list=xxxx"  --playlist-start 0 --playlist-end 3

该命令的作用是项目初始化,通过指定 url 下载音视频素材文件到项目下的视频标题命名的目录中。

项目相关的资源文件,如下载、制作过程中和最终成品的文件都会存放在项目目录下。如想要纠正机翻中的错误字幕,直接编辑对应的文件即可。

参数说明:

对于搬运翻译类的项目,可通过如下命令指定:

1
mvideo init --translator 'bing' --translator-from-lang 'en' --translator-to-lang 'zh'

字幕制作

通过如下命令生成视频原始字幕:

1
mvideo transcribe --whisper-mode base

注:关于 whisper 的更多支持,请查看它的项目地址 openai-whisper

字幕是否翻译依据的是项目创建时的配置。但如果项目创建时 --translator 指定了翻译器,但不希望翻译字幕,可通过如下选项单独配置:

视频合成

视频合成命令如下所示,将会按项目的默认配置将音视频、字幕合成到成一个成品视频。

1
mvideo make

如果希望在视频中增加封面、开始声明和结尾提醒,执行如下命令:

1
mvideo make --cover-text "封面标题" --declaim-text "特别说明:本频道专注于分享优质视频。" --end-text "感谢敢看,如您喜欢本视频,欢迎点赞、收藏、评论与关注 " --without-chapter

多视频合成时,默认会使用视频标题作为章节标题,如要禁用,可通过如下命令实现:

1
mvideo make --without-chapter

视频合成的默认行为是,无论当前是否存在成品视频,都会重新合成视频。如想只在无成品视频的情况下才合成,使用如下命令:

1
mvideo make --smart

字幕合成配置,默认按项目配置,如果原始字幕和翻译字幕都存在,将会全部合成到视频中。

通过如下命令指定配置:

1
mvideo make --subtitle 'none'

视频发布

视频发布,执行如下命令,会打开浏览器自动执行发布操作。

1
mvideo publish --platform bilibili

执行发布的详细信息,如下所示:

1
mvideo publish --platform bilibili --title "发布视频主题" --keywords "程序员,编程"  --source-url "https://youtube.com/watch?v=xxx""

最后

本文介绍了 YouTube 视频搬运的整体方案,下期视频将集中于介绍资源的下载。

我的博文:基于 Python 视频搬运工具开发 Part 1

欢迎关注我的公众号: