Подтвердить что ты не робот

Как извлечь закрытый транскрипт субтитров из видео YouTube?

Можно ли извлечь транскрипт с субтитрами из видео на YouTube?

У нас более 200 веб-трансляций на YouTube, и каждая из них не менее одного часа. YouTube закрыл заголовок для всех видео, но, похоже, пользователи не могут его получить.

Я попробовал URL в этом блоге, но он не работает с нашими видео.

http://googlesystem.blogspot.com/2010/10/download-youtube-captions.html

4b9b3361

Ответ 1

В следующем документе говорится, что только владелец канала может выполнить это через стандартный интерфейс youtube: https://developers.google.com/youtube/2.0/developers_guide_protocol_captions?hl=en

Дешевое исправление: Вы можете щелкнуть по кнопке "интерактивный транскрипт" и скопировать контент таким образом. Конечно, вы теряете миллисекунды таким образом.

Чрезвычайно дешевое решение: Общая учетная запись youtube - так что несколько человек могут редактировать и загружать файлы субтитров.

Сложное решение: API-интерфейс youtube позволяет загружать и загружать файлы заголовков через HTTP... Вы можете написать приложение API YouTube для предоставления пользовательского интерфейса браузера для загрузки или загрузки для ЛЮБОГО пользователя или конкретных пользователей.

Вот пример проекта для этого в java  http://apiblog.youtube.com/2011/01/youtube-captions-uploader-web-app.html

Вот очень простой пример рабочей загрузки для всех:   http://yt-captions-uploader.appspot.com/

Ответ 2

Вот как получить стенограмму видео с YouTube (если доступно):

  • Перейдите на YouTube и откройте видео по вашему выбору.
  • Нажмите кнопку "Дополнительные действия" (3 горизонтальные точки), расположенную рядом с кнопкой "Поделиться".
  • Нажмите "Открыть стенограмму"

Хотя синтаксис может быть немного глупым, это довольно хорошее решение.

Источник: http://ccm.net/faq/40644-youtube-how-to-get-the-transcript-of-a-video

Ответ 3

Вы можете просмотреть/скопировать/загрузить файл с временным кодом xml файла закрытых титров youtube, обратившись к

http://video.google.com/timedtext?lang=[LANGUAGE]&v=[YOUTUBE VIDEO IDENTIFIER]

Например http://video.google.com/timedtext?lang=pt&v=WSVKbw7LC2w

ПРИМЕЧАНИЕ. Этот метод не загружает автогенерированные закрытые титры, даже если вы правильно владеете языком (может быть, есть специальный код для автогенерированных языков).

Ответ 4

Другой вариант - использовать youtube-dl:

youtube-dl --skip-download --write-auto-sub $youtube_url

Формат по умолчанию - vtt, а другой доступный формат - ttml (--sub-format ttml).

--write-sub
       Write subtitle file

--write-auto-sub
       Write automatically generated subtitle file (YouTube only)

--all-subs
       Download all the available subtitles of the video

--list-subs
       List all available subtitles for the video

--sub-format FORMAT
       Subtitle format, accepts formats preference, for example: "srt" or "ass/srt/best"

--sub-lang LANGS
       Languages of the subtitles to download (optional) separated by commas, use --list-subs for available language tags

Вы можете использовать ffmpeg для преобразования файла субтитров в другой формат:

ffmpeg -i input.vtt output.srt

Вот как выглядят субтитры VTT:

WEBVTT
Kind: captions
Language: en

00:00:01.429 --> 00:00:04.249 align:start position:0%

ladies<00:00:02.429><c> and</c><00:00:02.580><c> gentlemen</c><c.colorE5E5E5><00:00:02.879><c> I'd</c></c><c.colorCCCCCC><00:00:03.870><c> like</c></c><c.colorE5E5E5><00:00:04.020><c> to</c><00:00:04.110><c> thank</c></c>

00:00:04.249 --> 00:00:04.259 align:start position:0%
ladies and gentlemen<c.colorE5E5E5> I'd</c><c.colorCCCCCC> like</c><c.colorE5E5E5> to thank
 </c>

00:00:04.259 --> 00:00:05.930 align:start position:0%
ladies and gentlemen<c.colorE5E5E5> I'd</c><c.colorCCCCCC> like</c><c.colorE5E5E5> to thank
you<00:00:04.440><c> for</c><00:00:04.620><c> coming</c><00:00:05.069><c> tonight</c><00:00:05.190><c> especially</c></c><c.colorCCCCCC><00:00:05.609><c> at</c></c>

00:00:05.930 --> 00:00:05.940 align:start position:0%
you<c.colorE5E5E5> for coming tonight especially</c><c.colorCCCCCC> at
 </c>

00:00:05.940 --> 00:00:07.730 align:start position:0%
you<c.colorE5E5E5> for coming tonight especially</c><c.colorCCCCCC> at
such<00:00:06.180><c> short</c><00:00:06.690><c> notice</c></c>

00:00:07.730 --> 00:00:07.740 align:start position:0%
such short notice


00:00:07.740 --> 00:00:09.620 align:start position:0%
such short notice
I'm<00:00:08.370><c> sure</c><c.colorE5E5E5><00:00:08.580><c> mr.</c><00:00:08.820><c> Irving</c><00:00:09.000><c> will</c><00:00:09.120><c> fill</c><00:00:09.300><c> you</c><00:00:09.389><c> in</c><00:00:09.420><c> on</c></c>

00:00:09.620 --> 00:00:09.630 align:start position:0%
I'm sure<c.colorE5E5E5> mr. Irving will fill you in on
 </c>

00:00:09.630 --> 00:00:11.030 align:start position:0%
I'm sure<c.colorE5E5E5> mr. Irving will fill you in on
the<00:00:09.750><c> circumstances</c><00:00:10.440><c> that's</c><00:00:10.620><c> brought</c><00:00:10.920><c> us</c></c>

00:00:11.030 --> 00:00:11.040 align:start position:0%
<c.colorE5E5E5>the circumstances that brought us
 </c>

Вот те же субтитры без части в верхней части файла и без тегов:

00:00:01.429 --> 00:00:04.249 align:start position:0%

ladies and gentlemen I'd like to thank

00:00:04.249 --> 00:00:04.259 align:start position:0%
ladies and gentlemen I'd like to thank


00:00:04.259 --> 00:00:05.930 align:start position:0%
ladies and gentlemen I'd like to thank
you for coming tonight especially at

00:00:05.930 --> 00:00:05.940 align:start position:0%
you for coming tonight especially at


00:00:05.940 --> 00:00:07.730 align:start position:0%
you for coming tonight especially at
such short notice

00:00:07.730 --> 00:00:07.740 align:start position:0%
such short notice


00:00:07.740 --> 00:00:09.620 align:start position:0%
such short notice
I'm sure mr. Irving will fill you in on

00:00:09.620 --> 00:00:09.630 align:start position:0%
I'm sure mr. Irving will fill you in on


00:00:09.630 --> 00:00:11.030 align:start position:0%
I'm sure mr. Irving will fill you in on
the circumstances that brought us

Вы можете видеть, что каждый текст субтитров повторяется три раза. В каждой восьмой строке (3-й, 11-й, 19-й и 27-й) есть новый текст субтитров.

Это преобразует субтитры VTT в более простой формат:

sed '1,/^$/d' *.vtt| # remove the part at the top
sed 's/<[^>]*>//g'| # remove tags
awk -F. 'NR%8==1{printf"%s ",$1}NR%8==3' # print each new subtitle text and its start time without milliseconds

Вот как выглядит вывод команды выше:

00:00:01 ladies and gentlemen I'd like to thank
00:00:04 you for coming tonight especially at
00:00:05 such short notice
00:00:07 I'm sure mr. Irving will fill you in on
00:00:09 the circumstances that brought us

Это печатает закрытые титры видео в упрощенном формате:

cap()(cd /tmp;rm -f *.vtt;youtube-dl --skip-download --write-auto-sub "$1";sed '1,/^$/d' *.vtt|sed 's/<[^>]*>//g'|awk -F. 'NR%8==1{printf"%s ",$1}NR%8==3'|tee cap)

Ответ 5

Вы можете загружать потоковые субтитры с YouTube с помощью KeepSubs DownSub.

Вы можете выбрать автоматическую стенограмму или авторские теги, подписанные рядом. Он также предлагает возможность автоматического перевода английских субтитров на другие языки с помощью Google Translate.

Ответ 6

(Обязательный "это, вероятно, внутренний интерфейс youtube.com и может прерываться в любое время" )

Вместо того, чтобы ссылаться на другой инструмент, который делает это, вот ответ на вопрос "как это сделать"

Я использовал fiddler, чтобы проверить HTTP-трафик youtube.com, и есть ответ от /api/timedtext, который содержит закрытую подпись как XML.

Кажется, что ответ вроде этого:

    <p t="0" d="5430" w="1">
        <s p="2" ac="136">we&#39;ve</s>
        <s t="780" ac="252"> got</s>
    </p>
    <p t="2280" d="7170" w="1">
        <s ac="243">we&#39;re</s>
        <s t="810" ac="233"> going</s>
    </p>

означает, что время 0 - это слово we've, а в момент 0+780 - слово got, а в момент 2280+810 - слово going и т.д. Это время в миллисекундах, поэтому для времени 3090 вы хотите добавить &t=3 к URL-адресу.

Вы можете использовать любой инструмент, чтобы сшить XML в нечто читаемое, но здесь Power BI Desktop script, чтобы найти слова типа "привилегия":

let
    Source = Xml.Tables(File.Contents("C:\Download\body.xml")),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Attribute:format", Int64.Type}}),
    body = #"Changed Type"{0}[body],
    p = body{0}[p],
    #"Changed Type1" = Table.TransformColumnTypes(p,{{"Attribute:t", Int64.Type}, {"Attribute:d", Int64.Type}, {"Attribute:w", Int64.Type}, {"Attribute:a", Int64.Type}, {"Attribute:p", Int64.Type}}),
    #"Expanded s" = Table.ExpandTableColumn(#"Changed Type1", "s", {"Attribute:ac", "Attribute:p", "Attribute:t", "Element:Text"}, {"s.Attribute:ac", "s.Attribute:p", "s.Attribute:t", "s.Element:Text"}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Expanded s",{{"s.Attribute:t", Int64.Type}}),
    #"Removed Other Columns" = Table.SelectColumns(#"Changed Type2",{"s.Attribute:t", "s.Element:Text", "Attribute:t"}),
    #"Replaced Value" = Table.ReplaceValue(#"Removed Other Columns",null,0,Replacer.ReplaceValue,{"s.Attribute:t"}),
    #"Filtered Rows" = Table.SelectRows(#"Replaced Value", each [#"s.Element:Text"] <> null),
    #"Added Custom" = Table.AddColumn(#"Filtered Rows", "Time", each [#"Attribute:t"] + [#"s.Attribute:t"]),
    #"Filtered Rows1" = Table.SelectRows(#"Added Custom", each ([#"s.Element:Text"] = " privilege" or [#"s.Element:Text"] = " privileged" or [#"s.Element:Text"] = " privileges" or [#"s.Element:Text"] = "privilege" or [#"s.Element:Text"] = "privileges"))
in
    #"Filtered Rows1"

Ответ 7

Выберите Open Transcript в раскрывающемся списке ... справа от голосования вверх/вниз и обменивайтесь ссылками.

Это откроет div с прокруткой Transcript с правой стороны.

Затем вы можете использовать Copy. Обратите внимание, что вы не можете использовать Select All, но вам нужно щелкнуть верхнюю строку, затем прокрутите вниз, используя большой палец прокрутки, а затем сдвиньте его в последнюю строку.

Обратите внимание, что вы также можете выполнять поиск в этом тексте, используя обычную поисковую страницу.

Ответ 8

Существует бесплатный инструмент на языке Python, который называется YouTube transcript API

.Вы можете использовать его в скриптах или в качестве инструмента командной строки:

pip install youtube_transcript_api

Ответ 9

Я просто сделал это легко вручную, открыв стенограмму в начале видео, щелкнув левой кнопкой мыши и перетащив маркер времени 00:00 с нажатой клавишей Shift на несколько строк в начале.

Затем я продвинул видео ближе к концу. Когда видео остановилось, я щелкнул конец последнего предложения, удерживая клавишу Shift еще раз. С помощью CTRL-C я скопировал текст в буфер обмена и вставил его в редактор.

Готово!

Предостережение: убедитесь, что RDP-Windows не использует общий буфер обмена или программное обеспечение, такое как Teamviewer, запущено одновременно, так как эта процедура переполнит их буферы, где копируется большое количество текста.