Faceless-канал на API: ролик 15 секунд за $0.30
Один ключ и четыре шага: сценарий, три клипа по 5 секунд, склейка ffmpeg. 15 секунд вертикального видео за $0.3009 и 260 секунд — и три места, где всё ломается.
Вертикальный ролик на 15 секунд, от сценария до склеенного файла, стоил $0.3009 и занял 260 секунд. Четыре шага, один API-ключ, около шестидесяти строк Python. Интересно здесь не то, что это работает, а то, какие три части ломаются, когда вы пробуете делать так каждый день.
Что получаем: 15 с вертикального 9:16 MP4, 496x864, H.264 + AAC
Шаги: 1 чат-вызов -> 3 видеозадачи (параллельно) -> склейка ffmpeg
Время: 5.7 с сценарий + 254.7 с клипы (параллельно) + 0.05 с склейка = 260.4 с
Стоимость: $0.30 видео + $0.0009 сценарий = $0.3009
На 60 с: около $1.20 генерации при тех же настройках
Не включено: озвучка (TTS на этом эндпоинте нет), музыка, субтитры, контроль
Измерено: 2026-08-24, один сквозной прогон
Обновлено 2026-08-24. Цены — ставки с карточек моделей ofox на эту дату, причём на Seedance 2.0 Mini действовала скидка 50%, так что перед тем как экстраполировать месячный бюджет, посмотрите страницу.
Сколько на самом деле стоит faceless-пайплайн
Тридцать центов за пятнадцать секунд, а модель сценария — погрешность округления.
| Шаг | Модель / инструмент | Время | Списано |
|---|---|---|---|
| Раскадровка | deepseek/deepseek-v4-flash-0731 | 5.7 с | ~$0.0009 |
| 3 клипа по 5 с, 480p 9:16 | bytedance/seedance-2.0-mini | 254.7 с реального времени | $0.30 |
| Склейка | ffmpeg concat, копирование потоков | 0.05 с | $0 |
| Итого | 260.4 с | $0.3009 |
Вызов сценария потратил 317 входных и 572 выходных токена, из них 349 — токены рассуждения, по $0.44 и $1.32 за миллион. Все текстовые решения в этом пайплайне на практике бесплатны. Счёт — это целиком видео, и он масштабируется секундами материала, поэтому единственный значимый рычаг — сколько секунд вы генерируете и в каком разрешении.
По ставкам Seedance 2.0 Mini — $0.02 за секунду в 480p и $0.04 в 720p — ежедневный ролик на 60 секунд стоит около $1.20 в день в 480p и $2.40 в 720p. Год ежедневного канала — это $438 генерации в 480p и $876 в 720p. Спорить нужно с этим числом, а не с ценой одного клипа.
Шаг 1: как превратить нишу в раскадровку
Один чат-вызов в режиме JSON, и всю работу делает схема в системном промпте.
import json, requests
BASE = "https://api.ofox.ai/v1"
H = {"Authorization": "Bearer YOUR_OFOX_API_KEY"}
SYS = (
"You write shot lists for faceless vertical short-form video. Reply with JSON only: "
'{"title": str, "hook": str, "shots": [{"n": int, "narration": str, "video_prompt": str}]}. '
"Exactly 3 shots. Each narration is one sentence a narrator reads in about 5 seconds. "
"Each video_prompt describes a single continuous 5-second shot with camera movement, "
"no on-screen text, no people, no watermark, vertical framing."
)
r = requests.post(f"{BASE}/chat/completions", headers=H, json={
"model": "deepseek/deepseek-v4-flash-0731",
"messages": [{"role": "system", "content": SYS},
{"role": "user", "content": "Niche: strange facts about deep-sea creatures. "
"Audience: TikTok, 15 seconds total."}],
"response_format": {"type": "json_object"},
"temperature": 0.7,
})
script = json.loads(r.json()["choices"][0]["message"]["content"])
Что вернулось дословно, за 5.7 секунды:
{"title": "Deep Sea Oddities",
"hook": "You won't believe what lives in the deep sea.",
"shots": [
{"n": 1, "narration": "The anglerfish lures prey with a glowing light attached to its head.",
"video_prompt": "Slow push-in on a bioluminescent anglerfish in the dark deep sea, its glowing lure bobbing gently, marine snow drifting through the beam, vertical framing."},
{"n": 2, "narration": "The barreleye fish has a transparent head to see through its own skull.",
"video_prompt": "Side tracking shot of a barreleye fish with a transparent head, its green eyes visible inside, floating in a dark blue abyss, subtle light from above, vertical framing."}]}
Две детали стоит перенять. Поле n у каждого кадра позволяет называть файлы shot1.mp4, не полагаясь на то, что порядок массива переживёт параллельный map. А отрицания, вынесенные в системный промпт — без текста в кадре, без людей, без вотермарки, — попадают во все три видеопромпта без повторов; сам формат ответа описан в руководстве DeepSeek по JSON-режиму.
Строки закадрового текста — единственная часть, которой пока некуда идти. Запомните это.
Шаг 2: как генерировать клипы параллельно
Отправьте все три и ждите один раз. Видеоэндпоинт асинхронный, так что пул потоков поверх «отправить и опрашивать» — это весь приём.
from concurrent.futures import ThreadPoolExecutor
import time
TERMINAL = {"completed", "failed", "cancelled", "expired"}
def make_clip(shot):
job = requests.post(f"{BASE}/videos", headers=H, json={
"model": "bytedance/seedance-2.0-mini",
"prompt": shot["video_prompt"] + " Vertical 9:16 framing. No text, no watermark.",
"duration": 5, "resolution": "480p", "aspect_ratio": "9:16",
}).json() # 202 + id + polling_url
while True:
s = requests.get(job["polling_url"], headers=H).json()
if s["status"] in TERMINAL:
break
time.sleep(3)
open(f"shot{shot['n']}.mp4", "wb").write(requests.get(s["unsigned_urls"][0]).content)
return s["usage"] # {'video_seconds': 5, 'video_cost': '0.1000000000'}
with ThreadPoolExecutor(max_workers=3) as ex:
usages = list(ex.map(make_clip, script["shots"]))

Клипы завершились на 85.1, 126.7 и 253.2 секунде. Та же модель, та же длительность, то же разрешение, отправлены в одну и ту же секунду. Параллельно это 254.7 секунды против 465.0 последовательно, то есть пул сэкономил около 45% времени, а темп всё равно задал самый медленный клип.
Скачивайте файл в том же воркере, который увидел completed. Адрес unsigned_urls подписан на 24 часа, и запасной копии для этой модели нет. Остальные асинхронные ловушки собраны в нашем разборе поллинга видео.
Шаг 3: как склеить клипы
ffmpeg concat с копированием потоков, и только если клипы совпадают.
printf "file 'shot1.mp4'\nfile 'shot2.mp4'\nfile 'shot3.mp4'\n" > list.txt
ffmpeg -y -f concat -safe 0 -i list.txt -c copy short.mp4
Это заняло 0.05 секунды и дало файл на 15.296 секунды, 496x864, 4.4 МБ. Копирование потоков работает, потому что все три клипа вернулись в одинаковом формате: H.264 на 24 кадрах в секунду, стерео AAC 32 кГц, одинаковые размеры. Именно этого требует concat demuxer в ffmpeg.

Склейка и проверка уровней по трём клипам этого прогона.
Схема перестаёт работать, как только партия становится смешанной. Клип 1080p с Seedance 2.5 возвращается в HEVC, а не в H.264, и склейка такого с H.264 под -c copy даст не то, что вы ждёте. Либо фиксируйте одну модель и одно разрешение на целое видео, либо перекодируйте:
ffmpeg -y -f concat -safe 0 -i list.txt -c:v libx264 -c:a aac -r 24 short.mp4
И обратите внимание на арифметику: три клипа по 5.041 секунды не дают 15.000. Если платформа или монтажёр ждут точной длительности, подрезайте после склейки, а не рассчитывайте на ровное число.
Почему здесь нет шага озвучки
Потому что на этом эндпоинте нет модели синтеза речи, а собственный звук клипов — не закадровый текст. Это честный пробел любого faceless-пайплайна на видео API, и обычно его заминают.
Что вы получаете — сгенерированную моделью атмосферную дорожку. Чего не получаете — голос, читающий строки, которые написала модель сценария. И у самой дорожки есть своя проблема:
| Клип | Средний уровень | Пик |
|---|---|---|
| Кадр 1 | -35.0 dBFS | -19.2 dBFS |
| Кадр 2 | -27.0 dBFS | -12.8 dBFS |
| Кадр 3 | -24.3 dBFS | -7.4 dBFS |
Почти 11 дБ разброса внутри одной партии. Это значения RMS из volumedetect, а не LUFS, так что не сопоставляйте их напрямую с целевой громкостью платформы; важен именно разброс между клипами, потому что при простой склейке на каждой стыковке слышен скачок уровня. Один проход loudnorm его выравнивает:
ffmpeg -i short.mp4 -af loudnorm=I=-14:TP=-1.5:LRA=11 -c:v copy short_normalised.mp4
Для самого голоса есть три пути, и ни один из них не этот API: отправить текст в отдельный TTS-сервис и подмешать, записать самому или отказаться от голоса и вывести текст субтитрами. Субтитры — не такой слабый вариант, как кажется, учитывая, какую долю коротких видео смотрят без звука.
Что ломается при переходе к ежедневному каналу
Три вещи, в порядке болезненности.
Разброс времени ломает планировщики. Троекратный разброс на одинаковых запросах означает, что cron, который рендерит в 08:00 и публикует в 08:05, рано или поздно опубликует пустоту. Рендерите заранее, складывайте результат в очередь, публикуйте из очереди.
Сценарий никто не проверяет на факты. Второй кадр просил рыбу-каплю с прозрачной головой. Вернулась рыба с большими глазами и без прозрачного купола — ошибка ровно того сорта, который заметит зритель, искавший эту тему. Модель сценария написала верное предложение, видеомодель проиллюстрировала его вольно, и в этом пайплайне нет шага, который ловит расхождение. При одном ролике в день вы отсмотрите глазами. При десяти — нет.
Политики платформы — не проблема рендеринга. Политики монетизации YouTube требуют оригинального и аутентичного контента и отдельно называют массово произведённый и повторяющийся материал; поверх лежат правила участия в партнёрской программе, а сторону публикации через API закрывают рекомендации TikTok по обмену контентом. Генерация — производственный инструмент. Редакторское суждение, конкретика и причина, по которой это стоит смотреть, остаются вашей частью работы, и как раз их API не продаёт.
С этой оговоркой пайплайн своё место оправдывает: он превращает «сделать пятнадцатисекундный иллюстрированный ролик» из дела на полдня в четыре минуты и тридцать центов, а это меняет набор идей, которые стоит попробовать. Про выбор модели для шага 2 — как выбирать video API под задачу, а аргумент качества за доллар в пользу Mini — в сравнении Seedance 2.0 и Wan.
Как удержать один ключ для модели сценария и видеомодели
Пайплайн выше трогает два совершенно разных типа моделей: текстовую, которая обязана вернуть строгий JSON, и видеомодель, которая работает асинхронно и тарифицируется по секундам. Нативно это два провайдера, два SDK, две панели и два счёта, плюс открытие, что у текстового вендора нет видеомодели, а текстовая модель видеовендора плохо держит JSON.
Оба вызова в этой статье ушли на один базовый URL с одним ключом: /v1/chat/completions за раскадровкой и /v1/videos за клипами. Только поэтому скрипт умещается в шестьдесят строк. Мы работаем на ofox, потому что там доступны обе формы, но подойдёт любой шлюз, делающий то же самое. Перед тем как вкладываться, проверьте, что текстовая сторона нормально поддерживает response_format: пайплайн, которому вместо JSON приходит проза, падает на первом шаге каждый раз. Проверьте это одним вызовом до того, как соберёте остальные три шага.
Источники
Часто задаваемые вопросы
- Сколько стоит сгенерировать faceless-ролик через API?
- Наш вертикальный ролик на 15 секунд обошёлся в $0.3009: $0.30 за три клипа по 5 секунд в 480p на Seedance 2.0 Mini по $0.02 за секунду и около $0.0009 за вызов модели для сценария на DeepSeek V4 Flash. Стоимость растёт линейно с длиной, так что ролик на 60 секунд — примерно $1.20 генерации. Сюда не входят озвучка, лицензии на музыку и ваше время.
- Сколько времени занимает весь пайплайн?
- 260 секунд реального времени на 15-секундный ролик. Сценарий занял 5.7 секунды, три клипа параллельно — 254.7 секунды, склейка ffmpeg — 0.05 секунды. Последовательно клипы заняли бы 465 секунд, так что одновременная отправка сэкономила около 45% времени.
- Можно ли покрыть одним ключом и сценарий, и видео?
- Да, если это шлюз, отдающий и то и другое. Вызов сценария шёл на /v1/chat/completions, клипы — на /v1/videos, с тем же базовым URL и тем же ключом. Именно поэтому пайплайн умещается в 60 строк, а не превращается в проект с двумя вендорскими SDK и двумя счетами.
- Есть ли у сгенерированных клипов звук?
- Есть сгенерированная моделью дорожка AAC, тихая и неровная. По трём клипам одной партии ffmpeg volumedetect показал средние уровни -35.0, -27.0 и -24.3 dBFS — разброс почти 11 дБ. Это RMS, а не LUFS, поэтому не сравнивайте напрямую с целевой громкостью платформы; но уже разброс между клипами означает, что перед публикацией нужен проход нормализации громкости.
- Есть ли в этом пайплайне шаг синтеза речи?
- На этом шлюзе нет, и делать вид, что есть, — самая частая ложь в гайдах про faceless-каналы. Строки закадрового текста выходят из модели сценария как текст, а дальше вы либо отправляете их в отдельный TTS-сервис, либо выводите субтитрами. Видеоэндпоинт вашу озвучку не читает.
- Можно склеить клипы копированием потоков в ffmpeg?
- Только если у всех клипов совпадают кодек, разрешение и параметры звука. Все три наших клипа 480p были H.264 на 24 кадрах в секунду с AAC 32 кГц, поэтому concat с -c copy занял 0.05 секунды. Добавьте клип 1080p с Seedance 2.5, который возвращается в HEVC, — и копирование потоков перестаёт работать.
- Насколько стабильно время генерации одинаковых клипов?
- Не очень. Три клипа этого прогона были отправлены в одну секунду с одной моделью, длительностью и разрешением, а завершились на 85.1, 126.7 и 253.2 секунде. Любой планировщик должен исходить из того, что момент готовности партии определяет самый медленный клип.
- Будет ли YouTube монетизировать такие видео?
- Сами по себе — нет. Политики монетизации YouTube требуют оригинального и аутентичного контента и отдельно называют массово произведённый и повторяющийся материал. Генерация — производственный инструмент, а не исключение из правил: монтаж, текст и точка зрения по-прежнему должны быть вашими.


