Синтаксический анализ и преобразование субтитров TED Talks в формате JSON

StackOverflow https://stackoverflow.com/questions/1955618

Вопрос

Этот вопрос связан с этот другой вопрос @ суперпользователь.

Я хочу загрузить Выступления на TED и соответствующие субтитры для просмотра в автономном режиме, например, давайте возьмем это короткое выступление Ричарда Сент .Джон, URL-адрес загрузки видео с высоким разрешением следующий:

http://www.ted.com/talks/download/video/5118/talk/70

И соответствующие английские субтитры в кодировке JSON можно загрузить по адресу:

http://www.ted.com/talks/subtitles/id/70/lang/eng

Вот исключение из начало фактического подзаголовка:

{"captions":[{"content":"This is really a two hour presentation I give to high school students,","startTime":0,"duration":3000,"startOfParagraph":false},{"content":"cut down to three minutes.","startTime":3000,"duration":1000,"startOfParagraph":false},{"content":"And it all started one day on a plane, on my way to TED,","startTime":4000,"duration":3000,"startOfParagraph":false},{"content":"seven years ago."

И из - за конец из подзаголовка:

{"content":"Or failing that, do the eight things -- and trust me,","startTime":177000,"duration":3000,"startOfParagraph":false},{"content":"these are the big eight things that lead to success.","startTime":180000,"duration":4000,"startOfParagraph":false},{"content":"Thank you TED-sters for all your interviews!","startTime":184000,"duration":2000,"startOfParagraph":false}]}

Я хочу написать приложение, которое автоматически загружает версию видео в высоком разрешении и все доступные субтитры, но с тех пор у меня возникли серьезные трудности Я должен преобразовать субтитр в (VLC или любой другой приличный видеоплеер) совместимый формат (.srt или .sub - мой первый выбор) и я понятия не имею, что за startTime и duration ключи файла JSON представляют.

Что я знаю до сих пор, так это:

  • Загруженное видео длится в течение 3 минуты и 30 секунд, и имеет 29 КАДРОВ В секунду = 6090 кадров.
  • startTime начинается с 0 с помощью duration из 3000 = 3000
  • startTime заканчивается на отметке 184000 с помощью duration 2000 года выпуска = 186000

Возможно, также стоит обратить внимание на следующий фрагмент Javascript:

introDuration:16500,
adDuration:4000,
postAdDuration:2000,

Итак, мой вопрос в том, какую логику я должен применить к преобразовать startTime и duration значения в формате , совместимом с .srt:

1
00:01:30,200 --> 00:01:32,201
MEGA DENG COOPER MINE, INDIA

2
00:01:37,764 --> 00:01:39,039
Watch out, watch out!

Или к .sub совместимый формат:

{FRAME_FROM}{FRAME_TO}This is really a two hour presentation I give to high school students,
{FRAME_FROM}{FRAME_TO}cut down to three minutes.

Кто-нибудь может мне помочь с этим?


Нинь Буй попал в точку, формула следующая:

introDuration - adDuration + startTime ... introDuration - adDuration + startTime + duration

Этот подход позволяет мне конвертировать непосредственно в формат .srt (не нужно знать длину и частоту кадров в секунду) двумя способами:

00:00:12,500 --> 00:00:15,500
This is really a two hour presentation I give to high school students,

00:00:15,500 --> 00:00:16,500
cut down to three minutes.

И:

00:00:00,16500 --> 00:00:00,19500
And it all started one day on a plane, on my way to TED,

00:00:00,19500 --> 00:00:00,20500
seven years ago.
Это было полезно?

Решение

Мое предположение состояло бы в том, что время в json выражается в миллисекундах, например1000 = 1 секунда.Вероятно, существует maintimer, где startTime указывает время на временной шкале, в которое должен появиться субтитр, а продолжительность, вероятно, равна количеству времени, в течение которого субтитр должен оставаться в vision.Эта теория дополнительно подтверждается делением 186000/1000 = 186 секунд = 186/60 = 3,1 минуты = 3 минуты и 6 секунд.Оставшиеся секунды - это, вероятно, аплодисменты ;-) С помощью этой информации вы также сможете рассчитать, из какого кадра к какому кадру вам следует применить преобразование, т.е.вы уже знаете, сколько кадров в секунду, поэтому все, что вам нужно сделать, это умножить количество секунд начального времени на частоту кадров в секунду, чтобы получить начальный кадр.Конечный кадр может быть получен с помощью:(Время начала + длительность) * кадров в секунду :-)

Другие советы

Я создал простую консольную программу для загрузки субтитров.Я подумывал о том, чтобы сделать его доступным через Интернет, используя какую-нибудь скриптовую систему вроде grease monkey...Вот ссылка на мой пост в блоге с кодом.: http://estebanordano.com.ar/ted-talks-download-subtitles/

Я нашел другой сайт, который использовал этот формат.Я быстро взломал функцию для преобразования их в srt, которая должна быть понятна сама по себе:

import urllib2
import json

def json2srt(url, fname):
    data = json.load(urllib2.urlopen(url))['captions']

    def conv(t):
        return '%02d:%02d:%02d,%03d' % (
            t / 1000 / 60 / 60,
            t / 1000 / 60 % 60,
            t / 1000 % 60,
            t % 1000)

    with open(fname, 'wb') as fhandle:
        for i, item in enumerate(data):
            fhandle.write('%d\n%s --> %s\n%s\n\n' %
                (i,
                 conv(item['startTime']),
                 conv(item['startTime'] + item['duration'] - 1),
                 item['content'].encode('utf8')))

TEDGrabber бета2 :моя программа :http://sourceforge.net/projects/tedgrabber/

Я написал скрипт на python, который загружает любое видео TED и создает mkv-файл со всеми встроенными в него субтитрами / метаданными ( https://github.com/oxplot/ted2mkv ).

Я использовал переменную pad_seconds в коде javascript страницы выступления TED в качестве смещения, которое должно быть добавлено ко всем временным меткам в файлах субтитров JSON.Я полагаю, это то, что использует flash Player.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top