Что делает LLM в конвейере создания видео
Если вы создаете рабочий процесс API LLM для сценариев NSFW, первым делом нужно определить разделение труда. Языковая модель пишет. Отдельная видео-модель, редактор или съемка создают материал. Этот сервис предлагает только первую часть: одну модель с открытыми весами, настроенную на ответы без отказов по контенту для законного использования взрослыми, через эндпоинт, совместимый с OpenAI. Она не рендерит кадры, не синтезирует голос и не создает изображения, а также не предоставляет эмбеддинги или дообучение.
Это покрывает большую часть работы над проектом для взрослой аудитории, например, художественной литературой, ролевыми играми и повествованием в стиле компаньона. Модель может набросать синопсис, разбить его на сцены, написать диалоги и повествование, составить раскадровку и сформулировать промпты для любого видеоинструмента, который вы используете далее. Страница NSFW-конвейеров описывает, как этот текстовый этап подключается к остальной части стека.
Одно правило фиксировано и применяется к каждому запросу: нет сексуального контента с участием несовершеннолетних. Настройте системный промпт так, чтобы каждый персонаж был взрослым, и воспринимайте это как требование проекта, а не как второстепенную деталь.
Конвейер из четырех этапов
Рабочий процесс сценария лучше всего работает, когда каждый вызов выполняет одну задачу и передает структурированный результат следующему. Практичная схема выглядит так:
- Библия сюжета. Один документ с персонажами (все взрослые), сеттингом, тоном и повторяющимися деталями. Вы пишете его один раз и отправляете с каждым вызовом.
- План. Один запрос превращает предпосылку в 8–15 кратких описаний сцен.
- Сценарии сцен. Один запрос на каждый этап создаёт диалоги, описания действий и закадровый текст, используя «библию» и предыдущую сцену для сохранения непрерывности.
- Список кадров и промпты. Финальный запрос по каждой сцене возвращает JSON: кадры, длительность, режиссёрские заметки и строку промпта для вашего видеоинструмента.
Разделение таким образом обеспечивает краткость результатов, что упрощает их проверку и снижает стоимость повторной генерации, если результат вам не нравится. Кроме того, сбой одного вызова затрагивает только одну сцену, а не весь сценарий.
Системный промпт, задающий правила
Системный промпт — это место, где задаются тон, формат и ограничения. Модель без механизма отказа всё равно следует инструкциям, поэтому качество вашего промпта определяет качество сценария. Будьте конкретны в описании жанра, точки зрения и того, что следует исключить. Вот отправная точка для художественного текста, рассчитанного на взрослую аудиторию:
SYSTEM = '''You are a screenwriter for adult-audience fiction videos.
All characters are adults aged 25 or older, and you state each age in the character sheet.
Write in present tense, third person, with short visual action lines.
Keep dialogue natural and under 25 words per line.
Build tension and character through setting, glances and subtext.
Never include minors in any role or reference.
Follow the story bible exactly; do not change names, ages or relationships.
When asked for JSON, return only the JSON object.'''
Настраивайте его для каждого проекта. Детектив в стиле нуар и романтическая комедия требуют разных инструкций, и однострочный пример стиля внутри промпта часто направляет модель лучше, чем абзац прилагательных.
Генерация списка сцен в JSON-режиме
На этапе создания списка съёмочных эпизодов вам нужен вывод, который может прочитать код. JSON-режим обеспечивает корректный объект. Передайте response_format={"type": "json_object"}, укажите ключи в промпте и установите temperature низким. Этот пример использует пакет Python openai с базовым URL этого сайта и идентификатором модели uncensored.
import json, os
from openai import OpenAI
client = OpenAI(
base_url="https://api.nsfwvideogenerator.cc/v1",
api_key=os.environ["NOTRACK_API_KEY"],
)
SYSTEM = open("system_prompt.txt").read()
BIBLE = open("story_bible.txt").read()
def shot_list(scene_text):
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": (
"Story bible:\n" + BIBLE +
"\n\nScene script:\n" + scene_text +
"\n\nReturn a JSON object with key 'shots': a list of objects with "
"'number', 'seconds', 'camera', 'action' and 'video_prompt'."
)},
],
response_format={"type": "json_object"},
temperature=0.3,
seed=7,
)
data = json.loads(resp.choices[0].message.content)
return data["shots"]
for shot in shot_list(open("scene_03.txt").read()):
print(shot["number"], shot["seconds"], shot["video_prompt"])
Проверяйте результат, прежде чем передавать его дальше. Убедитесь, что существует shots, что seconds является числом, а строки промптов не пусты. Если парсинг не удался, повторите попытку один раз. Отказанные или ошибочные запросы не оплачиваются, поэтому повторная попытка не стоит дополнительных денег за ошибочный вызов.
Настройки, важные для творческого текста
Разным этапам нужны разные настройки, и API передает обычные параметры: temperature, top_p, stop, seed, а также штрафы за частоту и присутствие.
- Планы и диалоги: temperature 0.8–1.0 для разнообразия. Сгенерируйте два-три варианта и выберите один.
- Раскадровки: temperature 0,2–0,3, а также фиксированный
seed, чтобы повторный запуск того же ввода был сопоставим. - Повторение: длинные сцены иногда зацикливаются на одной фразе. Небольшой штраф за частоту, например 0,3, помогает.
- Контроль длины:
max_tokensнеобязателен, но ограничение в 800 токенов для сцены обеспечивает компактность вывода. Последовательностьstop, например"END SCENE", позволяет завершить вывод при появлении маркера, который вы просите модель написать. - Потоковая передача: включите
stream: true, если автор наблюдает вывод в реальном времени. Помните, что поток удерживает слот параллельных запросов до завершения.
В быстром старте перечислены все поддерживаемые параметры, а эндпоинты — это POST /v1/chat/completions и GET /v1/models.
Использование контекстного окна 100k для непрерывности
Нарушение непрерывности — обычная проблема при генерации сценариев: меняется имя, «уплывает» возраст, исчезает реквизит. Контекстное окно составляет 100 000 токенов (промпт плюс ответ модели), что достаточно, чтобы поместить в каждый запрос всю «библию» истории, план и несколько готовых сцен. Вам не нужна система поиска по базе данных для проекта такого масштаба. Просто вставьте факты и позвольте модели читать их каждый раз.
Контекст не бесплатен, но он дешев. Предположим, что ваша библия и план занимают 20 000 токенов, а вы пишете 50 сцен, каждый вызов возвращает около 600 токенов:
- Вход: 50 x 20 000 = 1 000 000 токенов x $0,15 за 1 млн = $0,15
- Выход: 50 x 600 = 30 000 токенов x $0,50 за 1 млн = $0,015
- Итого: $0,165 за все 50 сцен
Добавьте проход по списку кадров для тех же 50 сцен с вводом 3 000 токенов и выводом 500 токенов: ввод 150 000 токенов стоит $0,0225, а вывод 25 000 токенов — $0,0125, итого ещё $0,035. Полный сценарий и списки кадров обойдутся примерно в $0,20, что меньше пробного баланса в $0,50, который вы можете получить на странице API-ключа.
Имейте в виду, что окно должно содержать как промпт, так и ответ. Библия на 20 000 токенов оставляет много места, но промпт на 95 000 токенов оставляет мало места для токенов завершения.
Проверка и исправление вывода
Относитесь к каждой сгенерированной сцене как к черновому варианту. Три проверки позволяют выявить большинство проблем до передачи их в видеоредактор. Во-первых, запустите проверку на согласованность: отправьте готовый сценарий обратно вместе с «библией» сюжета и попросите модель перечислить все места, где имя, возраст, локация или хронология расходятся. Второй вызов с низкой температурой стоит недорого и часто выявляет расхождения, которые вы могли пропустить визуально. Во-вторых, прочитайте диалоги вслух. Строки, которые хорошо смотрятся на экране, могут быть неуклюжими при озвучивании, и актёр озвучки или инструмент синтеза речи сразу это выявят. В-третьих, убедитесь, что длительность кадров соответствует запланированной длине. Модели неточны в арифметике, поэтому складывайте поля seconds в коде, а не доверяйте итогу, написанному моделью.
Когда сцена не соответствует требованиям, сопротивляйтесь желанию переписать весь системный промпт. Добавьте одну корректирующую инструкцию в сообщение пользователя, например «короче описания действий» или «больше диалогов, меньше описаний», и перегенерируйте только эту сцену. Сохранение библии и системного промпта неизменными при изменении одной инструкции за раз позволяет понять, какое изменение помогло. Параметр seed полезен здесь, потому что фиксированное seed с небольшим редактированием промпта изолирует эффект редактирования.
Ограничения, честность и следующие шаги
Несколько простых ограничений перед началом работы. Модель работает только с текстом, поэтому каждый видеоролик, каждое изображение и каждая аудиодорожка должны создаваться другими инструментами. Это одна модель с открытыми весами от независимого провайдера, и это не официальный API ни одного крупного вендора. Качество зависит от промпта, поэтому планируйте проверку сценария человеком; относитесь к выводу как к черновому варианту.
Что касается пропускной способности, полный ключ позволяет 8 параллельных запросов и 300 в минуту, а пробный ключ — 2 и 60. Если вы пишете сцены параллельно, настройте пул воркеров соответственно. 429 с rate_limited или concurrency означает замедление; один с заголовком Retry-After: 5 означает, что сервис временно перегружен, поэтому подождите пять секунд и попробуйте снова. Промпты не используются для обучения.
Платный баланс начинается с пополнения на $20, любой целой суммой до $500, с +5% от $50, +10% от $100 и +15% от $200. Оплата только криптовалютой, USDT в сети TRC20 или USDC в сети Base, и кредит не сгорает. Текущие условия указаны на странице тарифов. Для проекта, подобного описанному выше, $20 покрывает десятки полных сценариев.
