От сценария до голоса в игре
Пошаговое руководство по VoiceDirector для Unreal Engine 5.5-5.8. Импортируйте реплики, записывайте или генерируйте дубли, выбирайте исполнение и публикуйте звук для игры.
Названия кнопок и полей сохранены на английском, как в интерфейсе плагина. Все действия объяснены на русском.
Что делает VoiceDirector
#VoiceDirector помогает готовить диалоги в редакторе Unreal. Вы предоставляете текст, выбираете голос или импортируете запись, слушаете результат и решаете, какой дубль попадёт в игру. Итогом становится обычный звуковой ассет Unreal SoundWave. При настройке контекстов диалога также можно получить DialogueWave.
| Вкладка | Для чего она нужна |
|---|---|
| Lines | Импорт сценария, выбор реплик, прослушивание и одобрение дублей. |
| Voices | Назначение голоса провайдера каждому персонажу и языку. |
| Jobs | Прогресс генерации и переход к новому дублю. |
| Publish | Просмотр и применение изменений звуковых ассетов игры. |
| Settings | Подключения, папка вывода, сопоставление DataTable и лимиты. |
Реплика - запись в сценарии. Вариант - эта реплика на одном языке. Дубль - одна её звуковая запись. Можно хранить несколько дублей и сравнивать их, сохраняя прежний звук в игре.
Начать можно с готового WAV. Генерация через ИИ необязательна. VoiceDirector не сочиняет диалоги, не переводит текст, не клонирует голоса и не генерирует речь во время работы игры.
Установка и первый запуск
#Создайте проект, если только знакомитесь с Unreal
- Откройте Epic Games Launcher, перейдите в Unreal Engine > Library и запустите UE 5.5, 5.6, 5.7 или 5.8.
- В окне создания проекта выберите Games > Third Person, затем Blueprint и Desktop. Blueprint - визуальная программа из соединённых узлов. Для этого руководства писать C++ не нужно.
- Задайте имя проекта и папку, где есть свободное место, нажмите Create и дождитесь загрузки редактора.
Добавьте VoiceDirector
Выберите сборку плагина под вашу версию Unreal для Windows x64. При установке через Fab добавьте плагин в нужную версию движка из библиотеки Launcher. Для установки в отдельный проект закройте редактор и поместите всю папку плагина в Plugins внутри проекта. Если этой папки нет, создайте её.
YourProject/
YourProject.uproject
Plugins/
VoiceDirector/
VoiceDirector.uplugin
Binaries/
Source/Файл описания должен находиться прямо в Plugins/VoiceDirector, без второй вложенной папки VoiceDirector. Проекту только на Blueprint нужен собранный пакет со всеми поставляемыми файлами сборки. Копия только с исходниками требует компилятора C++ и сборки.
- Снова откройте проект. Выберите Edit > Plugins, найдите VoiceDirector и включите его.
- Перезапустите редактор, если он попросит.
- Откройте Tools > VoiceDirector. В одном окне появятся пять вкладок.
Используйте одну установку: в движке либо в проекте. Две копии одного плагина могут помешать открытию проекта.
Первая реплика для игры
#В этом уроке используется готовая запись. Настраивать Kokoro или ElevenLabs пока не требуется.
Первая реплика уже готова к импорту
Одна строка CSV и настоящий WAV с фразой «Keep your voice down.» Пример озвучен локально через Kokoro. Для импорта не нужны сервер и учётная запись.
- Откройте Settings. В Output Content folder (/Game/...) укажите
/Game/VoiceDirector/Audioи нажмите Save Output Folder./Gameозначает папку Content проекта, а не диск Windows. - Скачайте оба учебных файла в обычную папку, которую легко найти.
- В Lines раскройте Import script. В поле Import SourceId укажите
MyScript, нажмите Import CSV и выберите учебный CSV. - Просмотрите изменения и нажмите Apply Import. Для этого урока оставьте Full snapshot выключенным.
- Выберите реплику
L-001с языкомen. Нажмите Import WAV и выберите учебный WAV. Справа появится карточка дубля. - Если нужно, нажмите Select take, затем Play. Прозвучит «Keep your voice down.» Кнопка Stop останавливает прослушивание.
- Нажмите Approve take. Теперь дубль одобрен; публикация выполняется отдельно.
- Откройте вкладку Publish или нажмите Review publishing. Нажмите Refresh Preview, отметьте строку нового SoundWave и нажмите Apply Selected Approved.
- Откройте нижнюю панель Content Drawer сочетанием Ctrl + Space. Перейдите в Content > VoiceDirector > Audio. Новый SoundWave готов. Далее подключите его к игре.
В узком окне раскройте Sources & filters для импорта и Take review для дублей. Проверку также можно открыть двойным щелчком по реплике.
Имя созданного ассета может начинаться с VD_ и содержать идентификатор. Это нормально. Полный путь виден в строке публикации; кнопка Copy копирует его.
Как подготовить и импортировать текст
#Напишите реплики в таблице или текстовом редакторе. VoiceDirector читает ваш текст, а не создаёт его. Сохраните CSV в UTF-8 с разделителем-запятой. Обязательные имена столбцов:
LineId,CharacterId,Culture,Text,Context
L-001,rowan,en,Keep your voice down.,At the city gate
L-002,mara,en,The gate is sealed.,Speaking calmly
| Столбец | Значение |
|---|---|
| LineId | Постоянный ID реплики, например L-001. Не меняйте его при правке текста. |
| CharacterId | Постоянный ID персонажа, например rowan. Связывает реплику с назначенным голосом. |
| Culture | Код языка, например en, fr или ru. |
| Text | Отображаемый текст реплики. Обязательное поле. |
| Context | Необязательная подсказка об исполнении или сцене. |
| SpokenText | Необязательный точный текст для озвучивания. Если пусто, используется Text. |
| SourceNamespace / SourceKey / SourceRevision | Необязательные сведения об источнике. |
Откройте Lines > Import script, задайте постоянный Import SourceId, выберите Import CSV, проверьте Added / Changed / Archived / Unchanged и нажмите Apply Import. Сам предварительный просмотр ничего не меняет.
Для обновления импортируйте сценарий снова с теми же SourceId и LineId. Идентификаторы и старые дубли сохраняются. Один LineId допустим на разных языках, но пара LineId и Culture должна быть уникальной внутри источника. Для переводов одной реплики сохраняйте того же персонажа.
Full snapshot отправляет в архив отсутствующие реплики этого источника на языках, представленных в импорте. Включайте его для полной замены соответствующей части сценария. При выключенном флажке отсутствующие строки остаются. Архивирование не удаляет записи.
Для CSV действуют пределы: 16 MiB и 10 000 строк.
Текст с запятой заключайте в двойные кавычки. Кавычка внутри ячейки записывается дважды: "Он сказал ""Стой.""". Табличный редактор обычно делает это сам. Если он выгрузил CSV с точкой с запятой, сохраните файл заново с запятыми.
Импорт из DataTable в Unreal
#DataTable - таблица со строками прямо внутри Unreal. Если сценарий уже хранится в такой таблице, выберите её в интерфейсе. CSV и ручной JSON не нужны.
- Откройте Settings и выберите ассет в Script DataTable.
- Сопоставьте столбцы с LineId, CharacterId, Culture, Text и при необходимости с Context и SpokenText. Поддерживаются типы String, Name и Text. Значение
@RowNameберёт LineId из имени строки таблицы. - Источник определяется автоматически по пути ассета DataTable. Нажмите Preview DataTable Import.
- Просмотрите изменения во вкладке Lines и нажмите Apply Import.
Создание таблицы с нуля
В Content Browser создайте Blueprint Structure. Добавьте поля String LineId, CharacterId, Culture и поля Text Text, Context, SpokenText. Сохраните структуру. Создайте Data Table, выберите эту структуру как тип строки, добавьте строку и заполните её значениями из примера выше.
В DataTable допускается не более 10 000 строк.
Плагин также предоставляет тип VoiceDirectorScriptRow для импорта в редакторе. Если таблица нужна самой упакованной игре, используйте собственную структуру, доступную во время игры. Опубликованные SoundWave являются обычными игровыми ассетами.
Назначение голоса персонажу
#Голос провайдера - готовый голос из Kokoro или ElevenLabs. Назначение в VoiceDirector связывает его с парой CharacterId + Culture. Это не создание новой голосовой модели.
- Настройте провайдера по следующим разделам.
- Откройте Voices, выберите провайдера и нажмите Check Connection / List Voices. Кнопка читает каталог без генерации речи.
- Укажите CharacterId и Culture из сценария, выберите Voice и Model, настройте доступные параметры и нажмите Save Voice Assignment.
- Вернитесь в Lines, выберите подходящий вариант и нажмите Generate new take.
Для примера: CharacterId rowan, Culture en, голос Kokoro af_heart, модель kokoro. Выбирайте голос, поддерживающий нужный язык. Для импорта WAV назначение голоса не требуется.
Изменение назначения влияет на следующую генерацию. Предыдущие дубли сохраняют исходные голоса и параметры.
Локальная генерация через Kokoro
#Kokoro-FastAPI работает отдельно на вашем компьютере либо на доступном сервере. VoiceDirector подключается к нему, но не устанавливает и не запускает сервер. Для зависимостей и моделей нужно свободное место.
- Выполните официальную инструкцию Kokoro-FastAPI v0.9.0. Для варианта Windows CPU установите необходимые компоненты, загрузите модель и запустите
.start-cpu.ps1из папки сервера. - Дождитесь запуска и загрузки модели. При стандартной локальной установке откройте в браузере
http://127.0.0.1:8880/docs, чтобы проверить ответ сервера. - В Settings плагина укажите Kokoro-FastAPI base URL:
http://127.0.0.1:8880/v1. Нажмите Save Settings. - В Voices загрузите каталог Kokoro и сохраните назначение. Начните с
af_heart, моделиkokoro, английскогоenи скорости1.0.
Скорость Kokoro доступна в диапазоне 0.5-2.0. Языки зависят от моделей и голосов сервера. Русский текст сценария и импорт русских WAV поддерживаются, но эта интеграция Kokoro не генерирует русскую речь. Для неё используйте подходящего другого провайдера или запись.
Во время генерации сервер должен работать. Уже опубликованный звук игра воспроизводит и при выключенном сервере.
Генерация через ElevenLabs
#Нужны ваша учётная запись ElevenLabs, доступные кредиты и ключ с нужными разрешениями. Запросы расходуют лимит вашей учётной записи. Перед большой очередью ознакомьтесь с текущими тарифами провайдера.
- В ElevenLabs откройте Developers > API Keys и создайте ключ. Включите Voices: Read и Text to Speech: Access. Если ключ ограничивает доступ к моделям, разрешите выбранную модель.
- В поиске меню «Пуск» Windows найдите Изменение переменных среды текущего пользователя. В разделе пользовательских переменных нажмите Создать. Имя:
VOICEDIRECTOR_ELEVENLABS_KEY. Значение: ваш ключ. Подтвердите все окна. - Полностью закройте Unreal Editor и Epic Games Launcher, включая процесс в системном трее. Откройте их заново, чтобы они получили новую переменную.
- Во вкладке Voices выберите ElevenLabs, нажмите Check Connection / List Voices и выберите доступные вашей учётной записи голос и модель.
- Сохраните назначение персонажа и языка. Сначала сгенерируйте одну короткую реплику и прослушайте результат.
Храните ключ в переменной среды. В Settings нет текстового поля для ключа. Не вставляйте его в сценарий, ассет, скриншот или сообщение в поддержку.
VoiceDirector запрашивает pcm_24000 и преобразует полученный PCM в WAV. Чтение каталога само по себе не подтверждает право генерации этого формата. Скорость доступна в диапазоне 0.7-1.2; стиль и speaker boost доступны при поддержке выбранной моделью.
Для готового ключа откройте More Actions (...) > Edit и измените права. Подробности есть в официальной инструкции по ключам. Ошибки прав, квоты или регионального доступа нужно устранить у провайдера до повторной генерации.
Генерация и очередь заданий
#- Во вкладке Lines выберите один или несколько вариантов. Для нескольких используйте Ctrl или Shift.
- Нажмите Generate selected. Проверьте подтверждение: провайдер, количество запросов, символов и доступная оценка стоимости. Подтвердите подходящую очередь.
- Во вкладке Jobs следите за прогрессом. Pause приостанавливает новые отправки, Resume продолжает их, Cancel отменяет оставшуюся очередь.
- У задания со статусом Completed нажмите Open take. Плагин откроет именно эту реплику и запись в Lines, убрав скрывающие её фильтры.
В очереди допускается не более 1 000 вариантов, в одном TTS-запросе - не более 5 000 символов.
При одном выбранном варианте кнопка называется Generate new take, при нескольких - Generate selected.
Завершённый дубль готов к проверке. Он не одобряется и не публикуется автоматически. При ошибке рядом с заданием появляется диагностика, которую можно скопировать.
UnknownRemoteOutcome означает, что отправленный запрос мог завершиться на сервере, но результат не был получен. Перед новой генерацией проверьте историю провайдера. Отмена не отзывает уже отправленный запрос.
Прослушивание и выбор дубля
#Справа у реплики показаны доступные дубли: произнесённый текст, происхождение, время, длительность и волна, рассчитанная по настоящему WAV. При выборе другой реплики открывается её история.
| Состояние | Значение |
|---|---|
| Selected | Дубль, который вы сейчас проверяете. Выбор не меняет звук в игре. |
| Approved | Исполнение, одобренное для этого варианта. |
| In game / опубликован | Дубль, записанный в игровые ассеты. Сохраняется до применения новой публикации. |
| Current / Stale / Unknown | Соответствие записи текущим известным данным. Правка текста или голоса может сделать старый дубль устаревшим. |
| Human / AI | Импорт WAV или генерация провайдером. Импортированный WAV тоже мог быть создан ИИ вне плагина. |
Нажмите Select take, затем Play или Stop. Когда исполнение подходит, нажмите Approve take. Все дубли остаются доступны для сравнения. Волна помогает увидеть речь и паузы; её масштаб подбирается для читаемости, поэтому громкость сравнивайте на слух.
Импорт своей записи
Выберите один вариант и нажмите Import WAV. Нужен RIFF WAV с порядком байтов little-endian: PCM 16 бит, 24 или 48 кГц, моно либо стерео, не более 64 MiB. MP3, WAV с плавающей точкой и PCM 24 бита предварительно преобразуйте.
В More line actions доступны блокировка, проверка перевода, переименование с сохранением ID и привязки диалога. Перед заменой одобрения разблокируйте вариант. Для нового дубля с теми же входными данными включите Create another take even if input matches.
Публикация звука в ассеты
#Публикация создаёт или обновляет ассеты Unreal из одобренных дублей. Генерация, импорт и одобрение сами по себе сохраняют прежний звук игры.
- Откройте Publish и нажмите Refresh Preview.
- Проверьте путь и действие в каждой строке. Create создаёт ассет, Update обновляет управляемый ассет, Conflict требует устранить причину.
- Отметьте одобренные строки для применения. Включите необходимые базовые SoundWave и зависимости диалога.
- Нажмите Apply Selected Approved и проверьте результат. Copy копирует путь ассета.
Плагин не перезаписывает ассеты с внешними изменениями, несохранёнными правками или доступом только для чтения. Устраните конфликт и обновите просмотр. Общей кнопки принудительной перезаписи нет. Для устаревшего одобренного дубля требуется отдельный флажок разрешения; сначала прослушайте запись и сравните её текст.
Одобренный дубль может отличаться от того, что сейчас звучит в игре. Именно Publish явно применяет изменение к игровым ассетам.
Как воспроизвести реплику в игре
#SoundWave - стандартный звуковой ассет Unreal. Для первой проверки подключите его к узлу Blueprint:
- Откройте уровень. В меню Blueprints основной панели выберите Open Level Blueprint.
- Найдите Event BeginPlay. Если узла нет, щёлкните правой кнопкой по графу и найдите его через поиск.
- Протяните соединение из белого выходного контакта исполнения, найдите Play Sound 2D и создайте узел.
- В поле Sound этого узла выберите опубликованный SoundWave из папки вывода.
- Нажмите Compile, сохраните Blueprint и уровень. Вернитесь в редактор и нажмите Play.
Реплика прозвучит при запуске уровня. Для персонажа в пространстве используйте узлы позиционного звука Unreal и свою логику разговора. VoiceDirector готовит ассеты, а игровая логика определяет момент воспроизведения.
Сохраните ссылку на опубликованный ассет в игре, чтобы он попал в сборку. Во время игры не нужны редакторные модули VoiceDirector, API-ключ и работающий сервер TTS. Подробнее: документация Epic по Play Sound 2D.
Языки и контексты диалога
#Добавьте переводы с теми же LineId и CharacterId, но другим Culture. Например, L-001,rowan,en и L-001,rowan,fr - два языковых варианта одной реплики. Подготовьте свой перевод и подходящий голос либо запись для каждого языка.
Исходный язык по умолчанию - en. Публикуйте базовый SoundWave вместе с новыми локализованными вариантами. Локализованные ассеты используют стандартную структуру Unreal /Game/L10N/<culture>/.... В игре ссылайтесь на базовый ассет, а локализацию выбирайте через активную культуру Unreal.
В Project Settings > Packaging добавьте нужные культуры в сборку и выберите соответствующие данные интернационализации. Смена языка интерфейса редактора сама по себе не настраивает язык диалогов игры.
DialogueWave
Для стандартных контекстов диалога создайте ассеты DialogueVoice говорящего и, при необходимости, слушателей. У реплики откройте More line actions, выберите Dialogue speaker, слушателей и постоянный Context key. Нажмите Save Dialogue Context и опубликуйте необходимые строки SoundWave и DialogueWave вместе.
DialogueVoice хранит сведения о персонаже в диалоге, а не голосовую модель. Поддерживается один контекст на LineId. Если нужны разные контексты разговора, используйте отдельные ID реплик.
Сбор записей от актёров
#- Подготовьте сценарий и в Settings нажмите Export Actor Manifest CSV.
- Передайте манифест исполнителю. Попросите сохранить идентификаторы и ожидаемые имена WAV, а также записать файлы в поддерживаемом формате.
- Получив записи, выберите Choose Actor Manifest и Choose Returned WAV Folder в Settings.
- Нажмите Preview Actor Matching. Проверьте готовые, отсутствующие и неоднозначные совпадения. Сначала исправьте имена или получите недостающие записи.
- Выберите нужные готовые строки и нажмите Import Selected Actor WAVs. Прослушайте, одобрите и опубликуйте записи обычным способом.
Дубли сохраняют текст того манифеста, по которому записывался актёр. Если за это время сценарий изменился, полученный дубль может стать устаревшим. Сравните произнесённые слова с текущим сценарием.
Настройки и лимиты генерации
#В Settings находятся URL Kokoro, папка вывода, сопоставление DataTable, инструменты актёрских записей и лимиты очереди. Подключение и параметры генерации сохраняйте кнопкой Save Settings, папку вывода - кнопкой Save Output Folder.
Ограничения запросов и символов помогают задать размер очереди. Для оценки в долларах самостоятельно укажите цену провайдера за 1 000 символов. Значение -1 для цены означает, что она неизвестна; -1 для бюджета отключает ограничение в долларах. Если бюджет включён, а цена неизвестна, облачная генерация блокируется до возможности расчёта.
Оценка использует введённую вами цену. Это не остаток кредитов учётной записи и не гарантия итогового списания. Учитывайте также квоту у провайдера.
Настройки являются локальными предпочтениями редактора. Для обычной работы править JSON не нужно. Пользуйтесь видимыми полями и выбором ассетов, а не редактированием внутренних записей проекта.
Сохранность данных и прерывания
#Сохраняйте резервную копию всего проекта, включая эти папки:
| Папка | Что хранится |
|---|---|
| Content/ | Опубликованные игровые ассеты и исходные DataTable. |
| VoiceDirector/ | Сценарий, история дублей и сохранённые исходные WAV. |
| Saved/VoiceDirector/ | Локальные настройки, журналы заданий и публикации, копии для восстановления. |
Сохраняйте данные дублей вместе с опубликованными ассетами. Один SoundWave не позволяет восстановить всю историю сценария и проверок.
В проект пишет только один редактор. Второй экземпляр может открыть VoiceDirector только для чтения. Закройте другой редактор и перезапустите текущий Unreal Editor, чтобы получить доступ к записи. Не удаляйте блокировку записи, пока проект используется другим процессом.
После прерывания генерации откройте Jobs. Уже отправленный запрос может иметь неизвестный результат и автоматически не повторяется. Перед новой попыткой проверьте провайдера.
Во вкладке Publish выберите Review interrupted publication для обнаруженной операции либо Restore From Publish Journal и журнал этого проекта Saved/VoiceDirector/Publish/<batch>/Journal.json. Прочитайте подтверждение перед восстановлением.
Для прерванной публикации сохраняются журнал и резервные копии. Не удаляйте их до завершения восстановления. Внешние изменения считаются конфликтами; после восстановления прежнего состояния новые ассеты могут остаться на диске для проверки. Если нужна помощь, сохраните копию проекта и передайте диагностическое сообщение в поддержку.
Если что-то не работает
#| Проблема | Что проверить |
|---|---|
| Нет окна VoiceDirector | Включите плагин через Edit > Plugins, перезапустите редактор и проверьте Tools. Сборка должна соответствовать версии UE; установлена одна копия. |
| Кнопка недоступна | Выбрана нужная реплика или дубль; нет блокировки, режима только для чтения, активного импорта или очереди. Для публикации требуется одобрение. |
| CSV не импортируется | UTF-8, запятые, точные обязательные заголовки, непустые ID и уникальные пары LineId/Culture. Прочитайте диагностику просмотра. |
| Каталог Kokoro пуст | Сервер работает; /docs отвечает; в Settings указан доступный URL с /v1 на конце. Сохраните настройки и загрузите каталог заново. |
| ElevenLabs отклоняет запрос | Переменная среды получена после перезапуска; включены Voices: Read и Text to Speech: Access; доступны модель, формат, кредиты и API провайдера. |
| Лимит скорости или HTTP 429 | Подождите указанное провайдером время, уменьшите очередь и повторите действие вручную. Не отправляйте запросы многократно подряд. |
| Нет волны или звука | Исходный WAV существует и использует поддерживаемый PCM. Проверьте устройство вывода и громкость. Отсутствующий файл восстановите из копии. |
| Неизвестный результат задания | Проверьте историю запросов провайдера до ручного создания ещё одного дубля. |
| При публикации Conflict | Прочитайте полную диагностику и путь. Устраните внешние правки, несохранённые изменения или доступ только для чтения; обновите просмотр. |
| Игра молчит | Соединены контакты исполнения Blueprint, в Sound выбран опубликованный ассет, изменения скомпилированы и сохранены, громкость слышна, ассет и нужная культура включены в сборку. |
Частые вопросы
#Нужно ли платить за первый урок?
Для импорта CSV и WAV и воспроизведения игровых ассетов учётная запись провайдера не нужна. Генерация ElevenLabs использует его кредиты и тарифы. Для локального Kokoro нужно установить сервер и скачать модели.
Откуда берутся текст и голоса?
Текст пишете или импортируете вы. Звук поступает из ваших WAV либо выбранного провайдера. VoiceDirector организует работу и хранит дубли; он не пишет сюжет и не обучает голос.
Нужны ли C++ или ручной JSON?
Обычная работа доступна в Blueprint-проекте с собранным пакетом плагина. Голоса, настройки и сопоставление DataTable выбираются через интерфейс. Сборка пакета из исходников - отдельная задача для разработчика.
Новый дубль сразу заменит звук в игре?
Нет. Сначала прослушайте его, одобрите подходящий дубль и явно примените публикацию. До этого игра использует прежний опубликованный звук.
Можно сменить язык руководства, сохранив место?
Да. Переключатель языков сохраняет текущий раздел. Названия кнопок плагина оставлены на английском, чтобы их было легко найти в редакторе.
Упакованная игра сможет генерировать новую речь?
VoiceDirector 1.0.0 - инструмент подготовки в редакторе. Игра воспроизводит опубликованные стандартные ассеты; генерация TTS во время игры не предоставляется.
Как получить помощь
#Напишите на nexusforgeuesupport@gmail.com. Укажите версии VoiceDirector и Unreal, провайдера, действия до проблемы, текст ошибки и приложите скриншот нужной вкладки.
Не присылайте API-ключи. Для проблемы с текстом или записью полезен небольшой пример, который можно передать, а не весь закрытый проект. Перед исследованием проблемы восстановления сохраните резервную копию.