![image](https://habrastorage.org/storage2/36d/7ec/b8c/36d7ecb8cec71ad5c6b18601b87d1e6a.png)
Года 1.5-2 назад в разговоре с ID_Daemon он спросил у меня, как можно было бы сделать локализацию сериала, который очень хочет перевести. Если делать как обычно- srt субтитры, то это будет не читаемое нагромождение текста, если делать в видео редакторах таких как AE, то это будет слишком долго и времязатратно, по крайней мере для нас. Поэтому мой выбор пал на текстовые ass субтитры- что получилось, все кто хотел уже увидели, а теперь как это делалось:
Чаще всего ass субтитры используют для позиционирования текста и перевода надписей. Вот как, например, можно использовать ass субтитры:
Скрытый текст![](https://habrastorage.org/r/w1560/storage2/2ce/9a0/f5c/2ce9a0f5c09b97d2cebd16ba3830d4cf.png)
![](https://habrastorage.org/r/w1560/storage2/602/1ac/cce/6021accce996951b3cb4c79ec61c943e.png)
![](https://habrastorage.org/r/w1560/storage2/d6e/3e7/bc5/d6e3e7bc523b4d24e8d7e62f8195c3fd.png)
Жалко только, что не все переводчики заботятся о том, чтобы их субтитры визуально выглядели приятно.
![](https://habrastorage.org/storage2/2ce/9a0/f5c/2ce9a0f5c09b97d2cebd16ba3830d4cf.png)
![](https://habrastorage.org/storage2/602/1ac/cce/6021accce996951b3cb4c79ec61c943e.png)
![](https://habrastorage.org/storage2/d6e/3e7/bc5/d6e3e7bc523b4d24e8d7e62f8195c3fd.png)
Жалко только, что не все переводчики заботятся о том, чтобы их субтитры визуально выглядели приятно.
В нашем случае мы решили пойти немного дальше и перевести ими почти весь видео ряд.
Отмечу, что моя цель не пересказать faq по ass тегам или программе aegisub -«родной» программе для ass субтитров.
Если вам что-то будет не понятно, то сами faq можно найти тут: subs.com.ru/page.php?al=ssa_description (ass формат) и тут: docs.aegisub.org (aegisub)
Пока существенный минус этих факов в том, что в них очень мало примеров, а то и вовсе нет. С одной стороны понятно, что тег {b} выделит текст жирным, с другой стороны, что сделает эта строчка субтитров:
Dialogue: 0,0:04:31.75,0:04:32.25,white,,0000,0000,0000,,{\p1\pos(0,0)\clip(173,440,426,461)}m 0 0 l 800 0 l 800 600 l 0 600{\p0}
можно понять не сразу.
Итак.
Теперь переходим непосредственно к нашей работе, оригинальный кадр, который нам надо перевести выглядит так:
![](https://habrastorage.org/storage2/6de/d51/b0c/6ded51b0c83c2d37cd3366877f84ec41.png)
Для начала были созданы несколько стилей, текст в которых визуально примерно соответствовал тексту в соответствующих мессенджерах:
![](https://habrastorage.org/storage2/0d3/ab9/56a/0d3ab956affdb79333b9aa184645cf11.png)
стиль white использовался для «закрашивания» оригинального текста.
Попробуем подставить русский текст, так чтобы он соответствовал оригинальному, для этого можно подвигать его «руками», т.е. соответствующим элементом аегисаба, но проще набрать позиции на клавиатуре используя тег \pos, т.к. нужна пиксельная точность:
![](https://habrastorage.org/storage2/57b/57f/ece/57b57fece7898a8a572e7c48237dd0b4.png)
получается такая каша, но мы видим, что русский текст встал куда надо. Теперь его надо обрезать, чтобы он не вылезал за рамки, удобно это будет сделать инструментом в аегисабе, называемым «обрезать субтитры векторной областью» (тег \clip), для тех кто знаком с графическими редакторами это будет привычным делом:
![](https://habrastorage.org/storage2/911/c63/d43/911c63d430122f5318597bd3a7011a5e.png)
так же, для того, чтобы точки двигались попиксельно, стоит увеличить размер кадра до 200% или того максимума, который виден на вашем разрешении экрана.
Теперь уберём оригинальный текст в месенджерах:
![](https://habrastorage.org/storage2/835/a69/bf8/835a69bf8d138678b54a47c47e824f37.png)
Делается это в несколько этапов, разными способами, мы делали так: рисовали прямоугольник размером с весь кадр (чтобы можно было использовать везде где потребуется что-то «закрасить»):
Dialogue: 0,0:03:48.64,0:03:48.71,white,,0000,0000,0000,,{\p1}m 0 0 l 800 0 l 800 600 l 0 600{\p0}
потом этот прямоугольник обрезали.
Вроде всё, соберём все куски мозаики вместе и… ура! Мы смогли локализовать данный набор кадров:
![](https://habrastorage.org/storage2/6d1/6f0/b24/6d16f0b2427c3eb516a1460ce9990733.png)
Итоговый субтитр выглядит так:
Скрытый текст
Dialogue: 0,0:03:48.64,0:03:48.71,white,,0000,0000,0000,,{\p1\pos(0,0)\clip(m 297 358 l 540 358 540 339 779 339 778 543 297 543)}m 0 0 l 800 0 l 800 600 l 0 600{\p0}
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,351)\clip(m 297 358 l 540 358 540 339 779 339 778 543 297 543)}<coda> ну да, в общем всё правильно
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,367)}<gryffin> слушай, если хочешь чтобы они тебя приняли,
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(315,383)} придется дать мне что-то большее для начала
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,399)}<coda> да правда, особо нечего рассказывать
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,415)}<coda> в dust произошло много всякой хрени
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,431)}<gryffin> и ты обвинил в этом дро?
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,447)}<coda> в некоторых вещах, да
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,463)}<gryffin> судя по тому, что я знаю, я тебя не виню
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,479)}<gryffin> но мне нужны какие-нибудь детали, чтобы я мог
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(315,495)} его уговорить
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,511)}<coda> подожди секунду
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,527)}<gryffin> канеш
Dialogue: 0,0:03:48.64,0:03:48.71,mirc,,0000,0000,0000,,{\pos(297,543)}<coda> brb
Dialogue: 0,0:03:48.64,0:03:48.71,white,,0000,0000,0000,,{\p1\pos(0,0)\clip(282,120,510,201)}m 0 0 l 800 0 l 800 600 l 0 600{\p0}
Dialogue: 0,0:03:48.64,0:03:48.71,agent,,0000,0000,0000,,{\pos(164,134)\clip(282,119,513,201)}{\b1\c&HA00000&}alanmeans06: {\b0\c&H000404&}да
Dialogue: 0,0:03:48.64,0:03:48.71,agent,,0000,0000,0000,,{\pos(164,154)\clip(282,119,513,201)}{\b1\c&H0000A0&}brenner2604: {\b0\c&H000404&}этот засранец продолжает
Dialogue: 0,0:03:48.64,0:03:48.71,agent,,0000,0000,0000,,{\pos(164,174)\clip(282,119,513,201)}допытываться, что было между кодой и дро
Dialogue: 0,0:03:48.64,0:03:48.71,agent,,0000,0000,0000,,{\pos(164,194)\clip(282,119,513,201)}{\b1\c&HA00000&}alanmeans06: {\b0\c&H000404&}хмм
По первости на это уходило до часа, основная проблема в том, что через долю секунды весь кадр мог измениться и почти всё приходилось делать по новой, например вот что произойдёт всего через 90 миллисекунд, если не делать новые субтитры:
![](https://habrastorage.org/storage2/6b6/6da/080/6b66da080369a7c9e8fa879a0b668129.png)
т.е. в данном случае просто сдвинулось окошко аськи. А если добавляется новое сообщение в мирк, то все позиции старых сообщений надо переделывать. Правда тут мы сделали маленькую хитрость, как многие могли уже заметить, часто приходится делать ту работу, которую можно автоматизировать. Писать скрипт в lua, который понимает аегисаб, мы не стали по личным причинам :), но вот что получилось на си:
![](https://habrastorage.org/storage2/14e/ac9/0cc/14eac90ccb47b3434a6a53e4ad5b8769.png)
Простенькая программка, которая формирует «покадрово» чат, сдвигая строки вверх и добавляя новые, остаётся только сделать тайминг к ее выводу:
Скрытый текст
Dialogue: 0,0:00:00.00,0:00:00.00,Default,,0000,0000,0000,,{\p1\pos(0,0)\clip(297,340,778,543)}m 0 0 l 800 0 l 800 600 l 0 600{\p0}
Dialogue: 0,0:00:00.00,0:00:00.00,Default,,0000,0000,0000,,{\p1\pos(0,0)}m 297 340 l 778 340 l 778 543 l 297 543{\p0}
Dialogue: 0,0:00:00.00,0:00:00.00,Default,,0000,0000,0000,,{\pos(297,543)}<tefl0n> мне кажется NFO в порядке
Dialogue: 0,0:00:00.01,0:00:00.01,Default,,0000,0000,0000,,{\pos(297,527)}<tefl0n> мне кажется NFO в порядке
Dialogue: 0,0:00:00.01,0:00:00.01,Default,,0000,0000,0000,,{\pos(297,543)}<pyr0> мне тоже
Dialogue: 0,0:00:00.02,0:00:00.02,Default,,0000,0000,0000,,{\pos(297,511)}<tefl0n> мне кажется NFO в порядке
Dialogue: 0,0:00:00.02,0:00:00.02,Default,,0000,0000,0000,,{\pos(297,527)}<pyr0> мне тоже
Dialogue: 0,0:00:00.02,0:00:00.02,Default,,0000,0000,0000,,{\pos(297,543)}<slipknot> coda ты взял его?
Dialogue: 0,0:00:00.03,0:00:00.03,Default,,0000,0000,0000,,{\pos(297,495)}<tefl0n> мне кажется NFO в порядке
Dialogue: 0,0:00:00.03,0:00:00.03,Default,,0000,0000,0000,,{\pos(297,511)}<pyr0> мне тоже
Dialogue: 0,0:00:00.03,0:00:00.03,Default,,0000,0000,0000,,{\pos(297,527)}<slipknot> coda ты взял его?
Dialogue: 0,0:00:00.03,0:00:00.03,Default,,0000,0000,0000,,{\pos(297,543)}<c0da> взял
....
Набор текста в мессенджерах делали с помощью очень подходящего тега караоке- \kо, выглядело это примерно так:
![](https://habrastorage.org/storage2/dce/4ee/6a6/dce4ee6a6310e70d04bcba7bd95763b0.png)
набираемый текст в начале опускали ниже, чтобы видеть нет ли проблем в синхронности набора, потом ставили на место. Субтитр набора получился таким:
Dialogue: 0,0:21:02.27,0:21:07.41,mirc,,0000,0000,0000,,{\pos(298,593)}{\ko10}и{\ko7} {\ko7}я{\ko8} {\ko7}с{\ko10}о{\ko10}б{\ko8}и{\ko10}р{\ko8}а{\ko10}ю{\ko8}с{\ko10}ь{\ko10} {\ko10}п{\ko7}р{\ko10}о{\ko10}в{\ko10}о{\ko10}д{\ko10}и{\ko10}т{\ko7}ь{\ko10} {\ko10}м{\ko7}н{\ko10}о{\ko10}г{\ko10}о{\ko7} {\ko10}в{\ko10}р{\ko10}е{\ko10}м{\ko9}е{\ko9}н{\ko9}и{\ko9} {\ko9}с{\ko9} {\ko9}н{\ko9}и{\ko9}м{\ko9} {\ko9}э{\ko9}т{\ko9}и{\ko9}м{\ko9} {\ko9}л{\ko9}е{\ko9}т{\ko9}о{\ko9}м
В начале и конце серии текст либо появляется, либо исчезает. Эту часть мы делали так: перелив фона с чёрного на белый (но чаще всего это были другие градации цвета)
Dialogue: 0,0:00:52.76,0:02:02.43,white2,,0000,0000,0000,,{\t(0,1900,\c&FFFFFF&)\p1\clip(365,264,685,517)}m 0 0 l 800 0 l 800 600 l 0 600{\p0}
а сам текст «размывали» тегом fad.
Скрытый текст![](https://habrastorage.org/r/w1560/storage2/106/969/881/106969881bf23db2062003b5a5a46266.png)
![](https://habrastorage.org/storage2/106/969/881/106969881bf23db2062003b5a5a46266.png)
Итого много-много часов работы, 460-ти килобайтный саб и серия переведена! :) С одной стороны делать это очень муторно, с другой, в итоге получаем отличный субтитр, который приятно читать. Дальше остаётся дело за малым- «вшить» субтитры в видео, дабы у всех они выглядели так, как задумано.