- BrainTools - https://www.braintools.ru -

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

Автор: Дмитрий Асанов
Telegram: @sandefiord [1]
Email: asanov@lux.tv.ru [2]
Репозиторий проекта: github.com/ondocomposer-cmyk/V-GEN [3]


Отказ от ответственности. Прошу не швырять камнями в автора. Делал скрипт под свои нужды, выложить в открытый доступ решил спонтанно, может кому-то пригодится. Над описанием не сильно старался.

Введение: Боль регионального ТВ и медиацентров

С нашего маленького местного телеканала (дочернего подразделения интернет-провайдера) уволились редактор и оператор. Чтобы не потерять лицензию, я как админ техподдержки взял на себя автоматизацию эфира и подготовку контента. Совмещать техподдержку со съёмками новостей сложно. Первый год я комбинировал живые отснятые на камеру новостные сюжеты с простыми роликами в виде слайд-шоу и анимированных фото (эффект Кена Бёрнса) по инфоповодам с порталов местных СМИ, пабликов. Но даже сбор новостей из чужих источников, обработка, подбор картинок, монтаж и озвучка отнимали много времени.

Из огромного потока информации нужно:

  1. Вычленить реальные инфоповоды (отсеяв бесконечный бытовой мусор — «потерялась кошка», «найдены ключи», «куплю гараж»).

  2. Проверить, актуальна ли новость прямо сейчас (последние 7 дней, а не трехмесячной давности).

  3. Переписать сухой канцелярский или эмоциональный текст паблика в строгий телевизионный формат для диктора — с правильным хронометражем (~45–60 секунд, ровно 800–1000 знаков с пробелами), динамичным лид-хуком, числительными словами («седьмого октября», «тридцать миллионов рублей») и полным отсутствием панибратских приветствий.

  4. Подобрать качественные фотографии, привести их к формату телевещания Full HD 1080p (16:9).

  5. Записать голос диктора, смонтировать видеоряд, наложить динамичные наезды/отъезды камеры (эффект Кена Бернса), склеить с эфирной отбивкой канала, подложить фоновую музыку с точным уровнем громкости (-5.4 дБ) и вывести логотип.

На один сюжет уходило от 20-30 минут работы. Плавно я вводил парсеры рассылок. Собственную озвучку голосом через микрофон я перевел на TTS от Google AI Studio TTS [4]. Рерайт новостей отдал на откуп DeepSeek. Но ручной возни все равно оставалось много. Поэтому было принято решение разработать скрипт на Google Gemini с платной подпиской PRO. Знакомые зумеры показали мне, как купить ее на год за 70 рублей в тг-боте @ShopAethelBot [5]. В связке с Google Antigravity за несколько дней тестов и доработок получился этот скрипт.

V-GEN — локальный сервис с веб-интерфейсом, который собирает новостные ролики сам «под ключ»: от живого поиска инфоповодов до готового Full HD файла с русским именем для эфирного плейлиста.

Рабочий интерфейс

Рабочий интерфейс

Архитектура: как устроен V-GEN «под капотом»

V-GEN объединяет современные большие языковые модели с веб-поиском, синтез речи нового поколения, алгоритмы компьютерного зрения [6] для адаптации графики и классический вещательный видеопродакшн на 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 выведено специальное поле, где промпт можно редактировать в реальном времени. По умолчанию вшит выверенный каркас телевизионного ТЗ:

  1. География и фильтр отбора:

    • Прямое отношение: события, решения, происшествия, люди в городе (правый/левый берег) и населённых пунктах района.

    • Региональное значение: общеобластные решения губернатора и правительства, проверки МЧС или тарифы ЖКХ, напрямую затрагивающие жителей.

    • Жесткий запрет: потерянные кошки, ключи, гаражи, частные объявления и бытовые склоки в комментариях.

  2. Тематические направления:

    • Происшествия и безопасность (МЧС, ГИБДД, суды).

    • ЖКХ и городская среда (отопление, дороги, переправы, благоустройство).

    • Социальная сфера (больницы, школы).

    • Культура, спорт и конкретная афиша на ближайшие дни с датами и местами.

  3. Правила адаптации под диктора:

    • Объём текста: строго 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:

  1. Если пропорции исходного кадра близки к 16:9 (погрешность до 6%), выполняется мягкое масштабирование и центрированный кроп с фильтром Lanczos.

  2. Если фото вертикальное или квадратное:

    • Создается задний план: исходник растягивается на весь кадр 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 leftrightarrow 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 секунды.

  • Общий хронометраж слайд-шоу:

    text{Total Duration}=text{Lead-In} (1.0,text{с}) + text{Voice Duration} + text{Lead-Out} (3.0,text{с})

    (Для читки 46 секунд общая длительность составит ровно 50 секунд).

Расчет длительности каждого кадра

Если к новости прикреплено N медиафайлов (фотографии и видеоролики B-Roll), длина каждого отдельного фрагмента вычисляется автоматически:

text{Slide Duration}=frac{text{Total Duration}}{N}

Например, при 50 секундах и 7 кадрах каждый фрагмент продлится ровно 7.14 секунды. Никаких черных экранов или обрывов видеоряда!

Вставка видеороликов B-Roll («КОНСЕРВЫ»)

В сюжет можно вставлять не только фото, но и настоящие видеосъемки: проезды улиц, виды города с дрона, переправу через Волгу или дорожные ремонты.

При монтаже каждого B-Roll ролика FFmpeg применяет цепочку фильтров:

  1. Зацикливание (-stream_loop -1): если исходный видеоролик города короче расчетного слайда (например, видео 4 секунды, а слайд длится 7.14 секунды), ролик бесшовно зацикливается.

  2. Точный тримминг (-t {slide_duration}): ролик обрезается строго до рассчитанного времени слайда.

  3. Кадрирование в 1080p: фильтр scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080 гарантирует Full HD 16:9 без черных полос и искажения пропорций.

  4. Нормализация вещания: принудительно задаются setsar=1 (квадратный пиксель), fps=30 и цветовое пространство yuv420p.

  5. Отключение звука видео (-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).

  • Назначение понятных названий трекам («Эфирная тема ТВТ», «Динамичный репортаж», «Спокойный фон»).

  • Кнопка «Загрузить аудио»: файл сохраняется в сервис и автоматически добавляется в список.

  • Встроенный аудиоплеер для предпрослушивания любого трека прямо в браузере.

  • Выбор основного трека по умолчанию.

  • В новостной ленте: для каждого сюжета перед генерацией видео выведен выпадающий список, где в один клик можно выбрать конкретный трек или вариант «Без музыки».

Отбивка телеканала и логотип

  • Путь к видеофайлу заставки (отбивка.mp [7]4) с видеоплеером проверки.

  • Путь к логотипу канала (логотип.png) с кнопкой мгновенной загрузки нового PNG.


7. Экспорт с русскими именами файлов для эфирного сервера

Смонтированное видео сразу получает имя файла по заголовку новости на русском языке, например: МФО вводят новые лимиты кредитов в Тутаеве.mp [8]4.

При клике на кнопку «Скачать 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:

  1. Главная страница (/):

    • Кнопка запуска сбора новостей за 7 дней с индикатором прогресса в реальном времени.

    • Карточки сюжетов: заголовок, хронометраж читки, количество символов текста, блок редактирования текста диктора.

    • Галерея медиафайлов: фото и видеоролики B-Roll с возможностью добавления из поисковика, загрузки с ПК или выбора из архива города.

    • Индивидуальная перегенерация голоса диктора при правках текста.

    • Селектор фоновой музыки и кнопка запуска рендеринга видео.

    • Индикатор прогресса монтажа с шагами в процентах и встроенный плеер готового сюжета.

  2. Админ-панель (/admin):

    • Управление ключом Gemini API и проверка связи.

    • Выбор модели LLM и переключатель Grounding Google Search.

    • Редактор системного редакционного промпта.

    • Выбор диктора Gemini TTS.

    • Менеджер папок B-Roll и треков фоновой музыки.

    • Таблица источников новостей (включение/отключение RSS, пабликов VK, Telegram-каналов) с кнопками проверки доступности.

  3. Архив видеороликов (/archive):

    • Все сгенерированные сюжеты в одном месте с возможностью просмотра, скачивания под русскими именами и очистки диска.


Пошаговая установка и запуск за 5 минут

Сервис оптимизирован для работы на Windows, а также запускается на Linux и macOS.

Шаг 1. Создание папки и открытие командной строки

  1. Откройте Проводник (Win + E) и перейдите на любой удобный диск (например, C:, D: или F:).

  2. Создайте новую папку (например, V-GEN или новостник) и зайдите в неё.

  3. Лайфхак для Windows: кликните левой кнопкой мыши по адресной строке Проводника вверху, введите cmd и нажмите Enter. Сразу откроется черное окно командной строки, уже смотрящее в созданную папку.

  4. Склонируйте файлы репозитория:

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

  1. Перейдите на Google AI Studio [9].

  2. Нажмите Create API key (создание бесплатного ключа занимает 15 секунд, банковская карта не требуется).

  3. Скопируйте ключ вида 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 [10]


Первичная настройка в веб-интерфейсе

  1. Перейдите во вкладку «Админ-панель» (http://localhost:8000/admin [11]).

  2. Вставьте ваш Gemini API Key и нажмите кнопку «Проверить» — система подтвердит связь с нейросетью.

  3. Проверьте переключатель «Поиск Google в реальном времени (Grounding)» — он должен быть включен.

  4. Отредактируйте «Поисковый и редакционный промпт» под специфику вашего города или региона.

  5. Выберите диктора (по умолчанию эталонный Callirrhoe).

  6. В блоке медиа укажите пути к вашим папкам с видео B-Roll и настройте треки фоновой музыки.

  7. Загрузите PNG логотип канала и укажите путь к файлу заставки отбивка.mp [7]4.

  8. Нажмите «Сохранить все настройки».

Теперь на главной странице достаточно нажать «Собрать и обработать новости за 7 дней» — и через несколько десятков секунд у вас будет готовая телевизионная верстка сюжетов в Full HD!


Заключение

V-GEN выполняет рутинные задачи редакции за копейки. Буду рад вашим отзывам и конструктивной критике!


Контакты и обратная связь

Автор: composer_ondo

Источник [12]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/36837

URLs in this post:

[1] @sandefiord: https://t.me/sandefiord

[2] asanov@lux.tv.ru: mailto:asanov@lux.tv.ru

[3] github.com/ondocomposer-cmyk/V-GEN: https://github.com/ondocomposer-cmyk/V-GEN

[4] Google AI Studio TTS: https://aistudio.google.com/generate-speech?model=gemini-2.5-pro-preview-tts

[5] @ShopAethelBot: https://www.braintools.ru/users/ShopAethelBot

[6] зрения: http://www.braintools.ru/article/6238

[7] отбивка.mp: http://%D0%BE%D1%82%D0%B1%D0%B8%D0%B2%D0%BA%D0%B0.mp

[8] Тутаеве.mp: http://%D0%A2%D1%83%D1%82%D0%B0%D0%B5%D0%B2%D0%B5.mp

[9] Google AI Studio: https://aistudio.google.com/apikey

[10] http://localhost:8000: http://localhost:8000

[11] http://localhost:8000/admin: http://localhost:8000/admin

[12] Источник: https://habr.com/ru/articles/1093430/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1093430

www.BrainTools.ru

Rambler's Top100