Разбор и преобразование разговоров TED JSON Субтитры
Этот вопрос связан с этим другим вопросом @SuperUser.
Я хочу загрузить TED Talks и соответствующие субтитры для автономного просмотра, например, можно взять этот короткий разговор Ричарда Сент-Джона, 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 FPS= 6090 кадров.
-
startTime
начинается с 0 с duration
из 3000 = 3000
-
startTime
заканчивается на уровне 184000 с помощью duration
2000 = 186000
Также может быть полезно заметить следующий фрагмент Javascript:
introDuration:16500,
adDuration:4000,
postAdDuration:2000,
Итак, мой вопрос: какую логику я должен применять к значениям convert 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(не нужно знать длину и FPS) двумя способами:
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.
Ответы
Ответ 1
Я предполагаю, что времена в json выражаются в миллисекундах, например. 1000 = 1 секунда. Вероятно, есть основной тег, где startTime указывает время на временной шкале, на которой должен появиться субтитр, и продолжительность, вероятно, является временем, в течение которого субтитры должны оставаться в зрении. Эта теория далее подтверждается делением 186000/1000 = 186 секунд = 186/60 = 3,1 минуты = 3 минуты и 6 секунд. Остальные секунды, вероятно, являются аплодисментами;-) С помощью этой информации вы также можете вычислить, с какого кадра в какой кадр вы должны применить преобразование, т.е. Вы уже знаете, каковы частоты кадров в секунду, поэтому все, что вам нужно сделать, умножается количество секунд запуска с FPS, чтобы получить начальный кадр. Конечный кадр можно получить: (startTime + duration) * fps: -)
Ответ 2
Я сделал простую консольную программу для загрузки субтитров. Я думал сделать его доступным через Интернет, используя некоторую систему script, такую как жирная обезьяна... Вот ссылка на мой блогпост с кодом.: http://estebanordano.com.ar/ted-talks-download-subtitles/
Ответ 3
Я нашел другой сайт, который использовал этот формат. Я быстро взломал функцию, чтобы преобразовать их в 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')))
Ответ 4
TEDGrabber beta2: моя программа:
http://sourceforge.net/projects/tedgrabber/
Ответ 5
Я написал python script, который загружает любое видео TED и создает файл mkv со всеми встроенными в него субтитрами/метаданными (https://github.com/oxplot/ted2mkv).
Я использовал переменную pad_seconds
в javascript-коде на странице обсуждения TED как смещение, которое должно быть добавлено ко всем отметкам времени в файлах субтитров JSON. Я полагаю, это то, что использует флеш-плеер.