Otomatik oluşturulan YouTube transkriptlerini indirme


25

Videoyu indirmeden otomatik olarak oluşturulan YouTube transkriptlerini indirmenin bir yolu var mı?

TED görüşmelerini incelemek istiyorum, ancak bant genişliğim sınırlı ve otomatik transkriptleri (muhtemelen altyazılar veya altyazılar olarak da bilinir) vermek istiyorum.


Otomatik kopyalanan altyazılı videolar için bunu yapmanın bir yolunu bilen var mı?
kenwarner

(Non-otomatik oluşturulan altyazılar için) İlgili: webapps.stackexchange.com/questions/25072/...
Mekanik salyangoz

Ayrıca burada cevap verdi: stackoverflow.com/questions/9611397/…
Tin Man

Bununla ilgili herhangi bir haber var mı?
Leo,

Yanıtlar:


8

Tarayıcınızın komut dosyası hata ayıklayıcısının "Ağ denetçisi" işlevini kullanın ve kopyalanan altyazıları etkinleştirdikten sonra zaman çizelgesi metin sayfasına ikinci isteği bulun, sonra bunları yerel YouTube xml biçiminde indirmek için tüm istekleri adres çubuğuna kopyalayın.

SRT sürümünü almak için bu kodu, o xml sayfasının hata ayıklayıcı konsolunda çalıştırın:

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)

Ayrıca betiğin yer imi sürümü de burada:

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

Bir YouTube videosundan altyazı çıkarmanın birkaç yolu vardır -

Dili ve VideoId'yi bu genel URL'de belirterek - seçilen video için altyazıları istediğiniz dilde içeren http://www.youtube.com/api/timedtext?lang={LANG}&v={VIDEOID}bir .xmldosya alabilirsiniz .

Bu dosyadaki etiketlerden kurtulmak ve sadece düz metin transkriptine sahip olmak için yapmanız gerekenler:

  • Microsoft Excel'i aç
  • Kopyala, alt yazıları bir hücrenin içine yapıştır
  • Ctrl+ Tuşlarına basınH
  • Değiştir sekmesinde, "Bulunacak" metin kutusuna <*> yazın ve "Şununla Değiştir" metin kutusunu boş bırakın ve Tamam'ı tıklatın Replace All. Arama ifadesi, orijinal metindeki tüm etiketleri kaldıracaktır.

Alternatif olarak, Google2SRT adlı bir açık kaynak aracı var ve bir YouTube videosundan mevcut tüm alt dosyaları tek bir tıklamayla indiriyor ve .srtVLC Media Player gibi medya oynatıcılarında kullanılabilecek şekilde biçime dönüştürüyor .

Güncelleme: Ted.com şimdi kendi sitesinde görüşmelerin transkript sağlar.


Genel URL çalışmıyor gibi görünüyor. Giriyorum http://video.google.com/timedtext?lang=english&v=b11AXknrsEIama çalışmıyor. Ayrıca, geliştirici araçlarına gitmek yardımcı olmuyor. İçinde tonlarca kaynak var ve hiçbiri zaman çizelgesi yazmıyor.
61897

Boşver, aletlerle buldum. Yine de çalışmak için genel bir URL bulamıyor. Bu en kolay şey olurdu.
61897

Deneyin youtube.com/api/timedtext?lang= {lang} & v = {VideoId}
mvark

Yanlış bir şey yapıyor olmalıyım. Bu video için ben girmek bu ama boş bir sayfa yükler. Ben değişimini denedi englishetmek enve engancak aynı şeyi yapar.
61897

Altyazılar, yalnızca başlıklar el ile kopyalanırsa, yani otomatik olarak oluşturulmazsa alınabilir gibi görünüyor. Paylaştığınız video bağlantısında sadece otomatik başlıklar var.
mvark



0

Kendi videonuzsa, altyazıları video yöneticisinden indirebilirsiniz. Git:

Video Yöneticisi >> Düzenle (istediğiniz videoda) >> Başlıklar >> (indirmek istediğiniz parçaya tıklayın) >> İşlemler (açılır kutu)

Yazma sırasında üç farklı dosya tipi vardır:

  • .vtt
  • .srt
  • .sbv

Bunların farklı uygulamalarda farklı kullanımları vardır, ancak çok benzerdir. SRT muhtemelen en yaygın olanıdır.

Aksi halde, videonuz değilse, en iyi yöntem (yalnızca yöntem) xml dosyasını Geliştirici araçlarından almaktır.

Bu örnekte Google Chrome'u kullanarak videoya gidin ve aşağıdaki adımları izleyin:

  1. Videoyu duraklatın. Bir reklam varsa, oynamasını bekleyin.
  2. Klavyenizdeki F12 tuşuna basın. Bu, geliştirici araçlarını açar. Videonun aktif olmaması için sayfadaki boş bir alana tıklamanız gerekebilir.
  3. Geliştirici Araçları'ndaki Ağ sekmesine tıklayın.
  4. Videonun hemen altındaki transkript simgesini tıklayın. Geliştirici Araçları'ndaki Ağ sekmesinde iki öğe görünecektir.
  5. Her iki öğeye de timedtext?bir sürü değişken eklenmiştir. İkincisi, genellikle istediğinizdir. Bu şekilde başlar:
    <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>

Bir web sayfasında transkripti kullanmak istiyorsanız bu xml dosyası kullanışlıdır. Bunun dışında, SRT dosyasını kullandığınız gibi kullanabileceğinizi sanmıyorum. Programlamada iyiyseniz, kolayca SRT'ye çevirecek bir program yazabilirsiniz. Verileri farklı bir amaç için çıkaran kendi C # programımı yazdım ve iki saatten az sürdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.