Один из способов использовать нарративный движок Inkle для этапа производства закадровой озвучки.

TL;DR

— набор инструментов, которые упрощают выпуск проекта на Ink с озвученными репликами. Не привязан к конкретному игровому движку. Ссылка на GitHub github.com/wildwinter/dink

Обновление. Теперь: 

  • поддерживается экспорт в удобочитаемые версии в HTML, PDF и DOCX.

  • есть приложение-редактор для синтаксиса Dink. Оно называется Dinky. 

  • поддерживаются файлы локализации POT/PO.

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

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

Я много лет активно работаю с Ink, нарративным языком сценариев от Inkle, и для своих проектов, и для AA-проектов. Ink отлично справляется с потоком текста и логикой, собирая фрагменты истории в зависимости от выборов и состояния.

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

Поэтому в свободное время я сделал Dink как ответ на повторяющиеся раздражающие моменты, с которыми сталкивался в других решениях, и чтобы не приходилось снова и снова изобретать (своё же) колесо.

Проблема диалогов в Ink

Если вы пишете текстовое приключение, Ink подходит идеально. Но если вы делаете RPG с полной озвучкой, производственные сложности начинаются сразу.

Когда вы смотрите на обычный файл Ink, выполняющая среда видит просто текст. Он сам по себе не «знает», что первое предложение произносит главный герой, а второе — NPC. Он не понимает, что третью строку нужно перезаписать, потому что актёр проглотил слова.

На уровне выполнения задача относительно простая. Нам нужно понимать, кто произносит реплику. Окей, можно, например, просто отделять имя говорящего в начале строки:

DAVE: I am speaking this line!

Тогда у нас получается, что говорящий — DAVE, а «I am speaking this line!» — это текст для субтитров.

Но какой аудиофайл при этом использовать? А если нам нужна локализованная версия текста, как её найти?

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

  • Сколько реплик должен записать актёр, который озвучивает «Дэйва»?

  • Какие реплики уже финализированы и готовы к записи в студии, а какие всё ещё в черновике?

  • Какие реплики действительно уже записаны?

  • Какие строки нужно локализовать? Как передать контекст для локализации?

Статистика! Продюсеры обожают статистику!

И ещё: как получить сценарий для записи с контекстом и комментариями в формате, к которому привыкли студии озвучки?

Встречайте Dink (Dialogue Ink)

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

Выглядит это так:

VAR daveIsDrunk = true

=== MyScene
 #dink
 FRED (O.S.): Был холодный ноябрьский день...

Смена кадра: лодка.

FRED (O.S.): (виновато) Это не я потопил лодку.
FRED (O.S.): Это был Дэйв.

// ART: Не забыть, что у Дэйва красная шапка.
Приближение: Дэйв стоит на палубе.

// LOC: Это английская морская фраза, найдите похожий вариант.
 DAVE: Thar she blows!

DAVE: (Фреду) Как дела, Фред?

[Ужасно.]
FRED: Ужасно, просто ужасно.

[Нормально.]
FRED: Не так уж плохо, если подумать.

DAVE: Угу.

{daveIsDrunk:

Дэйв пошатываясь идёт по палубе.
DAVE: Почему лодка так крутится? // VO: Он пьян

else:

DAVE: Разве морская жизнь не прекрасна?

}

-> DONE

Это корректный Ink. DinkCompiler компилирует Ink как обычно (используя inklecate от Inkle), а затем делает дополнительную работу. Он анализирует этот сценарий и генерирует набор дополнительных метаданных для выполняющей среды и производственных документов.

Производственный слой

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

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

Данные для выполняющей среды

Он компилирует ваш Ink в JSON как обычно, но перед этим присваивает каждой строке Ink идентификатор (в виде тега Ink). Затем он генерирует файл метаданных (myproject-dink.json) с дополнительной информацией по каждой строке, например кто говорит реплику, и файл строк (myproject-strings-en-GB.json или с выбранным вами языковым кодом), где для каждой строки Ink есть соответствующая текстовая строка (её удобно локализовать).

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

Примечание: для использования в выполняющей среде — если вы работаете в Unity, вы бы использовали официальный плагин Ink для Unity, чтобы запускать скомпилированный Ink. Для Unreal — Inkpot от Ника из The Chinese Room. Для JavaScript — файл ink.js, который Inky экспортирует при сборке под веб.

Сценарий для записи

Dink экспортирует Excel-файл со всеми репликами, которые нужно записать.

Туда входят персонаж, актёр (если вы сопоставили актёров персонажам), ремарки, текст и любые комментарии. Также добавляется полезный контекст, например является ли реплика частью случайной перестановки или относится к конкретной ветке выбора.

Статусы текста и аудио

Вы можете задать для проекта статусы текста и помечать участки Ink-файла тегами вроде #ws:draft1 или #ws:final, или любыми другими, которые вам подходят. Dink отслеживает эти статусы. Например, если реплика помечена как «черновик», она пока не попадёт в сценарий для записи. И, что приятно для продюсеров, им будет видно, какие строки ещё черновые, а какие уже готовы к локализации.

Также можно настроить аудио-папки проекта, и Dink будет сканировать их на наличие аудиофайлов. Например, если он найдёт файл, имя которого совпадает с идентификатором реплики, в папке Audio/Final, он отметит статус аудио для этой реплики как «готово» в статистике. Если файл лежит в Audio/Scratch, он отметит его как «в работе». Эти статусы можно настраивать как угодно.

Статистика и аналитика

Dink генерирует таблицу статусов, где точно показано, сколько строк написано, сколько записано и сколько работы осталось по каждому актёру. Ячейки даже раскрашиваются, чтобы с первого взгляда было видно, что ещё не закрыто, и можно оценить объём строк в сценах, которые ещё даже не дошли до черновика.

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

Инструмент DinkViewer делает HTML-, PDF- и DOCX-версии сценария в дружелюбном формате, похожем на киношный сценарий, чтобы люди, не знакомые с Ink, могли спокойно прочитать, что происходит.

HTML-формат особенно полезен, потому что его можно открыть в браузере и пользоваться интерактивным поиском, чтобы находить конкретные строки по идентификатору.

Зачем это нужно?

Я сделал Dink, потому что хотел пользоваться управлением потоком в Ink, но на производственной стороне мне не хватало инструментов.

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

И я работаю над другими инструментами и утилитами, основанными на этой же идее.

Где взять инструмент

Dink — проект с открытым исходным кодом и уже доступен на GitHub. В репозитории есть компилятор, утилиты командной строки и документация по настройке конфигурационного файла.

Он собран под Mac и Windows. На Mac протестирован лучше, потому что я писал всё на нём. Если что-то ведёт себя странно, напишите об этом, заведя задачу на GitHub.

Разумеется, результаты могут отличаться — это проект для свободного времени и он заточен под то, как я использую Ink. У вас могут быть другие сценарии использования.

Если тема зацепила и хочется расти в игровых историях, начните с вступительного тестирования: 10–15 минут, и станет ясно, где пробелы и что подтянуть. Дальше можно идти на курс «Сценарист игр и нарративный дизайнер»: сцены, диалоги, связь сюжета с механиками, нарративная документация. В финале соберёте игру на Ren’Py для портфолио.

А чтобы узнать больше о формате обучения и задать вопросы экспертам, приходите на бесплатные демо-уроки:

  • 26 февраля, 20:00. «Практика на Ren’Py: делаем игру за полтора часа вместе». Записаться

  • 10 марта, 20:00. «Не сюжетом единым: реплики на фоне, звук и другие детали, которые делают историю в игре цельной». Записаться

  • 25 марта, 20:00. «Рынок вакансий глазами автора игровых историй: проекты, требования, точки входа». Записаться