Автор: Дмитрий Асанов
Telegram: @sandefiord
Email: asanov@lux.tv.ru
Репозиторий проекта: github.com/ondocomposer-cmyk/V-GEN
Отказ от ответственности. Прошу не швырять камнями в автора. Делал скрипт под свои нужды, выложить в открытый доступ решил спонтанно, может кому-то пригодится. Над описанием не сильно старался.
Введение: Боль регионального ТВ и медиацентров
С нашего маленького местного телеканала (дочернего подразделения интернет-провайдера) уволились редактор и оператор. Чтобы не потерять лицензию, я как админ техподдержки взял на себя автоматизацию эфира и подготовку контента. Совмещать техподдержку со съёмками новостей сложно. Первый год я комбинировал живые отснятые на камеру новостные сюжеты с простыми роликами в виде слайд-шоу и анимированных фото (эффект Кена Бёрнса) по инфоповодам с порталов местных СМИ, пабликов. Но даже сбор новостей из чужих источников, обработка, подбор картинок, монтаж и озвучка отнимали много времени.
Из огромного потока информации нужно:
-
Вычленить реальные инфоповоды (отсеяв бесконечный бытовой мусор — «потерялась кошка», «найдены ключи», «куплю гараж»).
-
Проверить, актуальна ли новость прямо сейчас (последние 7 дней, а не трехмесячной давности).
-
Переписать сухой канцелярский или эмоциональный текст паблика в строгий телевизионный формат для диктора — с правильным хронометражем (~45–60 секунд, ровно 800–1000 знаков с пробелами), динамичным лид-хуком, числительными словами («седьмого октября», «тридцать миллионов рублей») и полным отсутствием панибратских приветствий.
-
Подобрать качественные фотографии, привести их к формату телевещания Full HD 1080p (16:9).
-
Записать голос диктора, смонтировать видеоряд, наложить динамичные наезды/отъезды камеры (эффект Кена Бернса), склеить с эфирной отбивкой канала, подложить фоновую музыку с точным уровнем громкости (-5.4 дБ) и вывести логотип.
На один сюжет уходило от 20-30 минут работы. Плавно я вводил парсеры рассылок. Собственную озвучку голосом через микрофон я перевел на TTS от Google AI Studio TTS. Рерайт новостей отдал на откуп DeepSeek. Но ручной возни все равно оставалось много. Поэтому было принято решение разработать скрипт на Google Gemini с платной подпиской PRO. Знакомые зумеры показали мне, как купить ее на год за 70 рублей в тг-боте @ShopAethelBot. В связке с Google Antigravity за несколько дней тестов и доработок получился этот скрипт.
V-GEN — локальный сервис с веб-интерфейсом, который собирает новостные ролики сам «под ключ»: от живого поиска инфоповодов до готового Full HD файла с русским именем для эфирного плейлиста.
Архитектура: как устроен V-GEN «под капотом»
V-GEN объединяет современные большие языковые модели с веб-поиском, синтез речи нового поколения, алгоритмы компьютерного зрения для адаптации графики и классический вещательный видеопродакшн на FFmpeg:
[Пользователь]
│
Кнопка «Собрать новости за 7 дней»
▼
┌──────────────────────────────────────────────┐
│ 1. ДИНАМИЧЕСКИЙ СБОР И ИНФОРМАЦИОННЫЙ ФИЛЬТР │
│ • Google Gemini Grounding with Search │
│ • VKontakte API (городские сообщества) │
│ • RSS / Веб-парсеры региональных порталов │
└──────────────────────┬───────────────────────┘
│
▼
┌──────────────────────────────────────────────┐
│ 2. РЕДАКЦИОННЫЙ РЕРАЙТ И АДАПТАЦИЯ ТЕКСТА │
│ • Строго 800–1000 символов (~45–60 секунд) │
│ • Лид-хук, числительные словами, без клише │
│ • Нулевое панибратство (без «здравствуйте») │
└──────────────────────┬───────────────────────┘
│
┌───────────────────────┴────────────────────────┐
▼ ▼
┌───────────────────────────────┐ ┌──────────────────────────────┐
│ 3. СИНТЕЗ РЕЧИ (GEMINI TTS) │ │ 4. ВИЗУАЛЬНЫЙ РЯД И МЕДИА │
│ • Голос: Callirrhoe (ТВ) │ │ • Smart UNCROP до 1080p │
│ • Чистая читка фактов │ │ • Ken Burns без дрожания │
│ • Нормализация 48k Stereo │ │ • Папки B-Roll (видеоархив) │
└───────────────┬───────────────┘ └──────────────┬───────────────┘
│ │
└───────────────────┬───────────────────┘
▼
┌──────────────────────────────────────────────┐
│ 5. FFmpeg ВИДЕОГЕНЕРАТОР И ЭФИРНЫЙ МОНТАЖ │
│ • Расчет хронометража: 1с + Голос + 3с │
│ • Динамическая смена кадров (~7–8 сек) │
│ • Выбор фоновой музыки из списка (-5.4 дБ) │
│ • Синхронный Fade Out 1.5 сек (видео+аудио) │
│ • Склейка с отбивкой (SAR 1:1, 30 fps) │
│ • Наложение логотипа канала с прозрачностью │
└──────────────────────┬───────────────────────┘
│
▼
┌──────────────────────────────────────────────┐
│ 6. ГОТОВЫЙ ВЕЩАТЕЛЬНЫЙ ЭФИРНЫЙ MP4-ФАЙЛ │
│ Экспорт с русским именем: │
│ «Ремонт теплосетей в Тутаеве.mp4» │
└──────────────────────────────────────────────┘
1. Интеллектуальный поиск без жестких рамок: Grounding in Real-Time
Классическая проблема автоматических новостных агрегаторов — ломкие парсеры и привязка к жестким RSS-лентам. Если сайт обновил верстку или в ленте три дня нет публикаций, скрипт падает или выдает старье.
В V-GEN применен принципиально иной подход: Используется Google Gemini Grounding with Google Search (модель gemini-3.8-flash). В запрос передается параметр инструментов:
{
"tools": [{"googleSearch": {}}]
}
Модель напрямую обращается к поисковому индексу Google в реальном времени, сканирует публикации за последние 7–10 дней по заданной географии, сопоставляет факты из региональных СМИ, пресс-релизов МЧС, постов администраций и выдает структурированную подборку подтвержденных событий.
Промпт-инжиниринг: как заставить AI мыслить как выпускающий редактор
В админ-панели V-GEN выведено специальное поле, где промпт можно редактировать в реальном времени. По умолчанию вшит выверенный каркас телевизионного ТЗ:
-
География и фильтр отбора:
-
Прямое отношение: события, решения, происшествия, люди в городе (правый/левый берег) и населённых пунктах района.
-
Региональное значение: общеобластные решения губернатора и правительства, проверки МЧС или тарифы ЖКХ, напрямую затрагивающие жителей.
-
Жесткий запрет: потерянные кошки, ключи, гаражи, частные объявления и бытовые склоки в комментариях.
-
-
Тематические направления:
-
Происшествия и безопасность (МЧС, ГИБДД, суды).
-
ЖКХ и городская среда (отопление, дороги, переправы, благоустройство).
-
Социальная сфера (больницы, школы).
-
Культура, спорт и конкретная афиша на ближайшие дни с датами и местами.
-
-
Правила адаптации под диктора:
-
Объём текста: строго 800–1000 знаков с пробелами на одну новость. Это дает идеальный телевизионный хронометраж читки ~45–60 секунд.
-
Устная речь без канцеляризмов: фразы вроде «в целях реализации мероприятий» или «имеет место быть» строго запрещены.
-
Никаких приветствий: запрещены фразы «Здравствуйте», «Добрый вечер», «С вами новости». В эфир идет плотный поток фактов.
-
Числительные прописываются словами: чтобы ведущий не запинался, цифры преобразуются в текст: «седьмого октября», «более тридцати миллионов рублей».
-
Композиция: первое предложение — хук (суть новости), далее факты и подробности, финал — статус, последствия или дата следующего события.
-
2. Голос телеведущего: Google Gemini TTS и Callirrhoe
Для синтеза речи используется мультимодальный синтез Gemini TTS.
По умолчанию сервис настроен на голос Callirrhoe — это эталонный голос профессионального телеведущего: энергичный, теплый, уверенный, без механических пауз и с прекрасной русской фонетикой. При этом в админ-панели V-GEN можно выбрать любой из официальных голосов Gemini (Puck, Charon, Kore, Fenrir, Aoede, Leda, Orpheus, Zephyr).
Защита от лишних фраз (Prompt Injection Prevention)
Частая проблема синтеза через LLM — когда модель начинает озвучивать системные промпты («Конечно, вот ваша новость:…»). В V-GEN на генерацию речи подается исключительно очищенный текст новости без инструкций.
Полученный аудиопоток (PCM/WAV) нормализуется через FFmpeg под строгие вещательные требования: 48 kHz, 16-bit stereo.
3. Визуальный ряд: Smart UNCROP и Ken Burns без дрожания (Zero Jitter)
Обычная беда автогенераторов видео — вертикальные или квадратные фотографии из соцсетей с уродливыми черными полосами по бокам, либо сплюснутые пропорции.
Алгоритм Smart UNCROP
В V-GEN встроен автоматический конвертер любого изображения в Full HD 1920×1080:
-
Если пропорции исходного кадра близки к 16:9 (погрешность до 6%), выполняется мягкое масштабирование и центрированный кроп с фильтром Lanczos.
-
Если фото вертикальное или квадратное:
-
Создается задний план: исходник растягивается на весь кадр 1920×1080, размывается по Гауссу с радиусом 28 пикселей и затемняется на 30% (яркость 0.70).
-
Поверх накладывается передний план: исходная четкая фотография масштабируется с сохранением пропорций в безопасную ТВ-зону и центрируется.
-
Никаких черных полос — картинка выглядит как на федеральном телеканале.
-
Эффект Кена Бернса без дрожания (Субпиксельный зум)
Стандартный фильтр FFmpeg zoompan при показе статичных фотографий часто страдает от эффекта «дрожания» (jitter) из-за округления целочисленных координат пикселей на каждом кадре.
В V-GEN рендеринг слайдов перенесен на кадровый пайплайн Pillow с субпиксельными вещественными координатами (float box):
-
Для каждого кадра рассчитывается точный
scale:-
Zoom In: наезд от 1.0 (100%) до 1.15 (115%).
-
Zoom Out: отъезд от 1.15 (115%) до 1.0 (100%).
-
-
Масштабирование выполняется методом билинейной интерполяции
BILINEARс непрерывным смещением координат:cw = 1920.0 / scale ch = 1080.0 / scale left = (1920.0 - cw) / 2.0 top = (1080.0 - ch) / 2.0 frame = base_img.resize((1920, 1080), box=(left, top, left + cw, top + ch)) -
Кадры поочередно чередуются: Zoom In
Zoom Out.
-
Телевизионное правило: последний слайд сюжета ВСЕГДА рендерится с Zoom Out (плавный отъезд камеры), что создает естественную точку завершения репортажа.
-
Сгенерированный поток кадров отправляется напрямую в пайп FFmpeg через
rawvideo rgb24 -> libx264 (yuv420p, 30 fps). Картинка идет абсолютно плавно, как по рельсам операторской тележки.
4. Точная математика таймингов: просчет времени показа картинок и видеороликов B-Roll
В вещании звук диктора является абсолютным хозяином хронометража: видеоряд обязан подстраиваться под голос, а не наоборот.
Формула общего времени видеоряда
Каждый сюжет монтируется по строгим правилам телевизионного монтажа:
-
Lead-In (вводная пауза):
1.0 секунда. Первый слайд показывается зрителям в тишине ровно одну секунду до того, как диктор начинает говорить, чтобы зритель успел зафиксировать визуальный контекст новости. -
Voice Duration (читка диктора): измеряется программно с субсекундной точностью (например,
46.4 секунды). -
Lead-Out (финальная пауза):
3.0 секунды. После того как диктор закончил последнюю фразу, финальный слайд удерживается на экране еще 3 секунды. -
Общий хронометраж слайд-шоу:
(Для читки 46 секунд общая длительность составит ровно 50 секунд).
Расчет длительности каждого кадра
Если к новости прикреплено медиафайлов (фотографии и видеоролики B-Roll), длина каждого отдельного фрагмента вычисляется автоматически:
Например, при 50 секундах и 7 кадрах каждый фрагмент продлится ровно 7.14 секунды. Никаких черных экранов или обрывов видеоряда!
Вставка видеороликов B-Roll («КОНСЕРВЫ»)
В сюжет можно вставлять не только фото, но и настоящие видеосъемки: проезды улиц, виды города с дрона, переправу через Волгу или дорожные ремонты.
При монтаже каждого B-Roll ролика FFmpeg применяет цепочку фильтров:
-
Зацикливание (
-stream_loop -1): если исходный видеоролик города короче расчетного слайда (например, видео 4 секунды, а слайд длится 7.14 секунды), ролик бесшовно зацикливается. -
Точный тримминг (
-t {slide_duration}): ролик обрезается строго до рассчитанного времени слайда. -
Кадрирование в 1080p: фильтр
scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080гарантирует Full HD 16:9 без черных полос и искажения пропорций. -
Нормализация вещания: принудительно задаются
setsar=1(квадратный пиксель),fps=30и цветовое пространствоyuv420p. -
Отключение звука видео (
-an): исходный звук видеоролика (шум мотора дрона, ветер) полностью вырезается, чтобы не конфликтовать с диктором и музыкой.
Микширование звука и синхронный Fade Out
-
Голос диктора задерживается на 1000 мс с помощью аудиофильтра
adelay=1000|1000. -
Фоновая музыка зацикливается, обрезается по
Total Durationи понижается до эфирного стандарта -5.4 дБ (volume=-5.4dB). -
За 1.5 секунды до конца видеоряда включается синхронное затухание:
-
Видео:
fade=t=out:st={fade_start}:d=1.5 -
Звук:
afade=t=out:st={fade_start}:d=1.5Видео плавно уходит в затемнение одновременно с затиханием музыки и фонового шума.
-
5. Наложение эфирного логотипа телеканала
Логотип телеканала накладывается с сохранением честного альфа-канала прозрачности (RGBA PNG).
В админ-панели V-GEN доступен выбор позиции логотипа:
-
Сверху справа (ТВ стандарт): координаты с учетом эфирного отступа безопасности (Title Safe Area 40px):
overlay=W-w-40:40. -
Сверху слева:
overlay=40:40. -
Снизу справа:
overlay=W-w-40:H-h-40.
В финальном графе фильтров FFmpeg логотип накладывается на склеенное видео (эфирная отбивка + видеоряд сюжета):
[v_concat][2:v]overlay=W-w-40:40[v_out]
Это гарантирует, что логотип стоит ровно на всех кадрах сюжета, не съезжает и не деформируется.
6. Настройка путей: Мульти-папки B-Roll и выбор фоновой музыки
В V-GEN реализована гибкая работа с файловыми путями прямо через веб-интерфейс админки.
Несколько папок с роликами B-Roll
В админке можно указать несколько путей к папкам с B-Roll:
-
Например:
F:КОНСЕРВЫ,D:ВидеоАрхив_Город,E:Дрон_Съемки. Эти ролики можно также вставлять в сюжет, чередуя с автоматически найденными картинками. -
Сервис динамически проверяет доступность папок и показывает статус: «Доступно (N видео)» зеленым цветом или «Не найдена» красным.
-
В модальном окне выбора B-Roll на главной странице добавлен выпадающий список для быстрого переключения между базами, а строка глобального поиска ищет видеоролики сразу по всем подключенным папкам одновременно!
Выбор и загрузка фоновой музыки
Для разных типов новостей нужна разная музыка: для праздников — динамичная, для ЖКХ — нейтральная, для происшествий — строгая или режим «Без музыки» (траурная тишина).
В админ-панели реализован полноценный менеджер треков:
-
Возможность указать любое количество путей к аудиофайлам (
.wav,.mp3,.aac,.flac). -
Назначение понятных названий трекам («Эфирная тема ТВТ», «Динамичный репортаж», «Спокойный фон»).
-
Кнопка «Загрузить аудио»: файл сохраняется в сервис и автоматически добавляется в список.
-
Встроенный аудиоплеер для предпрослушивания любого трека прямо в браузере.
-
Выбор основного трека по умолчанию.
-
В новостной ленте: для каждого сюжета перед генерацией видео выведен выпадающий список, где в один клик можно выбрать конкретный трек или вариант «Без музыки».
Отбивка телеканала и логотип
-
Путь к видеофайлу заставки (
отбивка.mp4) с видеоплеером проверки. -
Путь к логотипу канала (
логотип.png) с кнопкой мгновенной загрузки нового PNG.
7. Экспорт с русскими именами файлов для эфирного сервера
Смонтированное видео сразу получает имя файла по заголовку новости на русском языке, например: МФО вводят новые лимиты кредитов в Тутаеве.mp4.
При клике на кнопку «Скачать MP4» сервер отдает файл с корректными заголовками RFC 5987:
Content-Disposition: attachment; filename*=UTF-8''%D0%9C%D0%A4%D0%9E%20%D0%B2%D0%B2%D0%BE%D0%B4%D1%8F%D1%82...mp4
Браузер сохраняет файл с чистым русским названием, готовым к моментальной отправке в эфирный плейлист вещательного сервера без ручного переименования.
8. Веб-интерфейс и страницы V-GEN
Интерфейс построен на FastAPI, Jinja2, TailwindCSS и FontAwesome:
-
Главная страница (
/):-
Кнопка запуска сбора новостей за 7 дней с индикатором прогресса в реальном времени.
-
Карточки сюжетов: заголовок, хронометраж читки, количество символов текста, блок редактирования текста диктора.
-
Галерея медиафайлов: фото и видеоролики B-Roll с возможностью добавления из поисковика, загрузки с ПК или выбора из архива города.
-
Индивидуальная перегенерация голоса диктора при правках текста.
-
Селектор фоновой музыки и кнопка запуска рендеринга видео.
-
Индикатор прогресса монтажа с шагами в процентах и встроенный плеер готового сюжета.
-
-
Админ-панель (
/admin):-
Управление ключом Gemini API и проверка связи.
-
Выбор модели LLM и переключатель Grounding Google Search.
-
Редактор системного редакционного промпта.
-
Выбор диктора Gemini TTS.
-
Менеджер папок B-Roll и треков фоновой музыки.
-
Таблица источников новостей (включение/отключение RSS, пабликов VK, Telegram-каналов) с кнопками проверки доступности.
-
-
Архив видеороликов (
/archive):-
Все сгенерированные сюжеты в одном месте с возможностью просмотра, скачивания под русскими именами и очистки диска.
-
Пошаговая установка и запуск за 5 минут
Сервис оптимизирован для работы на Windows, а также запускается на Linux и macOS.
Шаг 1. Создание папки и открытие командной строки
-
Откройте Проводник (
Win + E) и перейдите на любой удобный диск (например,C:,D:илиF:). -
Создайте новую папку (например,
V-GENилиновостник) и зайдите в неё. -
Лайфхак для Windows: кликните левой кнопкой мыши по адресной строке Проводника вверху, введите
cmdи нажмите Enter. Сразу откроется черное окно командной строки, уже смотрящее в созданную папку. -
Склонируйте файлы репозитория:
git clone https://github.com/ondocomposer-cmyk/V-GEN.git .
(Точка в конце скачает проект прямо в текущую открытую вами папку).
Шаг 2. Установка зависимостей
Убедитесь, что у вас установлен Python 3.10 или новее, а также FFmpeg (должен быть добавлен в системный PATH).
Установите зависимости:
pip install -r requirements.txt
(В requirements входят: fastapi, uvicorn, google-genai, httpx, pillow, beautifulsoup4, feedparser, jinja2, pydantic и др.)
Шаг 3. Получение бесплатного API-ключа Gemini
-
Перейдите на Google AI Studio.
-
Нажмите Create API key (создание бесплатного ключа занимает 15 секунд, банковская карта не требуется).
-
Скопируйте ключ вида
AIzaSy....
Шаг 4. Запуск сервиса
Запустите сервис командой:
python run.py
В консоли появится сообщение:
======================================================================
V-GEN — АВТОМАТИЧЕСКАЯ ГЕНЕРАЦИЯ ВИДЕОНОВОСТЕЙ ДЛЯ ТВ
Автор скрипта: Дмитрий Асанов (@sandefiord, asanov@lux.tv.ru)
======================================================================
Веб-интерфейс доступен по адресам:
-> Главная (Новости и генерация): http://localhost:8000
-> Админ-панель (Настройки V-GEN): http://localhost:8000/admin
-> Архив видеороликов: http://localhost:8000/archive
======================================================================
Откройте браузер по адресу: http://localhost:8000
Первичная настройка в веб-интерфейсе
-
Перейдите во вкладку «Админ-панель» (
http://localhost:8000/admin). -
Вставьте ваш
Gemini API Keyи нажмите кнопку «Проверить» — система подтвердит связь с нейросетью. -
Проверьте переключатель «Поиск Google в реальном времени (Grounding)» — он должен быть включен.
-
Отредактируйте «Поисковый и редакционный промпт» под специфику вашего города или региона.
-
Выберите диктора (по умолчанию эталонный Callirrhoe).
-
В блоке медиа укажите пути к вашим папкам с видео B-Roll и настройте треки фоновой музыки.
-
Загрузите PNG логотип канала и укажите путь к файлу заставки
отбивка.mp4. -
Нажмите «Сохранить все настройки».
Теперь на главной странице достаточно нажать «Собрать и обработать новости за 7 дней» — и через несколько десятков секунд у вас будет готовая телевизионная верстка сюжетов в Full HD!
Заключение
V-GEN выполняет рутинные задачи редакции за копейки. Буду рад вашим отзывам и конструктивной критике!
Контакты и обратная связь
-
Автор проекта: Дмитрий Асанов
-
Telegram: @sandefiord
-
E-mail: asanov@lux.tv.ru
Автор: composer_ondo


