AI Presenter Video
Проверенное видео с ИИ-ведущим из сценария и одного изображения.
Метаданные навыка
| Источник | Опциональный — устанавливается командой hermes skills install official/creative/ai-presenter-video |
| Путь | optional-skills/creative/ai-presenter-video |
| Версия | 1.0.0 |
| Автор | cclank (https://github.com/cclank/lanshu-create-ai-presenter-video), портировано Hermes Agent |
| Лицензия | MIT |
| Платформы | linux, macos |
| Теги | video, presenter, avatar, lipsync, tts, captions, creative |
| Связанные навыки | hyperframes, kanban-video-orchestrator, comfyui |
Справочник: полный SKILL.md
Ниже — полное определение навыка, которое Hermes загружает при его срабатывании. Именно это агент видит как инструкции, когда навык активен.
AI Presenter Video
Превращает тему (или готовый сценарий) плюс ОДНО авторизованное изображение взрослого ведущего в законченное, готовое к публикации видео с ведущим: зафиксированная озвучка, генерация аватара с контролем липсинка, субтитры, детерминированный монтаж, мастер-версия и версия для соцсетей с нормализацией громкости, а также машинные и визуальные отчёты о приёмке.
Используйте навык и для новых видео с ведущим, И для продолжения, правки,
добавления субтитров, починки липсинка или переэкспорта уже существующей
задачи. Рабочий процесс не привязан к провайдеру: возможности генерации
берутся из того, что реально доступно в сессии (видео- и image-модели FAL через
image_generate и плагин генерации видео, TTS через text_to_speech, ASR
через инструментарий whisper/STT, ffmpeg — для всего детерминированного).
Портировано из cclank/lanshu-create-ai-presenter-video (MIT). Тело апстрима сохранено по существу дословно в
references/; адаптации для Hermes живут в этом хаб-файле. Скрипты детерминированы (без сети, без учётных данных).
Адаптации для Hermes (читать первыми)
-
Определение каталога навыка — апстрим жёстко прописывал путь к навыкам собственного агента. В Hermes загрузчик раскрывает
${HERMES_SKILL_DIR}в каталог, куда установлен этот навык, поэтому каждая команда ниже использует этот токен напрямую:SKILL_DIR="${HERMES_SKILL_DIR}"Переменные оболочки между вызовами инструментов не сохраняются — повторяйте присваивание (или уже раскрытый путь) в каждом терминальном вызове, где оно нужно.
-
Соответствие возможностей — там, где справочники говорят «возможность генерации голоса», используйте
text_to_speech(OpenAI/Edge/ElevenLabs по конфигу пользователя); «генерация ведущего/аватара» → семейства image-to-video на FAL (Kling, Wan, MiniMax H3 и т. д.) через настроенный видеоинструментарий либо эндпоинт аватара/липсинка, к которому у пользователя есть доступ; «ASR с таймстампами слов» → whisper через STT-инструментарий илиfaster-whisperв venv; «детерминированный композитор» → фильтр-графы ffmpeg или навыкhyperframes, если он установлен (в справочнике по монтажу есть раздел о HyperFrames, который ложится на него напрямую). -
Визуальный контроль — шаги «визуальный просмотр на нормальной скорости» выполняйте через
vision_analyzeна сгенерированном контактном листе плюс выборочных кадрах (идентичность, тайминг рта, руки, моргание, непрерывность). Числовые проверки берутся из вывода ffprobe в скриптах. -
Согласие на платную генерацию — удалённая генерация аватара/TTS платная. Следуйте правилам работы из апстрима: перед первым платным вызовом назовите загружаемые ресурсы, запрошенные секунды, известную стоимость, размер пилота и потолок повторов — и получите явное согласие пользователя. Никогда не загружайте изображение ведущего удалённому провайдеру, пока
remote_upload_approvedвjob.jsonне равен true. -
Флаги согласия живут под
input—rights_confirmed,adult_presenter_confirmed,remote_upload_approvedиvoice_clone_approvedлежат внутри объектаinputвjob.json(флаги init выставляют их; при ручной правке целиться нужно вinput.*, а не в корень задачи).manual_input_review.*лежит в корне.preflight.pyразличаетerrors(блокируют всё) иremote_blockers(блокируют только удалённую генерацию) — локальная работа со скриптами и аудио может продолжаться, пока удалённая заблокирована.
Рабочий процесс
-
Начните или возобновите задачу. Новая задача:
python3 "$SKILL_DIR/scripts/init_job.py" \ --job-dir ~/Videos/my-presenter-video \ --presenter-image /path/to/presenter.png \ --topic "explain context engineering in one minute" \ --duration 60 --aspect 9:16 \ --rights-confirmed --adult-presenter-confirmedДля готового файла сценария используйте
--script; другие флаги:--voice-sample,--supporting-media,--width,--height,--fps,--watermark,--cta. Для существующей задачи прочитайтеjob.jsonи отчёты QA и возобновите работу с самого раннего незавершённого состояния — никогда не перегенерируйте принятую работу. -
Ручная проверка входных данных. Действительно посмотрите на изображение ведущего (
vision_analyze) и послушайте образец голоса, если он есть; результаты зафиксируйте, выставив булевы поляmanual_input_reviewвjob.json, например:python3 - <<'PY' import json p = "~/Videos/my-presenter-video/job.json" # раскройте ~ или используйте абсолютный путь import os; p = os.path.expanduser(p) j = json.load(open(p)) j["manual_input_review"].update(image_viewed=True, single_clear_face=True, image_has_no_unwanted_text=True) json.dump(j, open(p, "w"), indent=2) PYЗатем проверка-гейт:
python3 "$SKILL_DIR/scripts/preflight.py" ~/Videos/my-presenter-video/job.jsonПродолжайте только при
ok: true; удалённую генерацию запускайте только приremote_ready: true. Примечание: preflight также обновляетjob.jsonна месте (записывает путь к отчёту) — после запуска перечитайте файл, а не правьте устаревшую копию. -
Зафиксируйте контент и аудио — прочитайте
references/generation.md. Сценарий → полная озвучка черезtext_to_speech→ сверка озвучки со сценарием через ASR → запись реальных длительностей. Зафиксированное аудио — главные часы для всего, что идёт дальше. -
Спланируйте и сгенерируйте ведущего — прочитайте
references/generation.md. Сначала короткий дешёвый пилот; полный прогон только после того, как пилот прошёл проверку идентичности и тайминга рта. -
Смонтируйте — прочитайте
references/editing.md. Детерминированная таймлиния, ведомая зафиксированным аудио; субтитры и выноски с ключевыми словами — только после того, как аудио и медиа финализированы. -
Проверьте и отдайте результат — прочитайте
references/qa-recovery.md, отрендерьте, затем:bash "$SKILL_DIR/scripts/finalize_delivery.sh" \ ~/Videos/my-presenter-video/renders/rendered.mp4 \ ~/Videos/my-presenter-video/outputs my-videoФинализатор сохраняет соотношение сторон, выполняет двухпроходную нормализацию громкости (программа ≈ −16 LUFS), создаёт мастер-версию и версию для соцсетей, проверяет декодирование обеих, пишет JSON-отчёт о доставке и выдаёт контактный лист из девяти кадров. Перед тем как объявить работу завершённой, осмотрите контактный лист через
vision_analyze.
Правила работы (не обсуждаются)
- Подтверждайте права на изображение, совершеннолетие, согласие на удалённую загрузку и разрешение на клонирование голоса до соответствующего удалённого действия.
- Никогда не выводите и не клонируйте голос реального человека по изображению; используйте авторизованный образец или стоковый голос TTS.
- Фиксируйте полную озвучку до генерации ведущего, тайминга субтитров и окончательных границ сцен.
- В финальной композиции видеоисточники без звука; аудио несут только одобренная озвучка и намеренные дорожки микса.
- Сохраняйте тела запросов к провайдеру и ID задач (без учётных данных и истекающих URL). Прежде чем отправлять заново, опросите прерванную работу — избегайте двойного списания.
- Остановитесь после трёх отклонённых платных кандидатов и опишите характер сбоя.
- Не объявляйте работу завершённой, пока финальные файлы не декодируются полностью и не просмотрен контактный лист или полное воспроизведение.
Значения по умолчанию при минимальном вводе
9:16, 1080×1920, 30fps; видео по теме целятся в 45–75 с; стоковый голос, если нет авторизованного образца; раскладка с ведущим в кадре: хук → 2–4 бита → концовка; без музыки и CTA, если не просили; язык выводится из запроса.
Маршрутизация по справочникам
references/generation.md— приём входных данных, контент, голос, выбор возможностей, промпты для ведущего, платная генерация, смена провайдера.references/editing.md— контракт таймлинии, вступления/концовки, субтитры, пресеты выносок с ключевыми словами, композиция в HyperFrames, экспорт.references/qa-recovery.md— техническая приёмка, визуальная приёмка и восстановление после дефектов липсинка/идентичности/рук/экспозиции/ зависаний/субтитров/аудио.
Подводные камни
preflight.pyтребует ffprobe; на голой машине сначала установите ffmpeg.- Булевы поля согласия, выставленные флагами init, ложатся под
input.*; правка их в корне job-json молча ничего не делает (preflight продолжает блокировать). finalize_delivery.shнуждается в bash + jq + awk и в полностью декодируемом входе — обрезанный рендер не проходит проверку декодирования намеренно, а не случайно.- Длинные клипы с аватаром «уплывают»: предпочитайте один непрерывный источник с ведущим, нарезанный по аудио-таймлинии, множеству перегенерированных клипов по главам (дрейф идентичности между перегенерациями — провал номер один при визуальном контроле).
- Эндпоинты i2v на FAL ограничивают длительность (обычно 5–15 с); планируйте сегменты с ведущим на уровне глав соответственно и переиспользуйте seed и параметры пилота ради согласованности там, где эндпоинт это поддерживает.
Проверка
Проверено вручную (август 2026): init_job.py → job.json с корректной
машиной состояний; preflight.py правильно блокировал непроверенные входные
данные, переключился на ok: true после булевых полей проверки и держал
remote_ready: false до input.remote_upload_approved;
finalize_delivery.sh на синтетическом рендере 5 с 1080×1920 выдал
мастер-версию с проверенным декодированием (631 кбит/с) и версию для
соцсетей, JSON-отчёт о доставке и контактный лист из 9 кадров, код выхода 0.