#850 | 2020-09-22 23:11:13

下载YouTube字幕的几种方法

这个视频 为例

youtube-dl

youtube-dl 有几个选项支持下载各种字幕,对于上面那个视频而言可以运行

youtube-dl --skip-download --write-auto-sub https://www.youtube.com/watch\?v\=8rrHTtUzyZA -vvv --sub-format ttml

指定下载这个视频的自动生成的 ttml 格式的字幕文件,如果不指定 sub-format 的话默认会下载 vtt 格式,vtt格式似乎有点问题,会出现很多重复的句子,所以这里用ttml。

另外还有个 --convert-subs srt 选项,可以将 vtt 格式转化成普通的 srt 字幕文件,不过这个选项会和 --skip-download 冲突,也就是说如果你要跳过下载视频的话,就不能把字幕转化成 srt 了,这应该是 youtube-dl 的bug。

接下来就要将 ttml 转成 srt 了,在GitHub上搜了下找到了相关代码,稍微改改就能给YouTube的ttml用了:https://github.com/iwestlin/ttml2srt/

需要注意下本来的ttml有一点点问题,有些符号被转成了html entities(比如'变成了'),另外句子之间会有重叠,也就是这一行字幕还没消失呢,下一行就出现了,所以我针对这两点进行了处理。

downsub.com

这个最简单无脑了,直接输出网址,点击下载就完事了。 这个网址估计特意针对YouTube做了定制化,它下载的srt文件也是像我一样处理过的,不会有重叠。

缺点就是依赖第三方网站而且有广告……

油猴脚本

这个实现上最简单了,本质上是对这个接口的调用:

https://video.google.com/timedtext?hl=en&type=list&v=YOUTUBE_ID

这个接口之前好像没有限制,可以直接访问网址获取到字幕内容,但是现在有限制了,上面那个视频如果直接访问 https://video.google.com/timedtext?hl=en&type=list&v=8rrHTtUzyZA会返回空白,但是携带一些参数就能正常获取:

https://www.youtube.com/api/timedtext?v=8rrHTtUzyZA&asr_langs=de,en,es,fr,it,ja,ko,nl,pt,ru&caps=asr&xorp=true&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1600804109&sparams=ip,ipbits,expire,v,asr_langs,caps,xorp,xoaf&signature=1644AA76E46284DB56046B9F8B47E9FE0B9A9A26.EF3C12F88CC3FA7E7A12F17E6609E7182294A083&key=yt8&kind=asr&lang=en

油猴脚本的优势就在于由于是YouTube页面内请求(会携带cookie),浏览器自动帮我们完成了参数补全的工作。

获取到字幕内容后,再写一些代码转换成srt下载就行了。