- BrainTools - https://www.braintools.ru -
Автор: Дмитрий Асанов
Telegram: @sandefiord [1]
Email: asanov@lux.tv.ru [2]
Репозиторий проекта: github.com/ondocomposer-cmyk/V-GEN [3]
Отказ от ответственности. Прошу не швырять камнями в автора. Делал скрипт под свои нужды, выложить в открытый доступ решил спонтанно, может кому-то пригодится. Над описанием не сильно старался.
С нашего маленького местного телеканала (дочернего подразделения интернет-провайдера) уволились редактор и оператор. Чтобы не потерять лицензию, я как админ техподдержки взял на себя автоматизацию эфира и подготовку контента. Совмещать техподдержку со съёмками новостей сложно. Первый год я комбинировал живые отснятые на камеру новостные сюжеты с простыми роликами в виде слайд-шоу и анимированных фото (эффект Кена Бёрнса) по инфоповодам с порталов местных СМИ, пабликов. Но даже сбор новостей из чужих источников, обработка, подбор картинок, монтаж и озвучка отнимали много времени.
Из огромного потока информации нужно:
Вычленить реальные инфоповоды (отсеяв бесконечный бытовой мусор — «потерялась кошка», «найдены ключи», «куплю гараж»).
Проверить, актуальна ли новость прямо сейчас (последние 7 дней, а не трехмесячной давности).
Переписать сухой канцелярский или эмоциональный текст паблика в строгий телевизионный формат для диктора — с правильным хронометражем (~45–60 секунд, ровно 800–1000 знаков с пробелами), динамичным лид-хуком, числительными словами («седьмого октября», «тридцать миллионов рублей») и полным отсутствием панибратских приветствий.
Подобрать качественные фотографии, привести их к формату телевещания Full HD 1080p (16:9).
Записать голос диктора, смонтировать видеоряд, наложить динамичные наезды/отъезды камеры (эффект Кена Бернса), склеить с эфирной отбивкой канала, подложить фоновую музыку с точным уровнем громкости (-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 объединяет современные большие языковые модели с веб-поиском, синтез речи нового поколения, алгоритмы компьютерного зрения [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» │
└──────────────────────────────────────────────┘
Классическая проблема автоматических новостных агрегаторов — ломкие парсеры и привязка к жестким RSS-лентам. Если сайт обновил верстку или в ленте три дня нет публикаций, скрипт падает или выдает старье.
В V-GEN применен принципиально иной подход: Используется Google Gemini Grounding with Google Search (модель gemini-3.8-flash). В запрос передается параметр инструментов:
{
"tools": [{"googleSearch": {}}]
}
Модель напрямую обращается к поисковому индексу Google в реальном времени, сканирует публикации за последние 7–10 дней по заданной географии, сопоставляет факты из региональных СМИ, пресс-релизов МЧС, постов администраций и выдает структурированную подборку подтвержденных событий.
В админ-панели V-GEN выведено специальное поле, где промпт можно редактировать в реальном времени. По умолчанию вшит выверенный каркас телевизионного ТЗ:
География и фильтр отбора:
Прямое отношение: события, решения, происшествия, люди в городе (правый/левый берег) и населённых пунктах района.
Региональное значение: общеобластные решения губернатора и правительства, проверки МЧС или тарифы ЖКХ, напрямую затрагивающие жителей.
Жесткий запрет: потерянные кошки, ключи, гаражи, частные объявления и бытовые склоки в комментариях.
Тематические направления:
Происшествия и безопасность (МЧС, ГИБДД, суды).
ЖКХ и городская среда (отопление, дороги, переправы, благоустройство).
Социальная сфера (больницы, школы).
Культура, спорт и конкретная афиша на ближайшие дни с датами и местами.
Правила адаптации под диктора:
Объём текста: строго 800–1000 знаков с пробелами на одну новость. Это дает идеальный телевизионный хронометраж читки ~45–60 секунд.
Устная речь без канцеляризмов: фразы вроде «в целях реализации мероприятий» или «имеет место быть» строго запрещены.
Никаких приветствий: запрещены фразы «Здравствуйте», «Добрый вечер», «С вами новости». В эфир идет плотный поток фактов.
Числительные прописываются словами: чтобы ведущий не запинался, цифры преобразуются в текст: «седьмого октября», «более тридцати миллионов рублей».
Композиция: первое предложение — хук (суть новости), далее факты и подробности, финал — статус, последствия или дата следующего события.
Для синтеза речи используется мультимодальный синтез Gemini TTS.
По умолчанию сервис настроен на голос Callirrhoe — это эталонный голос профессионального телеведущего: энергичный, теплый, уверенный, без механических пауз и с прекрасной русской фонетикой. При этом в админ-панели V-GEN можно выбрать любой из официальных голосов Gemini (Puck, Charon, Kore, Fenrir, Aoede, Leda, Orpheus, Zephyr).
Частая проблема синтеза через LLM — когда модель начинает озвучивать системные промпты («Конечно, вот ваша новость:…»). В V-GEN на генерацию речи подается исключительно очищенный текст новости без инструкций.
Полученный аудиопоток (PCM/WAV) нормализуется через FFmpeg под строгие вещательные требования: 48 kHz, 16-bit stereo.
Обычная беда автогенераторов видео — вертикальные или квадратные фотографии из соцсетей с уродливыми черными полосами по бокам, либо сплюснутые пропорции.
В 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). Картинка идет абсолютно плавно, как по рельсам операторской тележки.
В вещании звук диктора является абсолютным хозяином хронометража: видеоряд обязан подстраиваться под голос, а не наоборот.
Каждый сюжет монтируется по строгим правилам телевизионного монтажа:
Lead-In (вводная пауза): 1.0 секунда. Первый слайд показывается зрителям в тишине ровно одну секунду до того, как диктор начинает говорить, чтобы зритель успел зафиксировать визуальный контекст новости.
Voice Duration (читка диктора): измеряется программно с субсекундной точностью (например, 46.4 секунды).
Lead-Out (финальная пауза): 3.0 секунды. После того как диктор закончил последнюю фразу, финальный слайд удерживается на экране еще 3 секунды.
Общий хронометраж слайд-шоу:
(Для читки 46 секунд общая длительность составит ровно 50 секунд).
Если к новости прикреплено медиафайлов (фотографии и видеоролики B-Roll), длина каждого отдельного фрагмента вычисляется автоматически:
Например, при 50 секундах и 7 кадрах каждый фрагмент продлится ровно 7.14 секунды. Никаких черных экранов или обрывов видеоряда!
В сюжет можно вставлять не только фото, но и настоящие видеосъемки: проезды улиц, виды города с дрона, переправу через Волгу или дорожные ремонты.
При монтаже каждого 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): исходный звук видеоролика (шум мотора дрона, ветер) полностью вырезается, чтобы не конфликтовать с диктором и музыкой.
Голос диктора задерживается на 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 Видео плавно уходит в затемнение одновременно с затиханием музыки и фонового шума.
Логотип телеканала накладывается с сохранением честного альфа-канала прозрачности (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]
Это гарантирует, что логотип стоит ровно на всех кадрах сюжета, не съезжает и не деформируется.
В V-GEN реализована гибкая работа с файловыми путями прямо через веб-интерфейс админки.
В админке можно указать несколько путей к папкам с B-Roll:
Например: F:КОНСЕРВЫ, D:ВидеоАрхив_Город, E:Дрон_Съемки. Эти ролики можно также вставлять в сюжет, чередуя с автоматически найденными картинками.
Сервис динамически проверяет доступность папок и показывает статус: «Доступно (N видео)» зеленым цветом или «Не найдена» красным.
В модальном окне выбора B-Roll на главной странице добавлен выпадающий список для быстрого переключения между базами, а строка глобального поиска ищет видеоролики сразу по всем подключенным папкам одновременно!
Для разных типов новостей нужна разная музыка: для праздников — динамичная, для ЖКХ — нейтральная, для происшествий — строгая или режим «Без музыки» (траурная тишина).
В админ-панели реализован полноценный менеджер треков:
Возможность указать любое количество путей к аудиофайлам (.wav, .mp3, .aac, .flac).
Назначение понятных названий трекам («Эфирная тема ТВТ», «Динамичный репортаж», «Спокойный фон»).
Кнопка «Загрузить аудио»: файл сохраняется в сервис и автоматически добавляется в список.
Встроенный аудиоплеер для предпрослушивания любого трека прямо в браузере.
Выбор основного трека по умолчанию.
В новостной ленте: для каждого сюжета перед генерацией видео выведен выпадающий список, где в один клик можно выбрать конкретный трек или вариант «Без музыки».
Путь к видеофайлу заставки (отбивка.mp [7]4) с видеоплеером проверки.
Путь к логотипу канала (логотип.png) с кнопкой мгновенной загрузки нового PNG.
Смонтированное видео сразу получает имя файла по заголовку новости на русском языке, например: МФО вводят новые лимиты кредитов в Тутаеве.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
Браузер сохраняет файл с чистым русским названием, готовым к моментальной отправке в эфирный плейлист вещательного сервера без ручного переименования.
Интерфейс построен на FastAPI, Jinja2, TailwindCSS и FontAwesome:
Главная страница (/):
Кнопка запуска сбора новостей за 7 дней с индикатором прогресса в реальном времени.
Карточки сюжетов: заголовок, хронометраж читки, количество символов текста, блок редактирования текста диктора.
Галерея медиафайлов: фото и видеоролики B-Roll с возможностью добавления из поисковика, загрузки с ПК или выбора из архива города.
Индивидуальная перегенерация голоса диктора при правках текста.
Селектор фоновой музыки и кнопка запуска рендеринга видео.
Индикатор прогресса монтажа с шагами в процентах и встроенный плеер готового сюжета.
Админ-панель (/admin):
Управление ключом Gemini API и проверка связи.
Выбор модели LLM и переключатель Grounding Google Search.
Редактор системного редакционного промпта.
Выбор диктора Gemini TTS.
Менеджер папок B-Roll и треков фоновой музыки.
Таблица источников новостей (включение/отключение RSS, пабликов VK, Telegram-каналов) с кнопками проверки доступности.
Архив видеороликов (/archive):
Все сгенерированные сюжеты в одном месте с возможностью просмотра, скачивания под русскими именами и очистки диска.
Сервис оптимизирован для работы на Windows, а также запускается на Linux и macOS.
Откройте Проводник (Win + E) и перейдите на любой удобный диск (например, C:, D: или F:).
Создайте новую папку (например, V-GEN или новостник) и зайдите в неё.
Лайфхак для Windows: кликните левой кнопкой мыши по адресной строке Проводника вверху, введите cmd и нажмите Enter. Сразу откроется черное окно командной строки, уже смотрящее в созданную папку.
Склонируйте файлы репозитория:
git clone https://github.com/ondocomposer-cmyk/V-GEN.git .
(Точка в конце скачает проект прямо в текущую открытую вами папку).
Убедитесь, что у вас установлен Python 3.10 или новее, а также FFmpeg (должен быть добавлен в системный PATH).
Установите зависимости:
pip install -r requirements.txt
(В requirements входят: fastapi, uvicorn, google-genai, httpx, pillow, beautifulsoup4, feedparser, jinja2, pydantic и др.)
Перейдите на Google AI Studio [9].
Нажмите Create API key (создание бесплатного ключа занимает 15 секунд, банковская карта не требуется).
Скопируйте ключ вида AIzaSy....
Запустите сервис командой:
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]
Перейдите во вкладку «Админ-панель» (http://localhost:8000/admin [11]).
Вставьте ваш Gemini API Key и нажмите кнопку «Проверить» — система подтвердит связь с нейросетью.
Проверьте переключатель «Поиск Google в реальном времени (Grounding)» — он должен быть включен.
Отредактируйте «Поисковый и редакционный промпт» под специфику вашего города или региона.
Выберите диктора (по умолчанию эталонный Callirrhoe).
В блоке медиа укажите пути к вашим папкам с видео B-Roll и настройте треки фоновой музыки.
Загрузите PNG логотип канала и укажите путь к файлу заставки отбивка.mp [7]4.
Нажмите «Сохранить все настройки».
Теперь на главной странице достаточно нажать «Собрать и обработать новости за 7 дней» — и через несколько десятков секунд у вас будет готовая телевизионная верстка сюжетов в Full HD!
V-GEN выполняет рутинные задачи редакции за копейки. Буду рад вашим отзывам и конструктивной критике!
Автор проекта: Дмитрий Асанов
Telegram: @sandefiord [1]
E-mail: asanov@lux.tv.ru [2]
GitHub: github.com/ondocomposer-cmyk/V-GEN [3]
Автор: 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
Нажмите здесь для печати.