Open Way | Systems | Distro | Shell | Desktop | Applications
Network | Development | Download | OfftopicКарта сайта
FreeNotesФорум POSIX.ru
На главную страницу

Субтитры к фильмам,
или как я заделался фансабером

Алексей Корельский aka snake
2006.08.19

Зачем мне это было нужно

Прежде всего, что такое фансаб и с чем его едят. Собственно его не едят — его смотрят,.. точнее читают,.. а еще точнее читают во время просмотра. Короче, фансаб это транслитерация англоязычного жаргонного словечка fansub, что означает любительские переводы фильмов оформленные в виде субтитров.

Фильм же, который я хотел посмотреть, не был дублирован и, вообще, был на японском. Да-да, это было аниме :) Три серии по 25 минут чистого времени (без начальных и конечных титров) Имелись исключительно английские субтитры «вшитые» в видео поток. Нельзя сказать, что просмотр в том виде, как есть, вызывал непреодолимые трудности, но все-таки удовольствие было не то.

Можно было поискать уже готовые русские субтитры, и таковые, как выяснилось в процессе, существовали. Однако пользы от них, было не много — перевод всех трех серий делался тремя разными людьми, и порою попадались такие перлы, что невольно возникали мысли о том, какую же траву потреблял автор сего творения. И это, не говоря о разных мелких глюках и неувязках, которые тоже имелись в изобилии.

Все это пониманию не способствовало, а вовсе даже наоборот.

Однажды раньше я уже имел опыт подобного перевода, но тогда в моем распоряжении были готовые английские субтитры. И то была сугубо разовая акция. Сейчас мне нужно было все сделать с нуля. И ситуация воспринималась, как вызов — а возможно ли вообще делать подобные вещи под линуксом? Ведь, весь софт, все описанные методики рассчитаны под виндос!

Начало работ

Для работы с субтитрами я выбрал простой текстовой формат srt. Во-первых, потому он один из самых распространенных и отлично поддерживается большинством существующих проигрывателей, во-вторых, это очень простой текстовой формат — и этим все сказано.

Что же он из себя представляет? Не мудрствуя лукаво просто взглянем на кусочек реального srt скрипта:

59
00:10:29,239 --> 00:10:34,038
[Скоро рождество!]

60
00:11:8,251 --> 00:11:10,421
А где же Ваш новый напарник? Разве он
не сегодня выходит на службу?

61
00:11:10,463 --> 00:11:13,217
Возможно он опаздывает.

Как видно, файл субтитров состоит из текстовых блоков разделенных пустой строкой. Каждый блок начинается с порядкового номера, далее следуют временные отметки начала показа реплики и конца и, собственно, сама реплика. Реплика может состоять из нескольких строк.

Казалось бы все настолько просто, что такой файл легко можно сделать вручную, но это только на первый взгляд. На самом деле, при количестве фраз более десятка, монотонно-рутинные действия по редактированию файла начинают походить на пытку. А еще, учтите, что формат srt несмотря на свою простоту не терпит технических оплошностей: все номера блоков должны идти строго по порядку, все блоки должны отделяться строго пустой строкой, перед и после значка «-->» должно стоят строго по одному пробелу, наконец, времена показа реплик не должны перекрываться, да и сами временные отметки должны строго соответствовать формату.

Налицо, необходимость «спихнуть» всю рутину на электронные плечи, а самому заняться творческой частью работы, т.е. непосредственно переводом и литературной его обработкой. Поскольку по-началу я даже не представлял с какого конца браться за дело, решил, титры для одной серии из 3-х сделать в ручном режиме. Что бы лучше понять суть происходящего.

Точнее режим был полуавтоматическим, ибо шаблон с проставленными номерами реплик, и значками «-->» я сделал при помощи простенького perl скрипта.

Самым сложным мне казалась проблема получения временных отметок. Однако, я обнаружил, что видео-редактор Avidemux2 позволяет получать требуемые отметки как раз в нужном формате — «чч:мм:сек,милисек». Единственное, для отделения дробной части секунд использовалась точка, а в srt скрипте нужна была запятая. Впрочем, это проблема легко решалась последующей обработкой полученного файла еще одним нехитрым скриптом.

Начал работу я следующим образом: запускал фильм, в нужные моменты делал паузу и вбивал перевод в подготовленный шаблон. На это уходило примерно часа 3 (для перевода 25 минутной серии) Затем, открывал тот же фильм в Avidemux2, в нужные моменты останавливал воспроизведение, выделял мышкой временную отметку в специальном окошке и вставлял ее в нужное место в подготовленном шаблоне. Благо, в XWindow для это не нужно постоянно нажимать Ctrl+c, Cntl+v, но и без этого рутинных операций было предостаточно. Для расстановки всех отметок понадобилось около 1,5 - 2 часов.

То что процесс нуждается в оптимизации, было понятно с самого начала. Постепенно оформлялись идеи как это сделать. Итак...

Анализ

Конечно же писать сразу srt скрипт не продуктивно. Я решил, что сначала следует подготовить текст субтитров в каком-нибудь еще более простом формате, а затем прогнать полученный сырой материал через скрипт, на том же perl'е, для получения готового srt файла.

По мере работы у меня оформилась мысль, что скрипт субтитров представляет из себя два синхронизированных потока информации: собственно, сами реплики и временные отметки. Если реплики, как ни верти, необходимо полностью писать вручную, то с временными отметками ситуация обстоит интереснее:

Дело в том, что этот второй поток тоже состоит из двух параллелей: отметки начала показа и конца. И эти две части неравноценны.

Поясню мысль.

Для того чтобы прочитать надпись человеку требуется некоторое время — чем длиннее надпись, тем больше времени нужно. Если вы когда-нибудь имели дело с субтитрами, то наверняка успели заметить, что, как правило, длинна фразы не превышают определенной небольшой величины. Следовательно, можно говорить, что существует какое-то желаемое время, которое титр должен присутствовать на экране. Меньше этого времени показывать фразу нежелательно (ее не успеют прочитать), больше то же не нужно (картина на экране может существенно измениться, и реплика висящая внизу будет только отвлекать) Таким образом, опираясь на это желаемое время показа можно высчитывать вторую временную отметку. При этом нужно учесть, что промежутки показа реплик не должны пересекаться.

Вобщем, все ручные действия по созданию субтитров можно свести к написанию самих реплик и заданию временных отметок начала показа реплик. Остальное можно поручить автоматике.

Процесс можно еще больше упростить, если время отсчитывать не в формате «чч:мм:сек,милисек», а в номерах кадров. Avidemux легко позволяет сделать это. Все вычисления в таком случае сведутся к элементарной арифметике.

Наконец, последний штрих — при прогоне видео для снятия времени, между моментами, когда должен был бы появиться титр, и когда я нажимал паузу, что бы снять отметку, имеется небольшой лаг. Экспериментально я установил, что у меня он равен 14 кадрам. Итоговая программа обработки должна учитывать и этот момент тоже.

Вобщем, поток временных отметок свелся к последовательности целых чисел, поток реплик — к последовательности строк текста (решил поступить именно так: одна фраза — одна строка, а там, где необходимы двух- и более строчные реплики, в месте перевода строки вставлять последовательность «\n»)

Подбор инструментов

В конечном счете я должен иметь сырой материал из двух текстовых файлов — в одном содержались реплики строго по одной на строку, во втором целые числа (номера кадров), то же по одному числу на строку. Синхронизация двух информационных потоков осуществлялось по номерам строк исходных файлов. Для работы с текстом я использовал текстовой редактор nedit с включены режимом нумерации строк, что оказалось чрезвычайно удобно. За желаемое время показа титра я принял 115 кадров.

Алгоритм обработки исходных данных оформился в следующую последовательность действий:

Написать perl скрипт реализующий все это не представляло ни какого труда. Все желающие могут ознакомиться с ним по адресу: http://swi.homeunix.org/downloads/txt2srt

Еще мне понадобились: ispell для проверки орфографии и iconv для приведения srt файла в кодировку cp1251, так уж исторически сложилось, что русские субтитры распространяются именно в ней.

Синтез

Процесс создания субтитров выглядел следующим образом:

В видео-редакторе я запускал воспроизведение фильма, в нужных местах делал паузы, по мере необходимости перематывал видео при помощи «горячих клавиш». Перевод писал в nedit'е по реплике на строку.

После я работал с текстовым материалом — вычитка, правка, переписывание отдельных фрагментов... Вобщем, нормальная творческая работа. Причем, работа не отягощенная постоянной заботой как бы не нарушить формат реплик srt фала, как бы где лишнюю строку не забыть, и как не слепить бы две реплики в одну. Т.е. по сравнению с прямым редактирование srt скрипта, лишних проблем было если не на порядок, то в разы меньше.

Когда перевод в основном был закончен, открывал тот же фильм в Avidemux'е и снимал номера кадров в местах, где должен был начаться показ реплик. При этом не осуществлялось никакой точной подгонки позиции — просто в моменты, когда необходимо вставить титр, нажималась пауза, номер кадра выделялся мышью и, как есть, вставлялся в текстовой файл. Далее, воспроизведение видео в редакторе продолжалось вплоть до момента начала следующей реплики. На процесс тайминга 25 минутного фильма уходило около 40 - 50 минут. Позже я выяснил, что если на таминг традиционными виндовыми средствами 20 - 30-ти минутного видео уходит час, то это очень хороший показатель! :)

Подготовленный текст титров проверял ispell'ом, еще раз вычитывал и «скармливал» файлы реплик и временных (точнее, кадровых) отметок самописному скрипту. Вывод этого скрипта направлял на вход iconv'а, вывод, которого уже в готовый srt файл.

Итого

Самый главный вывод из всей этой эпопеи в том, что создавать с нуля субтитры используя исключительно юниксовые средства можно. Даже не смотря на то, что специализированных средств для этого в системе нет, т.к. весь софт для подобных целей пишется исключительно под «сами знаете какую систему»

Причем, процесс протекает довольно комфортно. Конечно, понятия удобства вещь субъективная, но, согласитесь, работать неудобным инструментом так же эффективно, как и удобным (а местами и более эффективно), навряд ли возможно.

Еще один вывод, что отсутствие софта для решения специальных задач, еще не повод говорить, что эти задачи решить при помощи *nix систем невозможно.


Вы нашли отличную компанию по созданию сайтов в Обнинске!