Descargar transcripciones de YouTube generadas automáticamente

25

¿Hay alguna manera de descargar las transcripciones de YouTube generadas automáticamente sin descargar el video?

Me gustaría consultar las charlas de TED, pero tengo un ancho de banda limitado y me gustaría exportar las transcripciones automáticas (posiblemente también conocidas como subtítulos o subtítulos).

Casebash
fuente
¿Alguien sabe una manera de hacer esto para videos con subtítulos transcritos automáticamente?
Kenwarner
Relacionado (para subtítulos no generados automáticamente): webapps.stackexchange.com/questions/25072/…
Caracol mecánico
también respondió aquí: stackoverflow.com/questions/9611397/…
Tin Man
¿Hay alguna noticia sobre esto?
Leo

Respuestas:

8

Use la función "Inspector de red" del depurador de scripts de su navegador y encuentre la segunda solicitud para la página de texto cronometrado después de habilitar los subtítulos transcritos, luego copie toda esa solicitud en la barra de direcciones para descargarlos en formato xml nativo de YouTube.

Para obtener la versión SRT, ejecute este código en la consola del depurador para la página de ese 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)

También aquí está la versión bookmarklet del script:

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
fuente
6

Hay un par de formas de extraer subtítulos de un video de YouTube :

Al especificar el idioma y VideoId en esta URL genérica, http://www.youtube.com/api/timedtext?lang={LANG}&v={VIDEOID}puede obtener un .xmlarchivo que contiene los subtítulos en el idioma deseado para un video elegido.

Para deshacerse de las etiquetas dentro de ese archivo y simplemente tener la transcripción de texto plano , esto es lo que debe hacer:

  • Abre Microsoft Excel
  • Copie y pegue los subtítulos dentro de una celda
  • Presione Ctrl+H
  • En la pestaña Reemplazar, escriba <*> en el cuadro de texto "Buscar qué" y deje el cuadro de texto "Reemplazar con" en blanco, y haga clic Replace All. La expresión de búsqueda eliminará todas las etiquetas dentro del texto original.

Alternativamente, hay una herramienta de código abierto llamada Google2SRT que descarga todos los suscriptores disponibles de un video de YouTube con un solo clic y los convierte en .srtformato para que pueda usarse en reproductores multimedia como VLC Media Player.

Actualización: Ted.com ahora proporciona transcripciones de las conversaciones en su sitio.

mvark
fuente
La URL genérica no parece funcionar. Entro http://video.google.com/timedtext?lang=english&v=b11AXknrsEIpero no funciona. Además, ir a herramientas de desarrollador no ayuda. Hay toneladas de recursos allí y ninguno de ellos dice texto cronometrado.
61897
No importa, lo encontré a través de las herramientas de desarrollo. Sin embargo, todavía no puedo hacer que funcione una URL genérica. Eso sería lo más fácil.
61897
Prueba youtube.com/api/timedtext?lang= {LANG} & v = {VIDEOID}
mvark
Debo estar haciendo algo mal. Para este video , ingreso esto pero carga una página en blanco. He intentado cambiar englisha eny engpero hace lo mismo.
61897
Parece que los subtítulos se pueden recuperar solo si los subtítulos se transcriben manualmente, es decir, no se generan automáticamente. El enlace de video que compartió solo tiene subtítulos automáticos.
mvark
0

Si es su propio video, puede descargar los subtítulos desde el administrador de videos. Ir:

Administrador de video >> Editar (en el video que desea) >> Subtítulos >> (Haga clic en la pista que desea descargar) >> Acciones (cuadro desplegable)

Al momento de escribir, hay tres tipos de archivos disponibles:

  • .vtt
  • .srt
  • .sbv

Estos tienen diferentes usos en diferentes aplicaciones, pero son muy similares. SRT es probablemente el más común.

De lo contrario, si no es su video, el mejor método (único método) es obtener el archivo xml de las herramientas del desarrollador.

Usando Google Chrome en este ejemplo, navegue hasta el video y luego siga estos pasos:

  1. Pausa el video. Espere a que se reproduzca si hay un anuncio.
  2. Presione F12 en su teclado. Esto abre las herramientas de desarrollador. Puede que tenga que hacer clic en algún espacio vacío en la página para que el video no esté activo.
  3. Haga clic en la pestaña Red en las Herramientas del desarrollador.
  4. Haz clic en el ícono de transcripción justo debajo del video. Aparecerán dos elementos en la pestaña Red en las Herramientas para desarrolladores.
  5. Ambos elementos se titulan timedtext?más un montón de variables. El segundo suele ser el que desea. Comienza así:
    <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>

Este archivo xml es útil si desea utilizar la transcripción en una página web. Aparte de eso, no creo que pueda usarlo de la misma manera que usaría un archivo SRT. Si eres bueno programando, puedes escribir fácilmente un programa que lo convertirá a SRT. Escribí mi propio programa C # que extrae los datos para un propósito diferente y me llevó menos de dos horas.

61897
fuente