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).


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))})();

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.