Один из способов использовать нарративный движок 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. «Рынок вакансий глазами автора игровых историй: проекты, требования, точки входа». Записаться
