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

  1. Крок 1: вивчаємо структурні особливості
  2. Текстова начинка
  3. субтитри
  4. додаткові ресурси
  5. Крок 2: локалізуємо текст
  6. Крок 3: синхронізуємо мова
  7. Крок 4: перемальовували текстури
  8. Крок 5: зберігаємо кодування

Якщо вибудувати всі ігри, до яких наша игроманские геймдев-студія (кодова назва 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. Ця програма корисна ще й тим, що дозволяє працювати з анімованими текстурами.

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

Якщо вибудувати всі ігри, до яких наша игроманские геймдев-студія (кодова назва Format C:) переводить моди, за складністю локалізації, то вийде приблизно такий ланцюжок

Етапи створення lip-sync в Face Poser.

Крок 5: зберігаємо кодування

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

Навіщо це потрібно?
Ось тільки що робити, якщо знадобиться трохи підправити звуковий файл (наприклад, змінити гучність в Audacity) вже після роботи в Face Poser?