V-GEN: автономный генератор теленовостей и видеосюжетов на Google Gemini и FFmpeg

Автор: Дмитрий Асанов
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 │
│ │
│ │
└──────────────────────┬───────────────────────┘
│
▼
┌──────────────────────────────────────────────┐
│ 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
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.