Download de transcrições do YouTube geradas automaticamente

25

Existe uma maneira de baixar as transcrições do YouTube geradas automaticamente sem baixar o vídeo?

Gostaria de verificar as negociações do TED, mas tenho largura de banda limitada e gostaria de exportar as transcrições automáticas (também possivelmente conhecidas como legendas ou legendas).

Casebash
fonte
alguém conhece uma maneira de fazer isso em vídeos com legendas transcritas automaticamente?
Kenwarner 6/03/12
Relacionado (para legendas não geradas automaticamente): webapps.stackexchange.com/questions/25072/…
Mechanical snail
Também respondi aqui: stackoverflow.com/questions/9611397/…
Tin Man
Há alguma notícia sobre isso?
Leo

Respostas:

8

Use a função "Inspetor de rede" do depurador de scripts do seu navegador e encontre a segunda solicitação para a página de texto com horário depois de ativar as legendas transcritas. Em seguida, basta copiar todas as solicitações na barra de endereços para fazer o download no formato xml nativo do YouTube.

Para obter a versão SRT, execute este código no console do depurador para a página do 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)

Também aqui está a versão do bookmarklet do 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
fonte
6

Existem algumas maneiras de extrair legendas de um vídeo do YouTube -

Ao especificar o idioma e o VideoId nesse URL genérico - http://www.youtube.com/api/timedtext?lang={LANG}&v={VIDEOID}você pode obter um .xmlarquivo contendo as legendas no idioma desejado para o vídeo escolhido.

Para se livrar das tags contidas nesse arquivo e ter apenas a transcrição de texto sem formatação , aqui está o que você deve fazer:

  • Abra o Microsoft Excel
  • Copie e cole as legendas dentro de uma célula
  • Pressione Ctrl+H
  • Na guia substituir, digite <*> na caixa de texto "Localizar" e deixe a caixa de texto "Substituir por" em branco e clique em Replace All. A expressão de pesquisa removerá todas as tags do texto original.

Como alternativa, existe uma ferramenta de código aberto chamada Google2SRT que baixa todos os subs disponíveis de um vídeo do YouTube com um clique e os converte em .srtformato para que possa ser usado em players de mídia como o VLC Media Player.

Atualização: O Ted.com agora fornece transcrições das conversas em seu site.

mvark
fonte
O URL genérico não parece funcionar. Eu entro, http://video.google.com/timedtext?lang=english&v=b11AXknrsEImas não funciona. Além disso, acessar as ferramentas de desenvolvedor não ajuda. Há toneladas de recursos lá e nenhum deles diz que o texto está programado.
61897
Deixa pra lá, eu achei isso através das ferramentas de desenvolvimento. Ainda não é possível obter um URL genérico para funcionar. Isso seria a coisa mais fácil.
61897
Tente youtube.com/api/timedtext?lang= {LANG} & v = {videoId}
mvark
Eu devo estar fazendo algo errado. Neste vídeo , insiro isso, mas ele carrega uma página em branco. Eu tentei mudar englishpara ene, engmas faz a mesma coisa.
61897 17/03/2014
Parece que as legendas podem ser buscadas apenas se as legendas forem transcritas manualmente, ou seja, não forem geradas automaticamente. O link do vídeo que você compartilhou possui apenas legendas automáticas.
mvark
0

Se for o seu próprio vídeo, você pode baixar as legendas no gerenciador de vídeo. Vamos para:

Gerenciador de vídeos >> Editar (no vídeo que você deseja) >> Legendas >> (Clique na faixa que deseja baixar) >> Ações (caixa suspensa)

No momento da escrita, existem três tipos de arquivos disponíveis:

  • .vtt
  • .srt
  • .sbv

Eles têm usos diferentes em aplicativos diferentes, mas são muito semelhantes. SRT é provavelmente o mais comum.

Caso contrário, se não for o seu vídeo, o melhor método (único método) é obter o arquivo xml nas ferramentas do desenvolvedor.

Usando o Google Chrome neste exemplo, navegue até o vídeo e siga estas etapas:

  1. Pause o vídeo. Aguarde a reprodução, se houver um anúncio.
  2. Pressione F12 no seu teclado. Isso abre as ferramentas do desenvolvedor. Pode ser necessário clicar em algum espaço vazio da página para que o vídeo não fique ativo.
  3. Clique na guia Rede nas Ferramentas do desenvolvedor.
  4. Clique no ícone de transcrição logo abaixo do vídeo. Dois itens aparecerão na guia Rede nas Ferramentas do desenvolvedor.
  5. Ambos os itens são intitulados timedtext?mais um monte de variáveis. O segundo é tipicamente o que você deseja. Começa assim:
    <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>

Esse arquivo xml é útil se você deseja usar a transcrição em uma página da web. Fora isso, acho que você não pode usá-lo da mesma maneira que usaria um arquivo SRT. Se você é bom em programação, pode escrever facilmente um programa que o converterá em SRT. Eu escrevi meu próprio programa C # que extrai os dados para uma finalidade diferente e levou menos de duas horas.

61897
fonte