10 сентября 2008
Обновлено 17.05.2023

5 шагов к локализации. Русификация модов для Half-Life 2

5 шагов к локализации. Русификация модов для Half-Life 2 - изображение обложка

Если выстроить все игры, к которым наша игроманская геймдев-студия (кодовое название Format C: ) переводит моды, по сложности локализации, то получится приблизительно такая цепочка. Проще всего (с точки зрения техники, но не времени) адаптировать на русский язык дополнения для Warcraft 3 , затем идут Max Payne 2 и Titan Quest , очень близки к ним моды для Age of Empires 3. Куда труднее локализовать дополнения для TES 4: Oblivion и модели для Neverwinter Nights 2. Но самыми сложными для перевода всегда были и остаются моды для Half-Life 2. Но не так страшен черт, как его малюют: в «Игромании» №6’2008 мы рассказали вам, как в пять этапов сделать перевод любого дополнения для Warcraft 3, сегодня же уложим на лопатки Half-Life 2.

Шаг 1: изучаем структурные особенности

С точки зрения движка Source любой мод представляет собой отдельную игру, просто «не подписанную» Valve и не запакованную в GCF-архив (в них через систему Steam распространяется цифровой контент). Структурно же любое дополнение состоит из измененных и дополнительных скриптов, звуков, текстур и карт, которые в строгой иерархии прописываются в каталоге Корневая папка Steam\SteamApps\SourceMods\название мода. Распределяются ресурсы по подпапкам этой директории следующим образом:

maps — игровые карты мода. Без них, как правило, ни один приличный мод не обходится. Карты — связующее звено всех прочих ресурсов. Логика карты может обращаться к любым звукам как напрямую, так и посредством специальных идентификаторов, аналогично с текстовыми сообщениями. Так же вызываются скриптовые сцены. В общем, карты — это «главный штаб» мода.

scenes — скриптовые (анимационные) сцены, используемые модом. Вызываются картами по требованию и сами могут обращаться к любым звуковым файлам напрямую или посредством идентификаторов.

resource — очень важный каталог, где находятся новые шрифты и текстовые ресурсы мода. Без них не будет отображаться ни один диалог или монолог.

scripts — скрипты и техническая часть мода. Здесь прописываются идентификаторы вызова и параметры всех звуковых и текстовых ресурсов.

sounds — звуковое и музыкальное сопровождение мода.

materials — текстуры.

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

Текстовая начинка

В игре полностью отсутствует функция вывода произвольного сообщения игроку. Half-Life 2 знает лишь понятия «сообщение на английском языке» (объект game_text ) и «многоязычные титры » (объект env_message ). Обычно западные мододелы не утруждают себя использованием титровых сообщений (ведь для этого необходимо прописывать дополнительную информацию в ресурсы мода) и используют упрощенный вариант — game_text. Выбор этот вполне очевиден. Для оформления такого сообщения достаточно указать в редакторе сам текст и некоторые параметры показа (цвет, положение на экране, эффекты). Вариант с env_message более громоздок. Вместо самого сообщения и горстки параметров используется лишь один идентификатор, который должен быть предварительно объявлен в файле \scripts\titles.txt в следующем формате:

$ <опция показа сообщения> <параметр 1> <параметр 2> …

< идентификатор сообщения>

{

# <название сообщения>

}

Блок под < идентификатором сообщения> (например, MAP1_MSG_0 ) не содержит текста сообщения и обращается к нему по < названию сообщения> (например, MAP1_TEXT_0 ), которое, в свою очередь, должно быть внесено в файл \resource\ <название мода>_<язык игры>.txt (например, \resource\Rock24_russian.txt ) по следующему правилу:

«lang»

{

«Language» « <язык игры>»

«Tokens»

{

« <название сообщения>» «<Текст сообщения>»

}

}

< Текст сообщения> должен быть на < языке игры>, в том числе на русском. Именно поэтому оригинальные игры от Valve используют исключительно этот объект вывода сообщений: он обеспечивает поддержку многоязычности, а следовательно, повышает ее популярность — вот почему так важно переводить все игровые элементы, в особенности те, что отображаются визуально.

Во время создания карты в редакторе Hammer объект game_text легко заменить на env_message , но после компиляции в BSP-формат внести изменения практически невозможно: все сообщения оказываются погребены под мегабайтами двоичных кодов. Как решить эту проблему, мы расскажем чуть попозже.

Субтитры

В качественной локализации должны быть качественные субтитры. С технической точки зрения они практически ничем не отличаются от текстовых сообщений. Субтитры аналогичным образом записываются в файл \resource\closecaption_ <язык игры>.txt (например, \resource\closecaption_russian.txt ), однако в остальном устроены несколько иначе. Они отображаются при воспроизведении соответствующих им звуков, этот процесс может быть запущен четырьмя способами. Во-первых, проигрывание звукового файла может быть инициировано объектом на карте, а также посредством обращения к скриптовой VCD-сцене из подпапки scenes. Во-вторых, начать проигрывание можно как прямым обращением к конкретному mp3- или wav-файлу из папки sound , так и с помощью звукового идентификатора. Такие идентификаторы должны совпадать с < названиями сообщений> из файла субтитров и помещаться в новый текстовый файл \scripts\ <звуки мода>.txt (например, \scripts\Rock24_sounds.txt ):

« <название сообщения>»

{

«wave» «*/ <подпапка в sound>/<название файла>.<mp3|wav>»

« <звуковая опция>» «<параметр>»

}

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

Файл со звуковыми идентификаторами для корректной работы, в свою очередь, должен быть зарегистрирован в файле \scripts\game_sounds_manifest.txt (это своего рода реестр всех используемых в игре звуков):

game_sounds_manifest

{

«precache_file» «scripts/ <звуки мода>.txt»

}

Итого у нас есть 4 способа проигрывания звуков, но лишь обращение к звукам по идентификаторам позволяет подключать субтитры. И, как назло, западные мододелы массово игнорируют эту возможность: англоязычным игрокам незачем читать субтитры, а остальной мир пусть учит международный язык.

Кстати, если в моде есть озвучка, то можно и вовсе обойтись без субтитров. Достаточно всего лишь наговорить весь текст, который произносят персонажи, на русском (wav- и mp3-файлы из папки sound ). Но в этом случае появится другая проблема: придется с нуля синхронизировать речь персонажей с движением их губ, а это, мягко говоря, очень непросто.

Помимо этого, многие модостроители зачастую добавляют в свои моды новые текстуры, на некоторых из них могут быть надписи. Разумеется, в хорошей локализации все они должны быть переведены. Текстуры проживают в подпапке materials и имеют формат VTF (на самом деле это обычные DDS-картинки).

Дополнительные ресурсы

Теперь, когда мы разобрали основные категории ресурсов, запутанная диаграмма становится понятной. Итак, локализация мода для Half-Life 2 состоит из четырех основных этапов: перевод сообщений, субтитров, дубляж озвучки и перерисовка текстур. Но есть еще несколько мелких, но важных моментов. Во-первых, это файл < название мода>\gameinfo.txt, который содержит название мода и имена разработчиков, отображаемые в меню Steam:

«GameInfo»

{

game « <перевод названия мода>»

developer « <название/имя разработчика>»

}

Файл редактируется любым текстовым редактором, но обязательно должен быть сохранен в юникод-формате UTF-8. Во-вторых, необходимо русифицировать файлы шрифтов \resource\*.ttf , но можно их и просто заменить другими подходящими по стилю. В-третьих, нужно позаботиться о переводе на русский язык финальных титров мода, которые находятся в текстовом файле \scripts\credits.txt (тоже в кодировке UTF-8), нас интересует блок:

«OutroCreditsNames»

{

« <строка>» «<идентификатор шрифта>»

}

< Идентификатор шрифта> дополнительно описывается в файле \resource\ClientScheme.res так:

<идентификатор шрифта>

{

«1»

{

«name» « <имя ttf-файла из \resource>»

}

}

Шаг 2: локализуем текст

Если локализовывать весь контент Half-Life 2 вручную, то на одно небольшое дополнение у вас вполне может уйти несколько месяцев кропотливой работы, да еще и в программировании придется серьезно разбираться. Чтобы облегчить себе жизнь, мы разработали набор утилит, благодаря которым некоторые рутинные действия удалось автоматизировать. Так что теперь переводить моды для игры может даже обычный человек, ничего не смыслящий в кодинге.

Главный инструмент нашего софтверного набора — программа 1CLICK_RIP. Работает она следующим образом. Перетаскиваем на исполняемый файл утилиты папку мода (да-да, просто хватаете в файловом менеджере папку мышкой и кидаете на ехе-шник) и через 10-20 секунд получаем в папке мода файл locale_text.txt , в котором содержится весь извлеченный текст и указания по его помещению в игру. Сообщения из карт и субтитры (если в моде есть звуки) достаточно разложить по нескольким ресурсным и скриптовым файлам, и все — можно приступать к переводу. Если текст сообщений из файла \resource\ <название мода>_russian.txt достаточно просто перевести на русский, то файл с субтитрами \resource\closecaption_russian.txt необходимо перекомпилировать с помощью входящего в Source SDK компилятора субтитров (он нормально работает, только если у вас установлен Orange Box или отдельно Team Fortress 2 ). К сожалению, он сложен в освоении, так что мы разработали вспомогательную утилиту RECOMPILE_CC. Перетащив на нее иконку файла с субтитрами, вы получите полностью откомпилированную версию. Главное, чтобы Steam был запущен, а в списке Current Game меню Source SDK была выбрана одна из игр, входящих в Orange Box.

В 80% случаев программы 1CLICK_RIP достаточно для извлечения всех требуемых ресурсов. Но у нее есть один минус: она не знает, что находится в звуковых файлах, и потому для всех найденных файлов создает субтитры. Разумеется, это не всегда удобно, например в случае с музыкой или различными звуками. На этот случай мы создали более продвинутый вариант утилиты извлечения, состоящий из двух частей: PROCESS_ENTS_ST1 и PROCESS_ENTS_ST2. После применения первой утилиты в папках maps , sound и scenes появляется полный список карт, звуков и сцен, которые указывают второй утилите, какие ресурсы нужно обрабатывать, а какие нет. Кроме того, в корневой папке мода появляется плейлист-файл mod_sounds.m3u. Как нетрудно догадаться, это тоже список всех звуковых файлов, но предназначенный для прослушивания в обычном музыкальном плеере. Зачем это нужно? Запуская плейлист на воспроизведение и по очереди слушая звуковые фрагменты, удаляем из списка файлы без речи, после чего сохраняем его. Теперь с помощью утилиты M3U2LIST можно легко обновить список звуков для обработки. По окончании работы второй утилиты мы получаем тот же результат, что и в случае с 1CLICK_RIP, но без лишних субтитров.

1. Исходная англоязычная дорожка для дублирования.

2. Записанная с помощью микрофона дорожка на русском языке.

3. С помощью утилиты Audacity редактируются уровни громкости русской озвучки для максимального соответствия оригиналу.

4. При необходимости выделенные фрагменты обрабатываются специальными фильтрами, например меняющими высоту голоса диктора.

5. В редакторе Face Poser работа идет на вкладке Phoneme Editor, где создается lip-sync.

6. Для наглядности выбирается модель с самыми большими губами, на ней в реальном времени проверяется адекватность мимики.

7. Синхронизация начинается с того, что модулю фонетического распознавания задается продиктованная фраза, написанная на транслите (MS Speech Engine не распознает русскую речь).

8. Опорная звуковая дорожка, по ней затем корректируется результат распознавания.

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

10. Инструмент уточняющего распознавания отдельных слов и фраз.

Шаг 3: синхронизируем речь

На время отложим в сторону комплект утилит и обратимся к проблемам дублирования. Для переозвучивания персонажей нужно совсем немного: более-менее качественный микрофон, нешумная комната и немного актерского мастерства. Кроме того, пригодится программа звукозаписи (к примеру, бесплатная Audacity ) и установленный Source SDK , из которого понадобится утилита Face Poser для синхронизации движения губ и речи героев (lip-sync). Чтобы утилита смогла распознавать фонемы, необходимо также установить MS Speech API. И если процесс переозвучивания в большей степени очевиден, то этап работы в Face Poser для многих остается темным лесом.

Записанный звуковой файл загружается в Phoneme Editor командой Load. Затем начинается расстановка фонем: выделяем небольшой законченный фрагмент речи, кликаем на нем правой кнопкой мыши и в контекстном меню выбираем пункт Redo extraction of selected words. Появляется небольшое окошко, в котором нужно задать ключевые слова выделенной фразы. Тут важен один нюанс: печатать нужно не русскую фразу, а ее транслитерацию. Например, вместо фразы «Капрал Шепард» мы пишем «kapral shepard». После расстановки фонем нужно провести корректировку: заменить ошибочно распознанные/добавить/удалить элементы. Face Poser, к сожалению, не отличается интуитивно понятным интерфейсом, поэтому этапы работы в нем наглядно проиллюстрированы на картинке. Главное, подготовьтесь морально: синхронизация — дело довольно трудоемкое, на него может уйти очень много времени.

После создания lip-sync жмем Save , и результат наших трудов прописывается в конец wav-файла. Вот только что делать, если понадобится немного подправить звуковой файл (например, изменить громкость в Audacity) уже после работы в Face Poser? Увы, после сохранения изменений данные lip-sync будут безвозвратно потеряны. Для предотвращения подобной, не побоимся этого слова, катастрофы мы разработали еще две очень полезные утилиты — EXPORT_LIPSYNC и IMPORT_LIPSYNC. Чтобы создать резервную копию синхронизации, достаточно перетащить подпапку sound на утилиту экспорта, а для восстановления — на утилиту импорта.

Шаг 4: перерисовываем текстуры

Работа с текстурами потребует наличия Photoshop или любого другого мощного графического редактора (для перерисовки изображений) и набора вспомогательных утилит и плагинов. Очень важно, чтобы была возможность легкого просмотра VTF-файлов для отбора текстур на перерисовку. В этом нам помогут VTF Shell Extensions (просмотр миниатюр в Проводнике Windows) и очень популярный скоростной просмотрщик графики IrfanView (для просмотра текстур в натуральную величину). Также необходимо установить плагин для редактирования VTF-файлов в Photoshop или средство конвертирования в один из «понятных» любому редактору формат (например, Targa ) — VTF Edit. Эта программа полезна еще и тем, что позволяет работать с анимированными текстурами.

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

Шаг 5: сохраняем кодировку

Локализация потихонечку подходит к концу. Осталось лишь разобраться, как правильно сохранять текстовые файлы в кодировке UTF-8, чтобы игра распознавала их корректно. Несмотря на то что сохранить текст в указанном формате можно и обычным «Блокнотом», игра такой файл понимать наотрез отказывается. Поэтому для работы нам понадобится текстовый перекодировщик « Штирлиц »: открываем в нем файл, переводим требуемые фрагменты на русский язык, после чего осуществляем преобразование WIN/UTF-8 и сохраняем файл с полученной «абракадаброй». Теперь игра не будет капризничать.

Комментарии
Чтобы оставить комментарий,Войдите или Зарегистрируйтесь