Pobieranie automatycznie generowanych transkrypcji z YouTube

25

Czy istnieje sposób na pobranie automatycznie wygenerowanych transkrypcji z YouTube bez pobierania wideo?

Chciałbym sprawdzić wykłady TED, ale mam ograniczoną przepustowość i chciałbym wyeksportować automatyczne transkrypcje (znane również jako napisy lub napisy).

Casebash
źródło
ktoś wie, jak to zrobić w przypadku filmów z automatycznie transkrybowanymi napisami?
kenwarner,
Powiązane (w przypadku napisów nie generowanych automatycznie): webapps.stackexchange.com/questions/25072/…
Mechanical snail
odpowiedział także tutaj: stackoverflow.com/questions/9611397/…
Tin Man
Czy są jakieś wiadomości na ten temat?
Leo,

Odpowiedzi:

8

Użyj funkcji „Inspektora sieci” debuggera skryptów przeglądarki i znajdź drugie żądanie na stronie timedtext po włączeniu transkrypcji napisów, a następnie po prostu skopiuj wszystkie te żądania na pasek adresu, aby pobrać je w natywnym formacie xml YouTube.

Aby uzyskać wersję SRT, uruchom ten kod w konsoli debuggera dla tej strony xml:

function makeTimeline (time) {
    var string, time_array = [], milliseconds = Math.round(time % 1 * 1000).toString();

    while (3 > milliseconds.length) {
        milliseconds = '0' + milliseconds;
    }

    time_array.push(Math.floor(time / (60 * 60)));
    time_array.push(Math.floor((time - (time_array[0] * 60 * 60)) / 60));
    time_array.push(Math.floor(time - ((time_array[1] * 60) + (time_array[0] * 60 * 60))));

    for (var i = 0, il = time_array.length; i < il; i++) {
        string = '' + time_array[i];
        if (1 === string.length) {
            time_array[i] = '0' + string;
        }
    }
    return time_array.join(':') + ',' + milliseconds;
};

function returnSRT (data) {
    var caption, previous_start, start, end, temp, captions = data.getElementsByTagName('text'), srt_output = '';

    for (var i = 0, il = captions.length; i < il; i++) {
        caption = captions[i];
        start = +caption.getAttribute('start');

        if (0 <= previous_start) {
            temp = captions[i - 1].textContent.replace(/</g, '&lt;').replace(/>/g, '&gt;');
            srt_output += i + '\n' + makeTimeline(previous_start) + ' --> ' + makeTimeline(start) + '\n' + temp + '\n\n';
            previous_start = -1;
        }

        if ( end = +caption.getAttribute('dur'))
            end = start + end;
        else {
            if (captions[i + 1]) {
                previous_start = start;
                continue;
            }
        }

        temp = caption.textContent.replace(/</g, '&lt;').replace(/>/g, '&gt;');
        srt_output += i + '\n' + makeTimeline(start) + ' --> ' + makeTimeline(end) + '\n' + temp + '\n\n';
    };
    return srt_output;
}

returnSRT(document.documentElement)

Również tutaj jest skryptowa wersja skryptu:

javascript:(function(){function%20makeTimeline(time)%7Bvar%20string%2Ctime_array%3D%5B%5D%2Cmilliseconds%3DMath.round(time%251*1000).toString()%3Bwhile(3%3Emilliseconds.length)%7Bmilliseconds%3D'0'%2Bmilliseconds%3B%7Dtime_array.push(Math.floor(time%2F(60*60)))%3Btime_array.push(Math.floor((time-(time_array%5B0%5D*60*60))%2F60))%3Btime_array.push(Math.floor(time-((time_array%5B1%5D*60)%2B(time_array%5B0%5D*60*60))))%3Bfor(var%20i%3D0%2Cil%3Dtime_array.length%3Bi%3Cil%3Bi%2B%2B)%7Bstring%3D''%2Btime_array%5Bi%5D%3Bif(1%3D%3D%3Dstring.length)%7Btime_array%5Bi%5D%3D'0'%2Bstring%3B%7D%7Dreturn%20time_array.join('%3A')%2B'%2C'%2Bmilliseconds%3B%7D%3Bfunction%20returnSRT(data)%7Bvar%20caption%2Cprevious_start%2Cstart%2Cend%2Ctemp%2Ccaptions%3Ddata.getElementsByTagName('text')%2Csrt_output%3D''%3Bfor(var%20i%3D0%2Cil%3Dcaptions.length%3Bi%3Cil%3Bi%2B%2B)%7Bcaption%3Dcaptions%5Bi%5D%3Bstart%3D%2Bcaption.getAttribute('start')%3Bif(0%3C%3Dprevious_start)%7Btemp%3Dcaptions%5Bi-1%5D.textContent.replace(%2F%3C%2Fg%2C'%26lt%3B').replace(%2F%3E%2Fg%2C'%26gt%3B')%3Bsrt_output%2B%3Di%2B'%5Cn'%2BmakeTimeline(previous_start)%2B'%20--%3E%20'%2BmakeTimeline(start)%2B'%5Cn'%2Btemp%2B'%5Cn%5Cn'%3Bprevious_start%3D-1%3B%7Dif(end%3D%2Bcaption.getAttribute('dur'))end%3Dstart%2Bend%3Belse%7Bif(captions%5Bi%2B1%5D)%7Bprevious_start%3Dstart%3Bcontinue%3B%7D%7Dtemp%3Dcaption.textContent.replace(%2F%3C%2Fg%2C'%26lt%3B').replace(%2F%3E%2Fg%2C'%26gt%3B')%3Bsrt_output%2B%3Di%2B'%5Cn'%2BmakeTimeline(start)%2B'%20--%3E%20'%2BmakeTimeline(end)%2B'%5Cn'%2Btemp%2B'%5Cn%5Cn'%3B%7D%3Breturn%20srt_output%3B%7Dwindow.location.href%3D'data%3Atext%2Fplain%3Bbase64%2C'%2Bbtoa(returnSRT(document.documentElement))})();
DitherSky
źródło
6

Istnieje kilka sposobów na wyodrębnienie napisów z filmu na YouTube -

Określając język i VideoId w tym ogólnym adresie URL - http://www.youtube.com/api/timedtext?lang={LANG}&v={VIDEOID}możesz uzyskać .xmlplik zawierający napisy w wybranym języku dla wybranego filmu.

Aby pozbyć się znaczników w tym pliku i po prostu mieć transkrypcję zwykłego tekstu , oto co musisz zrobić:

  • Otwórz Microsoft Excel
  • Skopiuj wklej napisy do jednej komórki
  • Naciśnij Ctrl+H
  • W zakładce zamień wpisz <*> w polu tekstowym „Znajdź co”, pozostaw puste pole „Zamień na” i kliknij Replace All. Wyszukiwane wyrażenie usunie wszystkie tagi z oryginalnego tekstu.

Alternatywnie istnieje narzędzie typu open source o nazwie Google2SRT, które pobiera wszystkie dostępne subskrybcje z filmu na YouTube za pomocą jednego kliknięcia i konwertuje je do .srtformatu, dzięki czemu można go używać w odtwarzaczach multimedialnych, takich jak VLC Media Player.

Aktualizacja: Ted.com udostępnia teraz transkrypcje rozmów na swojej stronie.

mvark
źródło
Ogólny adres URL nie działa. Wchodzę, http://video.google.com/timedtext?lang=english&v=b11AXknrsEIale to nie działa. Również przejście do narzędzi programistycznych nie pomaga. Jest tam mnóstwo zasobów i żaden z nich nie mówi timedtext.
61897
Nieważne, znalazłem to za pomocą narzędzi programistycznych. Nadal nie mogę uzyskać ogólnego adresu URL do działania. To byłoby najłatwiejsze.
61897
Spróbuj youtube.com/api/timedtext?lang= {LANG} & v = {VIDEOID}
mvark
Muszę robić coś złego. W tym filmie wprowadzam to, ale ładuje pustą stronę. Próbowałem zmianę englishcelu en, a engjednak to nie to samo.
61897,
Wygląda na to, że napisy można pobrać tylko wtedy, gdy podpisy są transkrybowane ręcznie, tj. Nie są generowane automatycznie. Udostępniony link do filmu ma tylko automatyczne napisy.
mvark,
0

Jeśli to Twój film, możesz pobrać napisy z menedżera filmów. Iść do:

Menedżer filmów >> Edytuj (w wybranym wideo) >> Napisy >> (Kliknij ścieżkę, którą chcesz pobrać) >> Działania (menu rozwijane)

W chwili pisania tego tekstu dostępne są trzy typy plików:

  • .vtt
  • .srt
  • .sbv

Mają różne zastosowania w różnych aplikacjach, ale są bardzo podobne. SRT jest prawdopodobnie najczęstszym.

W przeciwnym razie, jeśli nie jest to Twój film, najlepszą metodą (jedyną metodą) jest pobranie pliku xml z narzędzi programistycznych.

Korzystając z Google Chrome w tym przykładzie, przejdź do filmu, a następnie wykonaj następujące kroki:

  1. Zatrzymaj wideo. Poczekaj, aż gra, jeśli jest reklama.
  2. Naciśnij klawisz F12 na klawiaturze. Otwiera to narzędzia programistyczne. Może być konieczne kliknięcie pustego miejsca na stronie, aby wideo nie było aktywne.
  3. Kliknij kartę Sieć w Narzędziach programisty.
  4. Kliknij ikonę transkrypcji tuż pod filmem. Dwa elementy pojawią się na karcie Sieć w Narzędziach programisty.
  5. Oba elementy są zatytułowane timedtext?plus kilka zmiennych. Drugi to zazwyczaj ten, który chcesz. Zaczyna się tak:
    <transcript> <text start="4.14" dur="3.049">my name is doctor john rush</text> <text start="7.189" dur="3.731">I'm the CEO and president</text>

Ten plik XML jest przydatny, jeśli chcesz użyć transkrypcji na stronie internetowej. Poza tym nie sądzę, że można go używać w taki sam sposób, jak w przypadku pliku SRT. Jeśli jesteś dobry w programowaniu, możesz łatwo napisać program, który przekonwertuje go na SRT. Napisałem własny program C #, który wyodrębnia dane w innym celu i zajęło to mniej niż dwie godziny.

61897
źródło