Как с помощью Opus 5.5 превратить CSV в видео с диаграммой
Подготовьте задание для Opus 5.5, проверьте CSV и соберите 12-секундное видео в Python и FFmpeg. Готовый проект, проверка чисел и разбор ошибок.
Чтобы сделать видео с диаграммой при помощи Opus 5.5, передайте ему проверенные данные и точное описание макета, затем нарисуйте кадры в Python и закодируйте их через FFmpeg. Исходные числа должны оставаться неизменными. Удлиняющаяся полоса на экране не должна незаметно превращаться в утверждение, что бизнес-показатель рос со временем.
В этой инструкции мы собираем один небольшой воспроизводимый результат: MP4 длительностью 12 секунд с разрешением 1280 × 720, который показывает три категории из CSV. Материал рассчитан на тех, кто превращает отчёты в видео для презентаций или соцсетей и готов выполнить локальные команды. Вы подготовите данные, получите полноценное задание для Claude, просмотрите диаграмму, экспортируете видео и проверите числа в готовом файле. Общие настройки и другие способы работы разобраны в руководстве по видео с Opus 5.5.
Посмотрите результат и скачайте проект
Это реальный локальный рендер примера, подготовленного редакцией. Числа синтетические, подписи на английском, звук намеренно отсутствует. Это не данные о клиентах, выручке или обращениях в поддержку Ofox.
Скачайте полный проект, MP4 и полный промпт.
Что именно проверено: текущая попытка вызвать Opus 5.5 через Claude Code завершилась ошибкой, поскольку в сеансе не был выполнен вход. Поэтому редакция написала эталонную реализацию и проверила валидацию CSV и рендер через Python/FFmpeg. Мы не называем её свежим ответом Opus или результатом успешной генерации с первой попытки. Вы можете использовать промпт со своим разрешённым доступом к Claude либо воспроизвести готовый проект без обращения к модели. В отдельной, более ранней инструкции по видео из скриншотов задокументирован успешный вызов модели для того проекта; он не подтверждает успех нынешней попытки.
Определите, какие выводы допускают данные
Пример сравнивает число обращений по каналам. Это не хронологическая последовательность, не воронка конверсии и не график роста. От этого зависит и анимация, и текст озвучки, которую вы, возможно, добавите позже.
| Категория | Количество | Значение в этом примере |
|---|---|---|
| 120 | Синтетическое число обращений в категории Email | |
| Chat | 180 | Синтетическое число обращений в категории Chat |
| Docs | 90 | Синтетическое число обращений в категории Docs |
Всего получается 390 обращений. В этом вымышленном примере у Chat на 60 обращений больше, чем у Email. Это не доказывает, что Chat лучше конвертирует, экономит время или повышает удовлетворённость пользователей. Для таких выводов нет ни знаменателей, ни измерений результата.
Начинайте шкалу с нуля и используйте один диапазон 0–200 для всех трёх полос. Их итоговая ширина составит 60%, 90% и 45% области построения. Зритель должен сравнивать полосы напрямую, без поправок на разные шкалы. Не обрезайте ось ради более эффектной разницы.
Для реальных данных сохраните рядом с CSV источник, дату выгрузки, часовой пояс отчётности, единицы и правило агрегации. Проверьте, не пересекаются ли категории: при пересечении их сумма может не быть числом уникальных объектов. Удалите персональные данные перед отправкой в промпте и передавайте только те сведения, которые вам разрешено использовать.
Подготовьте воспроизводимое окружение
Архив содержит sample.csv, prepare.py, test_prepare.py, render.py, requirements.txt, prompt.txt и README. Для примера нужны Python 3.9 или новее, Pillow 11.3.0 и доступный в командной строке FFmpeg с кодировщиком H.264 (libx264). Текст рисуется локальным шрифтом TrueType. Для рендера готового проекта не нужны ни браузер, ни API модели.
Распакуйте архив в локальный каталог и выполняйте команды из него. Создайте виртуальное окружение командой python3 -m venv .venv. В macOS/Linux активируйте его через source .venv/bin/activate, в Windows PowerShell — через .venv\Scripts\Activate.ps1. Затем установите зависимости и проверьте окружение:
python3 -m pip install -r requirements.txt
python3 prepare.py
python3 -m unittest test_prepare.py
ffmpeg -version
Ожидаемое сообщение подготовки: Validated 3 rows. Total: 390. Если результат отличается, остановитесь и выясните причину. Пять тестовых методов проверяют корректный ввод, нулевые и граничные значения, запятую внутри подписи в кавычках, недопустимые значения и неправильно оформленные строки. Успешная проверка парсера ещё не означает успешный рендер видео.
Укажите в CHART_FONT путь к локальному шрифту TrueType, на использование которого у вас есть право. Например, в macOS, если такой файл существует:
export CHART_FONT='/System/Library/Fonts/Supplemental/Arial.ttf'
В Linux установленный DejaVu Sans может находиться по пути /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf. В Windows PowerShell установленный Arial можно выбрать командой $env:CHART_FONT='C:\Windows\Fonts\arial.ttf'; вместо python3 используйте свою команду запуска Python, часто это python. Это примеры путей, а не гарантия наличия шрифтов на каждом компьютере. Шрифты в архив не включены. Выбирайте шрифт с нужными символами, в том числе кириллицей для русских подписей, и проверяйте его лицензию.
Если команда FFmpeg отсутствует, установите его доверенным способом для своей системы. На странице загрузки FFmpeg перечислены варианты для разных платформ. Чтобы просить Claude писать или менять код, нужен собственный доступ; запросы могут расходовать лимит вашего плана. Выполнение предоставленного Python-кода не обращается к модели. Этот локальный пример не подтверждает совместимость какой-либо платной услуги или API.
Проверьте CSV до передачи модели
Используйте именно такой заголовок и образец:
label,value
Email,120
Chat,180
Docs,90
Парсер использует стандартный CSV reader Python, поэтому подпись "Email, shared" в кавычках остаётся одной ячейкой. Поддерживается UTF-8 с маркером порядка байтов (BOM) и без него. Парсер отклоняет изменённый заголовок, повторяющиеся или пустые подписи, лишние ячейки, другое число строк, нечисловые значения, отрицательные и дробные числа, бесконечность и значения выше максимума шкалы.
Строгость здесь намеренная: макет рассчитан на три категории с целыми количествами. Пропущенное измерение нельзя незаметно превращать в ноль, дробную долю — округлять до количества, а значение 240 — обрезать до 200 и показывать как правильную полосу.
Чтобы проверить другой файл, выполните python3 prepare.py my-data.csv. Вспомогательный скрипт записывает data.json только после успешной проверки всех строк. Для рендера своих данных сохраните резервную копию образца, замените sample.csv и снова запустите проверку. При каждом запуске рендерер непосредственно читает и проверяет sample.csv; он не подставляет незаметно JSON от предыдущей проверки.
Если проверка завершилась ошибкой, старый out/chart.mp4 может остаться на диске. Не выдавайте его за результат успешного нового рендера. Рендерер сначала записывает временный MP4 и заменяет итоговый файл только после успешного завершения FFmpeg. Вместе с результатом сохраняйте вывод успешной команды и out/accepted-data.json.
Длина подписи ограничена 24 символами. Кроме того, рендерер отклоняет подписи шире 200 пикселей в выбранном шрифте, чтобы они не заходили на диаграмму. Сократите текст, объяснив сокращение, либо осознанно переработайте колонку подписей. Число символов само по себе не гарантирует удачную компоновку, а наличие всех глифов нужно проверить визуально.
Дайте Opus полное задание с чёткими ограничениями
Приложите проверенные строки или вставьте их вместе со спецификацией ниже. Полный промпт для скачивания также содержит координаты, правила валидации и параметры типографики эталонного макета. Это сокращённое задание удобно для изменения уже скачанного проекта:
Edit this existing Python/Pillow and FFmpeg project to make a 12-second chart video.
Read sample.csv with the existing prepare.py parse() validator.
It contains exactly three rows: Email 120, Chat 180, Docs 90.
These are synthetic ticket counts, not real company results.
Keep output at 1280x720, 30fps and 360 RGB frames.
Keep a zero baseline and a shared, fixed maximum of 200.
Keep the exact numeric labels visible and unchanged at every frame.
Reveal bar widths only between frames 30 and 90; hold thereafter.
Use progress=max(0,min(1,(frame-30)/60)) for the reveal.
Do not use random values, network data or new packages.
Keep a permanent label: Synthetic example · tickets · fixed scale 0–200.
State that the reveal is not growth over time.
Preserve CSV validation and do not substitute zero for missing values.
If a value exceeds the maximum, stop and explain; do not clip it.
Return the changed file, explain changes, and give the render command.
Do not invent a test result. List tests that still need to be run.
Промпт оставлен на английском, чтобы он соответствовал тексту в скачиваемом примере. Основные требования: сохранить значения и фиксированную шкалу, анимировать только появление полос и честно перечислить ещё не выполненные тесты.
Прочитайте ответ перед запуском кода. Сопоставьте изменения зависимостей и операции с файлами со своим запросом. Установка пакета, загрузка данных в сеть или перезапись файла — отдельное действие; выполнять его только потому, что оно встретилось в сгенерированной инструкции, не требуется. Для этой небольшой диаграммы имеющихся зависимостей достаточно.
Если хотите рассказать другую историю, сначала измените задание. Просьба «сделай эффектнее» разрешает модели добавлять движение, но не объясняет, какие факты должны оставаться неизменными. Лучше сформулировать так: «Сохрани все значения и шкалу; сделай двухсекундное вступление, затем показывай готовую диаграмму не менее шести секунд».
Разберитесь с таймлайном и проверьте шкалу
При 30 кадрах в секунду 360 кадров дают 12 секунд. В примере область полос остаётся пустой первую секунду, затем полосы раскрываются в течение двух секунд, а оставшиеся девять секунд готовая диаграмма стоит на экране, чтобы её можно было прочитать.
| Кадры | Время | Ожидаемое изображение |
|---|---|---|
| 0–29 | От 0 до менее 1 с | Видны заголовок, подписи, точные значения и ось; ширина полос нулевая |
| 30–89 | От 1 до менее 3 с | Полосы раскрываются; числовые подписи не меняются |
| 90–359 | От 3 до менее 12 с | Все полосы сохраняют итоговую длину |
Основной расчёт занимает две строки:
progress = max(0, min(1, (frame - 30) / 60))
width = round(value / 200 * 820 * progress)
Ширина области построения — 820 пикселей. В конечном состоянии ширина Email равна 492 пикселям, Chat — 738, Docs — 369. В кадре 60 раскрытие проходит половину пути с учётом округления до пикселя, но подписи по-прежнему показывают исходные числа. Это появление диаграммы, а не промежуточное измерение.
Ограничение удерживает прогресс между нулём и единицей. Без него линейный расчёт может дать отрицательную ширину до начала анимации или чрезмерно длинные полосы после её окончания. Выход за итоговое значение в анимации данных может создать впечатление, что показатель был выше реального. В примере такой эффект намеренно исключён.
Экспортируйте MP4 и проверьте сам файл
После успешной валидации и настройки CHART_FONT запустите рендер:
python3 render.py
Скрипт рисует 360 RGB-кадров с помощью Pillow и передаёт их по каналу в FFmpeg. Для запуска используется список аргументов, а не shell-команда, собранная из содержимого CSV. Параметры кодирования: libx264, yuv420p, без звука, с +faststart. Документация FFmpeg описывает параметры ввода, вывода и кодирования; справочник рисования Pillow — примитивы, из которых состоят кадры.
Ожидаемый результат — out/chart.mp4, четыре кадра для проверки и копия принятых данных. Проверьте воспроизведение в приложении, где будете использовать видео. Успешный код завершения процесса не доказывает ни читаемость текста, ни корректность представления данных.
Если инструменты FFmpeg установлены, отдельно проверьте выходной файл:
ffprobe -v error -select_streams v:0 \
-show_entries stream=codec_name,width,height,r_frame_rate,nb_frames \
-show_entries format=duration -of json out/chart.mp4
Для неизменённого образца ожидаются H.264, 1280 × 720, частота кадров 30/1 и длительность 12 секунд. Метаданные о числе кадров доступны не для каждого контейнера: отсутствие поля не означает ноль кадров. Просмотрите начало, раскрытие полос и финальную неподвижную часть. Убедитесь, что итоговые числа — 120, 180 и 90, а шкала по-прежнему обозначена как 0–200. Аудиодорожки в этом образце нет по замыслу.
Исправляйте ошибки, не меняя смысл данных
| Симптом | Что проверить первым | Подходящее исправление |
|---|---|---|
prepare.py сообщает о недопустимом значении | Пустые ячейки, дробные доли, запятые как разделители тысяч | Исправьте формат данных; не подставляйте ноль вместо пропуска |
| Значение превышает 200 | Действительно ли это количество и верно ли выбрана единица | Одновременно задайте новый общий максимум в валидации, расчёте ширины, делениях и подписи |
| Новые числа из CSV не появились | Заменён ли sample.csv в рабочем каталоге и завершился ли рендер успешно | Проверьте этот файл, повторите рендер и изучите новый MP4 и out/accepted-data.json |
| Рендерер отклоняет широкую подпись | Ширину текста в выбранном шрифте и языке | Используйте объяснённое сокращение либо переделайте колонку подписей и проверьте область построения |
Отсутствует ffmpeg или libx264 | Путь к команде и поддержку кодировщика в установленной сборке | Установите подходящую сборку FFmpeg из доверенного источника и повторите проверку версии |
| В MP4 нет звука | Предусмотрено ли аудио в проекте | Здесь тишина ожидаема; при необходимости добавьте звук по связанной инструкции |
| Полосы продолжают расти | Границы прогресса или дополнительную анимацию, внесённую моделью | Верните расчёт по номеру кадра с ограничением прогресса от нуля до единицы |
Более крупный набор данных требует решения по дизайну, а не просто более длинного массива. Для десяти категорий может понадобиться более высокий макет, группировка или несколько сцен. Отрицательные значения требуют оси с положительным и отрицательным направлениями. Проценты — явного знаменателя и правила форматирования. Проверка примера с тремя количествами не распространяется на эти изменения.
Передавайте данные вместе с видео
Включите в комплект принятый CSV, исходный проект, итоговый MP4 и короткое описание источника, единиц, шкалы, параметров экспорта и происхождения данных: реальные они или синтетические. При публикации образца оставьте видимую пометку о синтетических данных. Не заменяйте её логотипом компании, позволяя зрителю принять числа за бизнес-результаты.
Для версии с озвучкой используйте инструкцию по синхронизации голоса и субтитров. Она основана на другом проекте Remotion; её команды нельзя напрямую переносить в этот Python-архив. Для вертикального ролика прочитайте инструкцию по адаптации горизонтального макета: простая смена размеров без перестановки подписей сделает диаграмму трудночитаемой. Если следующему видео нужен контекст продукта, а не данные, подходящей отправной точкой станет демопроект с реальными скриншотами.
Модель полезна как помощник в написании и изменении анимации. А доверие к итоговому объяснению обеспечивают проверенный CSV, явная шкала и просмотр действительно отрендеренного файла.
Часто задаваемые вопросы
- Opus 5.5 сам создаёт файл MP4?
- В этом процессе Claude помогает писать или редактировать код. Python рисует кадры, а FFmpeg кодирует видео. Доступный для скачивания пример подготовлен редакцией и проверен локально; он не представлен как новый результат генерации Opus.
- Можно подставить в CSV свои числа?
- Да, после проверки требований к данным. Пример принимает ровно три уникальные подписи и целые значения от 0 до 200. Прежде чем добавлять строки или увеличивать значения, нужно явно изменить макет и шкалу.
- Почему числа не меняются, пока полосы удлиняются?
- Числа всё время показывают фактические значения. Анимация лишь раскрывает полосы; это не временной ряд и не свидетельство роста показателя.


