一些网站如何下载 YouTube 字幕?

Posted

技术标签:

【中文标题】一些网站如何下载 YouTube 字幕?【英文标题】:How do some sites download YouTube captions? 【发布时间】:2018-04-02 12:43:11 【问题描述】:

这有点像Does YouTube API forbid to download video captions if you are not it's owner?、Get YouTube captions 和Does YouTube API forbid to download video captions if you are not it's owner? 的重复问题,它们基本上都说除非您是所有者,否则除非通过 YouTube API 下载字幕是不可能的,否则第三方贡献不是启用;但是,我的问题是http://downsub.com/ 或http://www.lilsubs.com/ 之类的网站如何访问所有字幕?

换句话说,当我自己访问 YouTube API 时(即使使用 youtubepartneryoutube.force-ssl 范围),我只能下载一些视频的字幕,但是当我尝试使用 @ 失败的相同视频时987654331@ 在这些其他网站上,它工作正常。我假设他们正在使用 YouTube API 来访问字幕,但他们使用的是什么特殊的酱汁?一些特殊的合作伙伴密钥?不同的 API 版本?他们只是从视频中自己抓取还是什么?

【问题讨论】:

任何您无法获得但可以通过上述网站获得的示例链接? @JanisS。这是一个示例:youtu.be/0db1_qWZjRA,它解析为标题 id zMTLb41gaOS5LWeeAi0ribdiUBIsBdqb,然后失败并返回 403 感谢 cmets 关于非官方的timedtext。这可能适用于我的用例;但是,它似乎不支持没有签名的kind=asr(即自动翻译的字幕)。 downsub.com 等其他网站也包括这些。他们是怎么做到的?下面是一个例子:youtube.com/watch?v=vx6NCUyg1NE 只有英语和印度尼西亚语才能在没有钥匙的情况下工作。 ASR 字幕也未在此处列出youtube.com/api/…。 请检查我更新的答案。 【参考方案1】:

2022 年的答案:

选项1:向网页发送curl请求:curl -L "https://youtu.be/YbJOTdZBX1g",在结果中搜索timedtext,你会得到一个URL。将\u0026 替换为& 即可获得字幕链接。

选项 2:使用 yt-dlp 包:

# For installing see: https://github.com/yt-dlp/yt-dlp#with-pip
from yt_dlp import YoutubeDL

ydl_opts = 
    "skip_download": True,
    "writesubtitles": True,
    "subtitleslangs": ["all", "-live_chat"],
    # Looks like formats available are vtt, ttml, srv3, srv2, srv1, json3
    "subtitlesformat": "json3",
    # You can skip the following option
    "sleep_interval_subtitles": 1,

with YoutubeDL(ydl_opts) as ydl:
    ydl.download(["YbJOTdZBX1g"])

【讨论】:

【参考方案2】:

在以下位置发送 GET 请求:

http://video.google.com/timedtext?lang=LANG&v=VIDEOID

评论中的视频示例:http://video.google.com/timedtext?lang=ko&v=0db1_qWZjRA

让我们看看你的另一个例子,即https://www.youtube.com/watch?v=7068mw-6lmI(我同意你评论中的差异化部分)。

视频有多种字幕可供选择

英文 韩文 西班牙语 韩语(自​​动生成)也称为 asr(自动语音识别)

这些代表字幕name 参数(即name=English)。

lang 代表国家代码。 在您的示例中:https://www.youtube.com/api/timedtext?lang=es-MX&v=7068mw-6lmI&name=Spanish

如果有字幕轨道,可以对其进行翻译,即使用tlang参数。

https://www.youtube.com/api/timedtext?lang=en&v=7068mw-6lmI&name=English&tlang=lv
https://www.youtube.com/api/timedtext?lang=ko&v=7068mw-6lmI&name=Korean&tlang=lv

这将是我对这些网站使用的内容的出价,即翻译可用的字幕轨道(通过尝试使用没有字幕轨道的视频作为其中一个网站的输入来确认)。

至于asr 签名似乎总是需要的,但只要其中一个字幕轨道可用,您就可以使用它进行翻译。例如。在您的 OP 评论示例中:

https://www.youtube.com/api/timedtext?lang=en&v=vx6NCUyg1NE&tlang=lv

看起来最后一个例子很特殊,两个字幕轨道都是asr (checked with Chrome -> Inspect -> Network),因此您需要省略字幕name 参数部分。遗憾的是,这种差异在 YouTube 视频的设置轮中不可见。

【讨论】:

目前已停止工作(2021 年 12 月 11 日)。有什么建议可以解决这个问题吗?【参考方案3】:

Youtube 使用了这个非官方的 API:

https://www.youtube.com/api/timedtext?lang=LANG&v=VIDEO_ID

LANG 这里是ISO 639-1 2 letter country code。对于您的示例,它将是:

https://www.youtube.com/api/timedtext?lang=ko&v=0db1_qWZjRA

您可以在切换隐藏式字幕按钮时在网络选项卡中查看它:

【讨论】:

谢谢,这是迄今为止最好的答案,但请参阅我对 ASR 字幕的评论。碰巧知道? ***.com/questions/46864428/… 知道为什么 name 参数在某些视频上需要,即使 lang 已经提供?例如,如果没有 name=Korean,此 URL https://www.youtube.com/api/timedtext?v=7068mw-6lmI&lang=ko&name=Korean 将无法工作。其他的都很好。我认为这可能与该视频的 ASR 字幕有关,因为还有自动生成的韩语字幕,所以也许是为了区分,但只是猜测。 查看可用潜艇列表表明何时需要。不是为什么。我的猜测是它与 YT v2 > v3 升级有关。示例:youtube.com/api/timedtext?v=7068mw-6lmI&type=list 和 youtube.com/api/timedtext?v=dhwpLACAls8&type=list

以上是关于一些网站如何下载 YouTube 字幕?的主要内容,如果未能解决你的问题,请参考以下文章

Youtube v3 API 字幕下载

如何使用youtube-dl刻录/硬编码已下载的youtube视频的字幕

怎样快速下载YouTube视频字幕

youtube-dl 不下载自动生成的字幕

无法在 Youtube API v3 中下载隐藏式字幕

怎样下载youtube的字幕