题图来源(Code Lyoko E41的08分59秒位置)将浏览器拉窄即可看到全图。
PC版网页左上角从上到下第二个图标是目录,请多用目录。
网页右下角按钮为返回顶部,请多用返回顶部来查看顶部目录。
autosub-0.4.0及以上版本支持python3。本文部分内容已过时,且不会更新,新的安装使用指南详见autosub/README.zh-Hans.md at dev · BingLingGroup/autosub

目录

  1. 简介
  2. windows python2.7环境安装配置
  3. ubuntu python2.7环境安装配置
  4. 安装pip
  5. 安装ffmpeg
  6. windows使用pip安装autosub
  7. ubuntu使用pip安装autosub
  8. 使用autosub
  9. 不能稳定连接google服务器的网络问题
  10. google见人下菜的网络问题
  11. 其他问题
  12. 自动翻译功能
  13. 图形界面使用
  14. 字幕格式批量转换
  15. 附录

简介

autosub的readme简介的google翻译

Autosub是一种用于自动语音识别和字幕生成的实用程序。它将视频或音频文件作为输入,执行语音活动检测以查找语音区域,向google Web Speech API发出并行请求以生成这些区域的转录,(可选)将它们转换为其他语言,最后保存结果字幕到本地。它支持各种输入和输出语言(使用参数–list-languages运行程序可查看支持的语言),并且当前可以生成SRT格式或简单JSON的字幕。

由于使用了google的语音识别API,而且提供了免费使用的google语音识别API key,可以说autosub使用的是目前普通人可接触到的顶级的语音识别API也不为过。

windows python2.7环境安装配置

[1]为什么此处不推荐使用windows?

没安装过python

如果你的windows之前没有安装过python,直接到python官网上下载安装python2.7,注意安装时在customize python 2.7界面下划到最底下选择Add Python.exe to Path。


Add Python.exe to Path

也可以考虑使用windows第三方包管理器chocolatey安装python2.7。

安装好chocolatey之后,用管理员权限运行命令行或者Powershell(譬如Win+X调出快捷键菜单运行),输入以下指令来安装python2.7。

1
choco install python2 -y

下一步:安装pip

安装过python

如果你的windows安装过python2.7且没安装过python3,那么可以忽略掉python2.7环境安装配置这一部分了。

如果你的windows安装过python3,且在种种原因之下不能卸载python3,那么你需要查看[windows python2与python3环境共存简易方法](windows python2与python3环境共存简易方法.html)。

下一步:安装pip

ubuntu python2.7环境安装配置

[2]为什么此处推荐使用ubuntu?

ubuntu的python2.7一般是自带的,你可以通过

1
python -V

查看当前python版本(注意V是大写),如果python没有安装,可以通过

1
apt install python -y

安装python2.7。[3]如何查看apt包管理器中的软件信息?

如果已安装的python命令对应的是python3的版本,而python2.7已经安装,可以通过update-alternatives这个命令来切换python版本。

相关参考[4]python3命令的切换方法

ubuntu下一般python命令用于使用python2.7,python3命令用于使用python3

安装pip

通过pip官方文档安装最新版即可。windows用户可以通过浏览器打开第一条指令中的那个链接,然后Ctrl-S另存为get-pip.py文件,在get-pip.py所在的文件夹打开命令行或者powershell,运行第二条指令即可。

pip安装的注意事项

  • 运行上述指令时使用的是对应着python2.7版本的python指令
  • ubuntu用户也可以使用apt包管理器中的python-pip软件包进行安装
  • windows用户不建议使用chocolatey中的pip进行安装,版本过旧
  • 如果遇到了任何安装问题,一般通过pip官方文档的方法重新安装pip都可以解决

安装ffmpeg

windows建议使用chocolatey安装ffmpeg。

1
choco install ffmpeg -y

ubuntu则使用apt

1
apt install ffmpeg -y

windows使用pip安装autosub

由于原版autosub部分代码没有考虑到windows的问题,所以需要安装特别的版本。

大家可以使用我fork的已经修改过源代码的可以在windows上安装使用的autosub的版本BingLingGroup/autosub

有两种安装方法,一种是点击刚才这个项目主页右侧Clone or download按钮,在弹出的菜单中选择Download ZIP。


Clone or download





Download ZIP

然后解压该zip文件,切换到setup.py所在目录,然后运行这条命令。这句命令最后有一个”.”表示当前目录。

1
pip install .

下一步:使用autosub



另一种是安装git,你可以使用choco来安装git

1
choco install git -y

然后使用下面这条指令进行安装,也就是pip的VCS功能

1
pip install git+https://github.com/BingLingGroup/autosub.git@origin

如果你对我修改的代码产生疑虑,可以自己根据Install AutoSub Step to Step in Windows with Translate subtitle #31进行安装,我所作的改动基本上就是这个问题里提到的那些。

也可以查看仓库对应的autosub-0.4.0-alpha版的更新日志提交历史

下一步:使用autosub

ubuntu使用pip安装autosub

ubuntu用户运行以下指令,从PyPI(Python Package Index也即Python软件包索引)中安装autosub 0.3.12版,虽然版本没有原作者仓库agermanidis/autosub里的新,但是不影响使用

1
pip install autosub

或者安装git

1
apt install git -y

然后再通过pip的VCS功能安装github仓库里的代码

1
pip install git+https://github.com/agermanidis/autosub.git@master

使用autosub

在命令行界面输入autosub -h可以得知autosub的输入参数。由于目前软件未提供翻译api而只提供了语音识别api,所以在不提供-K选项的情况下,所有尝试翻译的参数输入,即-S和-D的参数不一致的情况下都会失败。

想了解自动翻译功能的可以跳转至自动翻译功能

除此之外软件还有逻辑bug,所以建议输全-S和-D参数,格式类似以下这种

1
autosub -S zh-CN -D zh-CN [你的视频/音频文件名]

新建记事本-复制粘贴该行命令-修改后缀名为.bat即可双击使用,需要观看错误输出时注意在末尾加上call cmd,或者在命令行中运行。

[5]软件的默认输出处理逻辑问题

不能稳定连接google服务器的网络问题

首先最大的问题是网络问题,如果你使用的是无法连接到google服务器的网络,windows端你可能需要在命令行界面下输入以下两个指令,以改变当前命令行的http proxy。注意http proxy一般由本地软件提供,譬如克莱士,127.0.0.1指本地IP,冒号后面的是本地软件提供的http proxy端口。

1
2
set http_proxy=http://127.0.0.1:1080
set https_proxy=https://127.0.0.1:1080

ubuntu也需要类似的指令给终端上代理,只是你需要注意本地proxy软件是否提供http proxy功能,如果只提供socks5 proxy,你需要使用polipo将其转为http proxy然后使用。

然而你依然可能遇到如图所示的错误(Connection broken),多是因为你的网络不够稳定导致的,原因大概是google speech api对网络比较挑剔。


Clone or download

遇到这种错误,你可能需要更换网络环境。通常来讲,将运行平台更换为可稳定连接至google服务器的云服务器会比更换proxy更加有效,具体方式参考[2]为什么此处推荐使用ubuntu?

google见人下菜的网络问题

简言之:

  • 目前版本(0.4.0及以下版本)的autosub不要用香港IP,-S zh-CN的参数,去识别普通话的语音,不然会按照粤语识别输出繁体粤语(yue-Hant-HK),识别结果也是完全错误。可以使用香港IP识别en,不会有影响。至于其他亚洲地区的IP,暂时没有尝试,不知道会不会对zh-CN识别普通话这一情况产生影响
  • 问题的具体分析参见[8]autosub api调用及语音识别原理概览

其他问题

如果你还遇到了一些问题,请先google错误代码,也可以参考[7]autosub windows使用问题疑难解答

自动翻译功能

autosub并不自带免费google翻译API key,所以需要正常使用翻译功能,你可以考虑以下方法:

  • 使用在google上搜索可以白嫖的google翻译API key,用-K选项输入给autosub进行自动翻译

  • 其他提供了免费 翻译API key的修改版autosub(免责声明,本文作者未尝试其有效性):

  • 关于辅助类字幕自动翻译校对工具,可以考虑issue 31教程Translate your Subtitles那部分提到的Subtitle Edit

  • 将视频上传至youtube,使用youtube-dl获取自动翻译字幕

  • 付费使用google翻译API key

返回使用autosub

图形界面使用

嫌弃命令行界面的用户可以考虑一个GUI版本pyTranscriber(**免责声明**,本文作者未尝试其有效性)

字幕格式批量转换

请使用ffmpeg对字幕格式进行转换,也可以考虑该windows批处理脚本。和附录[2]所说的批处理使用方法类似,输入格式和输出格式均可修改,参考HowToConvertSubtitleToASS – FFmpegExtractSubtitles – FFmpeg。关于.sub等图形格式字幕的转换,建议使用Subtitle Edit,校对起来更方便。

附录

[1]为什么此处不推荐使用windows?


ArchLinux使人笑颜倍增

不推荐在windows下安装使用autosub,除非

  • 首先,你有着可稳定连接google服务器的网络环境
  • 其次,你自认为windows比ubuntu更方便使用,哪怕有的ubuntu甚至不需要额外安装python环境
  • 再次,你需要容忍一些autosub代码中windows有问题而ubuntu没问题的部分,或者使用非原github仓库或者非PyPI上的autosub代码来解决问题

返回windows python2.7环境安装配置

[2]为什么此处推荐使用ubuntu?

  • 如果你肉身能稳定连接google服务器,依然建议使用ubuntu操作,因为更容易安装使用python和autosub

    • 同时请忽略以下这段说明
  • 此处推荐的ubuntu环境一般为可稳定连接google服务器的ubuntu服务器

    • *例如安装了ubuntu的虚拟专用服务器(Virtual Private Server)或者弹性计算服务器(Elastic Compute Service)或者独立服务器(Dedicated Server)*
    • 远程服务器一般不可安装windows,即使可选,ubuntu的服务器软件环境还是比windows高到不知道哪里去了
    • 其他linux系统的使用此处略去

远程服务器操作指引:

  • 远程服务器ssh连接工具cmder(ssh连接命令如何登陆我的vps),xshell,MobaXterm等等
  • 远程文件交互工具winscp(文件上传下载),caddy(文件下载),jQuery-File-Upload(文件上传)
  • ubuntu ssh配置,ubuntu ssh服务启动等等
  • 建议上传时只上传音频文件,上传视频文件既耗时也占用服务器存储空间
  • 以下是windows调用ffmpeg批量抽取当前文件夹下的视频的音频的批处理,新建记事本-复制粘贴代码-修改后缀名为.bat即可使用。由于autosub使用ffmpeg进音频转码,且无论什么音频或视频格式输入,都会转换为flac格式,所以此处音频输出采用非编码输出mka万能封装效率最高
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
set "in_format=*.webm *.mp4"
rem 根据需要这里in_format修改为自己要输入的格式
rem 注意不要去掉通配符*号
rem 暂时不支持批量抽取一个视频中的多个音轨
set "out_format=.mka"
rem 此处输出格式不要修改,否则可能会输出失败
rem 因为当前为非编码模式,只能使用mka这种万能封装

@echo on
for /f "delims=^" %%i in ('dir /b %in_format%') do (
ffmpeg -i "%%i" -vn -acodec copy "%%~ni%out_format%"
)
@echo off
rem 此处会将当前文件夹下的所有视频的音频进行抽取
rem 文件名和原来的一致,扩展名为你设置的输出格式

call cmd

以及一些估计没人会和我一样踩的坑:

  • 如果你使用的ubuntu服务器内存空闲空间小于150MB,可能会遇到内存不够用的问题,错误信息会显示内存空间不够,分配失败,请关闭部分后台程序后再运行autosub即可。内存占用主要是调用ffmpeg转码音频为flac格式时发生的。
  • 虽然语音识别的任务是由google服务器进行,而音频分析时间轴生成的任务是在本地完成的,可以说识别速度的瓶颈基本不在本地,但是对于少数CPU特别弱的ubuntu服务器(点名批评半碗果20刀祖传OVZ架构单核服务器),可能会遇到音频分析时间对CPU占用过大拖累识别速度的问题。我这里并不是建议你非得用多核服务器,我是说最好别碰OVZ架构。

返回ubuntu python2.7环境安装配置

[3]如何查看apt包管理器中的软件信息?

Ubuntu apt包管理器中的python软件包目前版本依然是python2.7,可以通过

1
apt-cache show package python

查看python包的详情。

返回ubuntu python2.7环境安装配置

[4]python3命令的切换方法

1
2
3
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.x 1
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.y 2
update-alternatives --config python3

x和y代表某个python3的版本,以上方法来源搞定了最新版本 EFB2.0.0, telegram 收发微信,工作正常。 - V2EX

返回ubuntu python2.7环境安装配置

[5]软件的默认输出处理逻辑问题


该逻辑问题的错误信息输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
C:\>autosub -h
usage: autosub [-h] [-C CONCURRENCY] [-o OUTPUT] [-F FORMAT] [-S SRC_LANGUAGE]
[-D DST_LANGUAGE] [-K API_KEY] [--list-formats]
[--list-languages]
[source_path]

positional arguments:
source_path Path to the video or audio file to subtitle

optional arguments:
-h, --help show this help message and exit
-C CONCURRENCY, --concurrency CONCURRENCY
Number of concurrent API requests to make
-o OUTPUT, --output OUTPUT
Output path for subtitles (by default, subtitles are
saved in the same directory and name as the source
path)
-F FORMAT, --format FORMAT
Destination subtitle format
-S SRC_LANGUAGE, --src-language SRC_LANGUAGE
Language spoken in source file
-D DST_LANGUAGE, --dst-language DST_LANGUAGE
Desired language for the subtitles
-K API_KEY, --api-key API_KEY
The google Translate API key to be used. (Required for
subtitle translation)
--list-formats List all available subtitle formats
--list-languages List all available source/destination languages

根据87号拉取请求Perform speech recognition if dst_language is not denied. #87,在视频源语言(SRC_LANGUAGE)不是默认字幕文件目标语言(DEFAULT_DST_LANGUAGE)en时,软件逻辑会出现问题,认为你希望将语音识别请求由视频源语言翻译成默认字幕文件目标语言。

根据python的参数语法分析逻辑,如果你不给定某一参数的值,譬如-D参数的值,程序会使用默认值,默认值这里原作者使用的是给定的en,而不会根据-S的值变化,所以有悖一般用户的使用逻辑。

返回使用autosub

[6]把google批判一番的无端联想

破案了,参考附录[8],以下内容已过期。

这个问题就很玄学了,我尝试过en和zh-CN的语音识别,但是只在zh-CN的语音识别上遇到过。查看–list-languages参数可知,zh-CN指的是Chinese (Simplified),zh-TW指的是Chinese (Traditional),但是你如果使用香港的IP地址使用zh-CN的参数对语音进行识别,会识别出繁体粤语来,这既不简体也不普通话啊,难道google想暗示在香港地区zh-CN里的CN指的其实是Cantonese?《震惊!404公司又一乳滑石锤》,关键是autosub不给你一个香港地区识别普通话简体中文的参数(其实也不完全,看后文),而且如果你拿普通话的音频当作粤语去识别,那结果肯定是没法对上号的。

而且实话讲只是支持粤语,又不是支持更加政治正确的吴语(没有吴语),显然也无法给google,用支持少数语言的名义洗地,这只是纯粹的商业化行为而已

暂时没试在香港地区使用zh-TW参数能否按照普通话Mandarin识别出繁体,这样至少我还能把文本复制到word里面繁体转简体,说明我对常凯申的疯狂转进流学习得还不够透彻

但是如果是使用美国的IP,那么zh-CN的识别结果就是很正常的,google怎么会觉得法拉盛的高华用的是简体中文。我之前看过代码,autosub没有对语言代码做过手脚,都是直接传给api了,那只能说是google爸爸又不作恶,今且按不下表。

那么对于我们这些不能左右根据你IP个性化推荐语音识别结果这些大公司的普通白嫖用户来讲,只能从根子上入手,用美国IP就是了。生是洛圣都的人,死是洛圣都的鬼。

再补充一下,我看了一下google speech api的文档,对于language code这一点而言已经有了新的标准语言支持 | Cloud Speech-to-Text API。但是仍然很难解释,凭什么我给zh-CN的参数,google用我的IP,就给我转换成yue-Hant-HK了,要么你不给我转换报错也可以啊。不过我看了一下新版的api和autosub里面constants.py的区别,确实也有pull request的余地,等以后作进一步研究吧。

(当然我也没试验过除了香港以外亚洲地区zh-CN的识别结果如何,没钱啊)

[7]autosub windows使用问题疑难解答

Exception: Dependency not found: ffmpeg · Issue #94 · agermanidis/autosub

Temp Folder Permissions Denied on Windows 10 · Issue #15 · agermanidis/autosub

返回其他问题

[8]autosub api调用及语音识别原理概览

为了研究language code在autosub里面的使用情况,我开始查看autosub的源代码,研究了半天它这api的调用方法,也翻了一会issue区的问题,才发现我前面完全搞错了这个api的来源。首先根据issue区里面的your api key #1开发者的回答,他这个api就是从chromium的源代码上面扒下来的,我发现这个api和cloud speech api其实没有太大关系,自然用法也不一样。具体情况可以参考这个回复api key Is it a charge item? #111。我在google上搜到这么一个项目google-speech-v2,对这个api的使用提供了一点参考。我接下来有空会对修改后的代码进行测试,如果这个api能识别cloud speech api里面的语言代码,我会提交pull request对主项目进行改进。

返回google见人下菜的网络问题

题图来源(Code Lyoko E81的13分55秒位置)将浏览器拉窄即可看到全图。
PC版网页左上角从上到下第二个图标是目录,请多用目录。
网页右下角按钮为返回顶部,请多用返回顶部来查看顶部目录。

目录

  1. 简介
  2. 原理
  3. 安装
  4. 手动设置系统环境变量
  5. 自动设置系统环境变量
  6. 通过PY_HOME系统变量切换python版本
  7. 本方法参考

简介

该简易方法可以做到在windows下“同时”安装python2和python3环境依赖且使用互不兼容的python软件包(如vapoursynth和autosub),不会涉及到Pycharm python开发环境设置,anaconda的配置设置等等。

此处所指的vapoursynth与autosub的冲突是指,vapoursynth必须要使用python3以上的python运行环境,autosub必须要使用python2的python运行环境,而python3环境会影响到autosub的使用。autosub的issue区的教程给出的解决方法竟然是卸载python3,我只能说我卸不起卸不起,太暴力了.jpg

原理

环境变量 - 维基百科
Using Python on Windows - Python 3.7.2 documentation
简言之就是通过设置环境变量特别是系统环境变量Path,可以让python及python相关的软件包在命令行的非python环境目录下正常运行。

安装

首先是安装Python27和Python37,你可以使用chocolatey安装python。

安装好chocolatey之后,用管理员权限运行命令行或者Powershell(譬如Win+X调出快捷键菜单运行),输入以下指令来安装python27和python37。

1
2
choco install python2 -y
choco install python -y

如果你使用的是python的安装包进行的安装,可以考虑在安装过程中选择自定义功能并勾选Add python.exe to Path,使用choco安装时将自动设置环境变量。

安装时注意尽量使用默认安装路径,否则在后文提到的安装路径处请修改为自己的安装路径。

手动设置系统环境变量

但是python环境共存并不仅仅只是安装完两个版本的python这么简单,想要正常使用,你可以借助官方提供的Python launcher for Windows以及具体使用方法同时装了Python3和Python2,怎么用pip? - 知乎

当然本篇文章所讲的并不是换个命令继续用的方法,因为是我实践完了以后才发现的这个方法,不想再试了,而是不需要改变原来的命令就可以直接用的方法。

能用命令行做的事就不要用图形界面做

这话反过来就是:

图形界面能做的事就不要用命令行做

以下将提到两种用GUI设置,两种用命令行设置系统环境变量的方法。

通过系统属性设置

此电脑(我的电脑)-右键-属性-高级-环境变量,在弹出的窗口中可以看到上半部分用户变量和下半部分系统变量,根据这篇教程Python环境变量,如果你看到用户环境变量或者系统环境变量里面有PYTHONHOME这个变量,务必删掉,否则会影响我后面提到的切换的方法。(注意是变量,不是值,窗口里面有两列,第一列标的是变量,第二列是值)同时删除和python有关的用户变量或者系统变量。

因为python命令输入时,程序一旦读到PYTHONHOME这个变量,就会去找这个目录下的python,而忽略掉其他变量的设置。

新建PY_HOME系统变量

接下来点击新建(注意是系统变量的对话框,也就是下半部分对话框旁边的新建),在弹出的窗口中的变量名框内输入PY_HOME,变量值输入你马上要用的Python.exe所在的路径,点确定来保存。

然后找到系统变量界面中的Path这个变量。

已经有Path这个变量

选中Path变量,点击编辑,注意先删除已经存在的python的路径(如C:\Python27,C:\Python27\Scripts等)。

然后在弹出的窗口右侧点击新建,输入

1
%PY_HOME%

输完之后回车,再次重复以上步骤输入

1
%PY_HOME%\Scripts

然后点确定来保存。

如果觉得麻烦,也可以选择右侧的编辑文本,在最右侧或者最左侧添加,每一项之间用 ; 分隔。

下一步:通过PY-HOME系统变量切换python版本

还没有Path这个变量

点击新建(注意是系统变量,也就是下半部分对话框旁边的新建),在弹出的窗口中的变量名框内输入Path,变量值输入:

1
%PY_HOME%;%PY_HOME%\Scripts;

然后点确定来保存。

下一步:通过PY-HOME系统变量切换python版本

通过注册表进行设置

通过Win+R键调出运行,输入regedit打开注册表编辑器,在上方路径框中输入

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

回车跳转至该位置,然后双击Path进行修改,以及在空白处右键新建字符串值PY_HOME,并输入数值数据,数据格式和前文所说方法类似。

下一步:通过PY-HOME系统变量切换python版本

通过命令行setx命令和reg命令进行设置

可以通过

1
2
setx /?
reg /?

查看使用方法,也可以谷歌其他教程,此处略过。

自动设置系统环境变量

我也写了一个使用reg和setx命令自动设置python系统环境变量的脚本win_py_syspath_sw_create.bat。

**[注意]**,本脚本会做出以下行为:

  1. 申请管理员权限
  2. 修改系统变量Path并创建系统变量PY_HOME
  3. 在Path之前,将查询到的Path变量备份到txt文件内
  4. 在Path之前,会自动删除Path中特定的六个路径,可能和你之前设置的不一样

免责声明:

  1. 本人不对该脚本运行造成的任何后果负责,也不提倡任何人学习使用batch语言
  2. 真正的懒人应该参考前面所说的手动设置方法进行设置

代码和下载详见冰灵win批处理

通过PY_HOME系统变量切换python版本

日常使用时修改系统变量PY_HOME的值即可达到切换python环境的目的,注意修改后要记得重启命令行界面或者系统变量界面来载入系统变量的新值。

如果pip的使用出现异常情况,请通过getpip的方法重装pip。

手动切换python版本

类似地,通过系统属性设置通过注册表进行设置都可以修改PY_HOME的值。

自动切换python版本

我也写了一个使用reg和setx命令自动切换PY_HOME系统环境变量的脚本win_py_syspath_sw.bat。

**[注意]**,本脚本会做出以下行为:

  1. 申请管理员权限
  2. 查询系统变量PY_HOME
  3. 根据当前的python版本(只看PY_HOME的后两位数字)切换到另一个,可能和你之前安装的路径名不一样
  4. 两者的默认取值为pyhome_1=27和pyhome_2=37,你可以根据自己的情况进行修改

免责声明:

  1. 本人不对该脚本运行造成的任何后果负责,也不提倡任何人学习使用batch语言
  2. 真正的懒人应该参考前面所说的手动设置方法进行设置

代码和下载详见冰灵win批处理

本方法参考

本方法参考自python - How to add to the pythonpath in Windows? - Stack Overflow

其他类似的教程Python多版本共存配置_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

题图来源(Code Lyoko E73的11分50秒位置)将浏览器拉窄即可看到全图。
PC版网页左上角从上到下第二个图标是目录,请多用目录。
网页右下角按钮为返回顶部,请多用返回顶部来查看顶部目录。

目录

  1. 简介
  2. 原理
  3. 程序准备
  4. 设置Gpg4win
  5. 设置github
  6. 设置sourcetree
  7. 疑难解答

本文章主要讲解在使用windows版sourcetree对github commit进行签名操作,本方法主要优点在于可根据不同仓库设置是否使用何种签名,而非全局使用某一特定签名。

简介

GPG签名是什么?怎样为你的 Commit 加上 GPG 的签名

为 Commit 带上 GPG 的签名就是一个很好的开始,它能够在一定程度上保证安全性。

简而言之就是类似账号两步验证之类的确保你的github账号创建的提交(commit)是你本人做出的而不是别人盗用你账号做出的,类似的方法有mega网盘的账户还原密钥。

原理

GPG入门教程 - 阮一峰的网络日志

程序准备

以下程序准备针对的操作系统环境是windows 10,git图形界面则是sourcetree。

安装Gpg4win

Gpg4win - Secure email and file encryption with GnuPG for Windows

安装sourcetree

sourcetree
一些设置建议可以参考[github pull request流程演示之安装sourcetree](github pull request流程演示.html#安装sourcetree)。

设置Gpg4win

安装的是Gpg4win,此处以Kleopatra为例,同样你也可以使用其他GPG密钥管理界面,密钥管理方法应该是类似的。选择菜单栏-文件-新建密钥对,根据提示自行创建密钥,也可以参考GPG入门教程 - 阮一峰的网络日志

注意, 邮箱账号需为你在github账号中验证过(verified)的邮箱,来源Generating a new GPG key - User Documentation,同时第8步中github也给你了隐藏邮箱的方法。

创建完毕后,点击刚才创建的密钥对,右键-细节,公钥就是Kleopatra里面的指纹部分,点击导出获得私钥,你刚才被要求输入的那段密码是用于保护私钥的密码,并不是私钥本身。

设置github

参考github官方文档Adding a new GPG key to your gitHub account - User Documentation,以及官方推荐的设置步骤About commit signature verification - User Documentation - gpg

此处github需要粘贴进去的gpg key指的是在前一个步骤中生成的私钥。

设置sourcetree

严格意义上这里并不是设置sourcetree,而是设置每个仓库(repository)提交所需的配置文件,位置是:

仓库文件夹/.git/config

全局(global)配置文件在windows当前用户的用户文件夹根目录下:

C:/Users/你的用户名/.gitconfig

当然如果你用命令行操作git的话,可以参考git官方文档的local参数说明git - git-config Documentation - local和配置文件读取顺序说明git - git-config Documentation - files

根据配置文件读取顺序说明,可以得知git提交(commit)的时候,在不加特定参数时,会先读取全局配置文件(global git config),然后再读取本地配置文件(local git config),如果在全局配置文件里面设置了特定用户的gpg签名,而你有多个github用户或者多个gpg签名或者有的仓库不想使用gpg签名的时候,就会出现混乱。

本篇文章原创部分最大的地方也就在这里换句话说其他地方都是抄的,之前我参照的一个教程在Windows版的Sourcetree上启用GPG签名只说了全局的方法,但是如上所述会出现混乱的情况,所以我这里给出的方法是不在全局配置文件处进行设置。而是对每个仓库的配置文件进行设置,设置方法和全局配置文件的写法一样,添加以下字段即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[user]
name =
# name指gpg签名生成时你填的名字
email =
# email指gpg签名生成时你填的邮箱
signingkey =
# signingkey指公钥ID的后八位,或者说指纹的后八位
[commit]
gpgSign = true
# 此处gpgSign的值可为true或者falsetrue指开启gpg签名
[gpg]
program = c:\\Program Files (x86)\\GnuPG\\bin\\gpg.exe
# 这里program的位置是Gpg4win安装时的默认位置
# 如果你当时没装在这个路径,请自行修改
# 注意两条反斜线中一条是用来转义的,务必确保路径名中的反斜线是有两条的

这样设置好了以后,再提交的时候,git就会调用gpg,要求你对提交进行签名,此时你需要输入那串用于保护私钥的密码。

疑难解答

前面所讲都是让sourcetree使用内嵌的git的情况下进行的操作,因为sourcetree使用oauth绑定多个github账号时的[各种问题](github pull request流程演示.html#推送-push-你刚才的提交-commit),所以没怎么试过用外部git单独操作的情况是否能成功设置。理论上这套教程也可以用于单独安装的git,毕竟以上各种玄学问题的解释都是从git的官方文档里找的,我本人尝试的结果是可以用于强制推送的指令,其他还没试过。

题图来源(Code Lyoko E72的07分17秒位置)将浏览器拉窄即可看到全图。
PC版网页左上角从上到下第二个图标是目录,请多用目录。
网页右下角按钮为返回顶部,请多用返回顶部来查看顶部目录。

目录

  1. 简介
  2. 程序准备
  3. pull request流程

本教程面向会使用谷歌的github零基础使用者,同时也作为刚入门github pull request的笔者的简单记录。


就是搜不到这种操作.jpg

简介

pull request是什么?Pull Request 的命令行管理 - 阮一峰的网络日志

“Pull Request 是一种通知机制。你修改了他人的代码,将你的修改通知原来的作者,希望他合并你的修改,这就是 Pull Request。”

直接翻译过来可以理解为拉取(pull)请求(request)。推送(push)和拉取(pull)是github多种基本操作之一,推送一般指将本地git仓库的特定分支(branch)推送到远程仓库(譬如github的某个repository)的特定分支(也称remote branch),pull则是相反的操作。之所以称作是拉取请求,我个人的理解是你对别人的仓库里一个分支的文件进行了改动,向别人发起请求来拉取你一个分支里的改动,只不过这里的拉取是远程到远程的操作,都是github上的仓库而和本地没有关系。

程序准备

以下安装准备针对的操作系统环境是windows 10,git图形界面则是sourcetree,部分sourcetree不能解决的问题会涉及到git Bash操作。

返回pull request流程

安装sourcetree

sourcetree是一个并不那么省心的git图形界面软件,但是git图形界面软件就那么几个,只能将就着用了,不然就命令行吧。

安装时建议使用内嵌(Embedded)版git,内嵌版git在添加多个github账号时使用起来较为繁琐,但是sourcetree使用外部git时好像(此处存疑)无法使用oauth一键绑定github账号,也要注意全局git config(位置一般在/Users/你的用户名/.gitconfig)中的用户设置,总之我印象里面是有bug。相比之下单独使用git配置多账户的教程可以参考同一客户端下使用多个git账号 - 简书。如果要使用系统自带的git,请自行安装git。其他问题包括如何使用sourcetree,如何在sourcetree中登录github账号等,就自己谷歌吧,这里略去

安装git

安装git之前我建议先安装一个windows的第三方包管理器chocolatey,因为chocolatey可以自动帮你维护环境变量-系统变量,同时还能帮你更新软件,使用起来更加安心。chocolatey的使用范例可以参考使用 ffmpeg 拼接 bilibili 客户端所下载的分段 flv 视频

安装好chocolatey之后,用管理员权限运行命令行或者Powershell(譬如Win+X调出快捷键菜单运行),输入以下指令来安装git。

1
choco install git -y

pull request流程

pull request需要的流程主要是先远程克隆(fork)他人的仓库,然后克隆(clone)到本地,接着在本地,对文件进行修改(modify),修改之后,提交(commit)并推送(push)到你远程的分支(branch)上。再打开别人的项目主页,点击中间的New pull request建立新的拉取请求,可以看到一个对比页面,选择好了之后填写说明创建(Create pull request)即可。具体参考Pull Request 的命令行管理 - 阮一峰的网络日志,这里不再赘述。

以下是遵循上述环境下进行操作的一部分提示。

远程克隆(fork)他人仓库

打开他人的仓库(repository)主页,你会看到右上角有一个Fork按钮,点击Fork,创建他人仓库在你github账号下的副本。

克隆(clone)你刚创建的副本并修改本地文件

打开sourcetree,点击Clone,克隆你刚才创建的远端仓库副本,然后在本地修改文件。

提交(commit)你刚才进行的改动

这里面有两个坑,我先说明一下。

首先,注意关闭换行符自动转换,如果你使用那种一旦将CRLF转换成LF就会影响代码运行或者其他严重后果的编程语言或者集成开发环境(如Batch,Vivado verilog等),请务必关闭这一选项。其他情况也请酌情关闭。LF虽好,可我大窗国自有国情在此,原不藉外夷货物以通有无

其次,注意你要pull request的仓库是否开启了提交验证(commit verified)。

不是这两张,应该是下面这些。

譬如仓库的readme里面或者contribute文档里面明确说明pull request需要签名验证此处懒得找图了

打开某个pull request后看到有人因为没有提交验证而格格不入

或者打开提交历史(在仓库主页点击commits即可看到),最近的提交都有签名。

关于签名验证的具体操作方法,可以参考我写的另一篇文章在windows版的sourcetree上设置gpg签名

如果你已经创建了pull request,忘记或者不清楚对提交进行签名,却被要求要进行签名被格格不入的时候,这时可以通过现在本地软重置提交再强制推送的方式更改掉你之前没有签名的分支,详见反悔推送的方法。注意你在强制推送之前,请务必先在本地做好带gpg签名的提交。

推送(push)你刚才的提交(commit)

这里也有两个坑。

首先是sourcetree的问题。如果你在sourcetree里面绑定了多个github账号,提交能成功,却发现推送总是失败的时候,注意在工具-选项-验证-账户里,把当前仓库的账号设置成默认账号即可解决问题,原因是sourcetree对多个github账号的oauth验证管理有缺陷,似乎不能针对单个仓库进行账户密码管理。或者你也可以请自行配置ssh而不使用sourcetree的oauth验证,这样其实就和命令行git的配置使用差不多了。这样的话真的感觉sourcetree有个GUI用

其次是如果有人有整洁强迫症,可以考虑在推送时推送到一个单独的分支上,而不是推送到副本分支上,譬如你可以单独新建一个patch-xxx这样的分支等等,具体请谷歌。反正合并的时候自己知道用哪个分支合并就可以了,命名规范主要是记录起来好看一点。

我想反悔推送(push)怎么办

假如你推送了一个错误的东西上去,再纠正还得再推一个,感觉没必要的时候,可以使用这个方法。

在sourcetree里,点击你要重置回去的那一次提交,右键-重置当前分支到此次提交-软合并(保留所有本地改动),确定你做的修改没问题后,再正常地在本地提交一次,提交完了之后,确定本地仓库没问题的时候,右上角点击命令行模式,打开git bash,输入以下指令即可。参考git撤销&回滚操作 - 李刚的学习专栏 - CSDN博客

注意尽量只在自己的仓库上进行强制推送,强制推送过于暴力,可能会造成一些不可挽回的后果。

1
git push -f

返回签名验证

题图来源(Code Lyoko E80的11分48秒位置)将浏览器拉窄即可看到全图。
PC版网页左上角从上到下第二个图标是目录,请多用目录。
标题后面括号里的日期指的是最后更新日期,头像旁边的日期是最初发布日期。

目录

  1. 简介
  2. 批量重命名批处理
  3. 批量压缩批处理
  4. python环境批处理
  5. 其他批处理

简介

这次来讲讲最近为了发布资源而写的几个windows batch批处理的使用指南。注意只能在windows上使用,谁叫batch是windows专用的脚本语言,只能被windows命令行解释器执行,但是写起来一点也不省心啊,以后大概会出同功能的python版,这样就可以跨平台运行了。

冰灵批处理相关的github仓库,可以通过下载仓库压缩文档获得可以直接在windows上运行的.bat文件。目前项目readme还在施工中,因为我懒

特别要注意的一点是,和其他命令行软件的输入一样,如果你的路径或者文件名里面有空格,那么请务必在外面加上引号。

批量重命名批处理(rename_files_from_txt)

为什么要写这样一个批处理

其实很多软件都有批量重命名的功能,我平时用的nexus file在这方面功能就极其强大,譬如可以控制插入字符的位置,查找替换等等,那我为什么还要写这样一个批处理呢?

实际上,这些重命名软件,我现在还没看到哪个是支持全自定义列表重命名的,也就是,每一个文件名的内容都不一样,那有人问了,你既然每一个文件名内容都不一样,为什么不能一个个重命名非要写一个程序呢?其实这里是有一个相对合理的应用场景的。

  1. 一个个重命名,就不说鼠标要一个个点浪费微动寿命了,F2键也会被摁坏,甚至不知道快捷键的人可能会摁坏第二个鼠标按键(冷笑话)。
  2. 考虑一下是别人给你的文件名列表呢?那你可能还要多坏另外三个键盘的按键是Ctrl,C和V了(滑稽)

我就说说冰灵的应用场景。

  1. 字幕组组长给你拟定了一个分集标题,每集标题都不一样。
  2. 你是负责把视频上传到b站的,b站的分P名和很多网站处理上传文件的逻辑是一样的,默认值是上传前的文件名。(a站就不是 所以a站就不填分P名了)
  3. b站的分P名编辑起来比较鬼畜,好像是不能用鼠标点光标位置,修改起来困难。
  4. 你会很自然想到先在本地就把文件名重命名好然后再上传。

譬如这样一个列表,一行一个名称

S4E66_William Returns_William回归
S4E67_Double Take_替身袭击
S4E68_Opening Act_开幕演出
S4E69_Wreck Room_毁坏房间
……

那也就会很自然地想到写一个程序一行行读进来然后拿去重命名。

至于为什么用的批处理,主要是看到一个b站压制大佬写的用来转换帧率的批处理不够懒人化而感到不满于是开始入坑,一开始是想着写着简单,后来发现越简单的东西越难写,特别是batch的中文文档不是很多很难抄代码的情况下,还好后来多看官方文档和stackoverflow解决了一部分问题。

功能

目前能做到的功能就是从一个源文件名txt和一个目的文件名txt中读取文件名,然后改名。其中源文件名txt支持自动生成,但是因为batch默认的文件名排序比较迷,和资源管理器中的文件名顺序并不一致。

最明显的一点是,按文件名顺序排序后,资源管理器里面1后面的2到9的数字会在10之前,而batch的文件名顺序是,2到9的数字会在10之后,只有你命名成等宽的数字编码,譬如最大不超过999则是001或者最大不超过99则是01这种,才会得到正确的排序。

所以本批处理会强制停下让你重新检查源文件名列表和目的文件名列表的一一对应关系,如果有问题建议复制到excel中进行编辑,只要在这个步骤时,确认每一行对应关系没问题,那么最后重命名的结果就是正确的,毕竟程序核心只是遍历每一行txt,然后调用系统自带的重命名命令ren进行重命名而已。毕竟batch太过简略,拿来写排序算法也实在太难受所以后续估计不会在这方面进行改进了

什么?你电脑上还没有装excel?libre office了解一下,如果不是给老师写报告,只是搞搞重命名应该够用了,还没有WPS的弹窗😨

以及,因为excel或者nexus file这类软件对于编号式重命名方面的功能非常强大,本批处理以后也不会在这方面增加功能。

使用

直接打开后会弹出全提示模式,使用方法详见提示信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
echo ^[警告^]这里若不退出,下一步将进行重命名
echo 请确认已做好文件备份,以防止意外情况发生
echo.
echo ^[警告^]请确保不要使用任何windows
echo 文件系统禁止使用的符号进行重命名
echo.
echo 全提示模式:
echo.
echo 1.待改名文件在当前路径下的work文件夹内
echo.
echo 2.work文件夹内所有文件都会被重命名
echo.
echo 3.改名后文件名列表dst_list.txt处在当前路径下,
echo 请使用GB2312编码txt,否则会有乱码
echo (我大窗国自有窗国情在此)
echo.
echo 4.dst_list.txt的文件名列表格式为:
echo 1)一行一个文件名
echo 2)顺序不影响重命名
echo 3)文件名中可以包含空格
echo.
echo 5.输出这段提示信息前,
echo 如果你的work文件夹已存在,
echo 批处理已将其中的文件名输出成列表
echo 到当前路径下的src_list.txt中
echo.
echo 6.请根据自己喜好创建dst_list.txt,
echo 因为下一步程序
echo 1) 不会再改变dst_list.txt
echo 2) 根据src_list.txt和dst_list.txt进行重命名
echo 如果你有特殊需要,可以对src_list.txt中的文件名
echo 进行编辑操作
echo.
echo 7.不会提示给予再次确认改名前后名称对应关系,
echo 改名前请做好文件备份,以免出现意外情况
echo.
echo 8.建议使用excel提前编辑好改名后文件名
echo 并拷贝到dst_list.txt中
echo 注意使用Ctrl-H搜索替换掉excel特有大空格
echo.
echo 9.不会更改扩展名
echo.
echo 10.如果你做好了1-4的准备,再重新运行本批处理
echo 将会进入到另一个重命名模式
echo.
echo 11.重命名之后
echo src_list.txt和dst_list.txt不会自动删除

另一种模式其实跟这个差不多,但是会“自动”帮你把dst_list.txt进行排序,未必是好事,后续会改进这个逻辑。提示信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
echo ^[警告^]这里若不退出,下一步将进行重命名
echo 请确认已做好文件备份,以防止意外情况发生
echo.
echo ^[警告^]请确保不要使用任何windows
echo 文件系统禁止使用的符号进行重命名
echo.
echo 核对模式:
echo.
echo 1.为了防止你的排序方法
echo 和batch文件名顺序有不一致情况,
echo 已对新文件名列表
echo 按照文件名的顺序重新进行排序,
echo 但是这不代表两种文件顺序
echo 就一定一一对应
echo.
echo 2.^[警告^]如果新旧文件名差异较大,
echo 建议逐行核对
echo.
echo 3.下一步程序
echo 1) 不会再改变dst_list.txt
echo 2) 根据src_list.txt和dst_list.txt进行重命名
echo 如果你有特殊需要,可以对src_list.txt中的文件名
echo 进行编辑操作
echo.
echo 4.重命名之后
echo src_list.txt和dst_list.txt不会自动删除

批量压缩批处理(7z_batch和run_7z_batch)

这个批处理其实意义不大,正常的用途中绝不会有人想到要让每个文件都只打包成一个文件,多数情况下大家都是为了避免小文件传输影响速度或者便捷性才会使用压缩把多个文件打包成一个大压缩包,而且对于有损视频格式而言,使用压缩算法可以再压缩出的空间微乎其微,打成一个大的压缩包会因为体积太大,而不利于大家下载,完全就是做重复计算浪费性能和电费。

做这样的批处理完全是迫于百度云对特定文件格式的检测,规避百度云的所谓检测删封的同时方便大家索取单个视频文件而已。

这个程序其实本来可以写的挺简单的,主要是考虑到要设置一些需要忽略的情况,譬如如果用户非要在待压缩文件所在文件夹里面启动批处理进行压缩,但又不想进行多余的操作,把批处理自身也压缩,产生不必要的文件,那么就需要设置忽略的脚本名称。

其实这个批处理的提示信息也写得挺详细的了,看提示信息基本就会用了。

1
2
3
4
5
6
7
8
9
10
11
12
echo 本批处理可以将某一文件夹内的文件逐个压缩
echo.
echo 首先确认命令行7z,也就是7z.exe是否添加到环境变量-系统变量
echo 或者确认7z.exe在待压缩文件所在文件夹
echo.
echo 输入待压缩的文件所在文件夹
set /p work_dir=(默认为当前文件夹,回车为默认):
echo.
if not defined work_dir set work_dir=%~dp0

echo 输入压缩后的压缩格式后缀(包括点)
set /p dst_exte=(默认为.7z,请输入7z支持的压缩格式,回车为默认):

还有一个run_7z_batch,是我考虑到这个程序一定要有自定义输入,但是如果由程序提问等待用户输入这样太麻烦了,等于是我每次都要重新输入参数,run_7z_batch就是在命令行界面下调用7z_batch,将参数直接传递给7z_batch,这样7z_batch就不提问了,直接运行更加省事。

因为run_7z_batch是使用call命令调用7z_batch运行,我没查到批处理能获得到call它的批处理或者程序的名称的功能,所以这多设置了一个参数,传递给7z_batch,告诉它run_7z_batch的名字是什么,这样来忽略额外的文件名。还有就是,我在7z_batch里面也把对自身文件名的获取设置成从命令行参数中得到,这样的话就对用户更改了批处理文件名的情况做出了处理。换句话说,你在使用这两个批处理的时候,可以把它们的名字命名成任意你喜欢的名字,也不会影响程序对文件的正常压缩过程,虽然我觉得很没有必要就是了。

1
2
3
4
5
6
set z7_bat_name="7z_batch.bat"
rem 7z_batch文件名
set work_path="C:\userfile\Desktop\压制\batch脚本\test\work"
rem 待压缩文件所在文件夹,即工作文件夹
set run_bat_name="run_7z_batch.bat"
rem 需要额外忽略的一个文件名,若此脚本在工作文件夹内,则需要忽略

python环境批处理

github链接:bingling batch python syspath

其中win_py_syspath_sw_create.bat为python环境切换创建批处理,win_py_syspath_sw.bat为python环境切换批处理,win_py_syspath_query.bat为系统环境变量查询批处理。

该批处理编写时用到的参考资料:

bat知识点3_for循环_跳出嵌套 - haibo19981的专栏 - CSDN博客

批处理 FOR参数/F之tokens详解_DOS/BAT_脚本之家

Set windows environment variables with a batch file - Stack Overflow

如何在cmd命令行中查看、修改、删除与添加环境变量 - wzsbll的专栏 - CSDN博客

SET和SETX命令的应用 - baiyibin0530的专栏 - CSDN博客

通过注册表设置环境变量 - anhuidelinger的专栏 - CSDN博客

bat、cmd 批处理中(或 DOS环境)的特殊字符 - jinzhenshui - 博客园

cmd - How to get last n tokens from string using “FOR /F” in batch file - Stack Overflow

批处理:FOR的参数/F之delims详解 - kukou的专栏 - CSDN博客

regex - printing all tokens after 2nd token in a batch script - Stack Overflow

在BAT文件中实现对空格分割的字符串的处理 - zhifeng - ITeye博客

.bat批处理(六):替换字符串中匹配的子串 - AlbertS Home of Technology - CSDN博客

command line - String replacement in batch file - Stack Overflow

string - Batch - replacing with percent symbol - Stack Overflow

其他批处理

一个是getname_batch还有一个是test_rename_batch,前面的看到代码中的注释就知道是怎么用的了,后面这个是用来测试rename_batch的批量生成txt的批处理,没必要拿来用我就没加任何注释,但是稍微懂一点batch应该也可以看懂,这里就不再解释了。