Перейти к содержимому
AI-агенты

Aphelia для Cursor: вертикальные Reels без видеогенерации

Aphelia для Cursor: вертикальные Reels без видеогенерации

Плагин Aphelia для Cursor начинает установку с того, что чистит папку назначения: строка Get-ChildItem $dest -Force | Where-Object { $_.Name -ne "vendor" } | Remove-Item -Recurse -Force в install-plugin.ps1 удаляет из %USERPROFILE%\.cursor\plugins\local\aphelia всё, кроме каталога vendor. Если ты уже правил там шаблоны под себя, правки исчезнут молча.

Сам плагин — MIT, версия 1.0.0 в манифесте .cursor-plugin/plugin.json. Он превращает ссылку, новость или тему в вертикальный ролик 60–90 секунд: 10 субагентов Cursor работают волнами, часть — параллельно. На выходе aphelia-memory/runs/<slug>/out/<slug>.mp4, 1080×1920, громкость нормализована до −14 LUFS (единица измерения воспринимаемой громкости; −14 LUFS — типовой уровень для соцсетей), с флагом faststart.

Видеогенерации здесь нет вообще. Кадры собирает Remotion — React-фреймворк, который рендерит композицию через headless Chrome и FFmpeg. В templates/remotion/package.json версия закреплена жёстко: remotion 4.0.520, React 19.2.3.

Что делает Aphelia на самом деле

Оркестратор описан в rules/aphelia-orchestrator.mdc. Основной агент («Директор») сам ничего не пишет и не рисует — он раздаёт задачи через Task и ждёт фрагменты отчётов.

Волна 1 — ресёрч. Волна 2 — сценарий. Волна 3 идёт параллельно: озвучка, два-три иллюстратора и скринкастер, который снимает прокрутку страницы-источника через Playwright. Волна 4 — сторибоард: агент выбирает стиль-пресет, переходы, звуки из каталога на 186 SFX и пишет бриф на музыку. Волна 5 — рендер. Волна 6 — QA и метаданные параллельно. Дальше фикс-луп не больше двух кругов.

Голос — Qwen3-TTS 12Hz-1.7B, две модели: VoiceDesign один раз проектирует диктора, Base клонирует его на каждом предложении. Музыка — ACE-Step 1.5, генерируется под настроение ролика. Фон у картинок вырезает rembg.

Одно требование орккестратора ломает «поставил и забыл»: текстовые агенты (researcher, writer, publisher) прибиты к gemini-3.7-flash-high, и правило прямо запрещает подменять его Composer или Grok — «если 3.7 тоже недоступен — написать в handoff и остановиться». На записи занятия автор гонял прогон на автовыборе модели, и стиль референса подхватился частично. Что именно ломается при подмене модели, репозиторий не объясняет.

Что нужно, прежде чем начать

  • Windows с PowerShell. Установщик в репозитории один — install-plugin.ps1; скриптов для macOS и Linux в дереве файлов нет.
  • Cursor с включённой загрузкой локальных плагинов. По документации Cursor локальные плагины лежат в ~/.cursor/plugins/local и подхватываются после перезапуска.
  • Python 3.12 или новее, а в нём: qwen-tts, openai-whisper, ruaccent, rembg, torch и torchaudio со сборкой под CUDA, soundfile, Pillow.
  • Node.js 20 или новее.
  • uv — менеджер окружений для Python, через него ставится ACE-Step.
  • ffmpeg и ffprobe в PATH.
  • Видеокарта не меньше 12 ГБ памяти — так написано в README, требование покрывает связку Qwen3-TTS 1.7B и ACE-Step 2B turbo. Отдельно ACE-Step на своей карточке заявляет менее 4 ГБ.
  • Около 5 ГБ на диске под веса ACE-Step: они качаются не при установке, а при первой генерации музыки.

На чём это проверялось: в репозитории не указано ни версии Windows, ни версии Cursor, ни даты прогона. Проверяемые из файлов величины — Remotion 4.0.520 и React 19.2.3 из package.json, версия плагина 1.0.0 из манифеста. Я разбирал код и документацию, а не выполнял установку на живой машине.

Установщик необратим в двух местах. Он вычищает папку назначения (кроме vendor) и удаляет каталог предыдущей версии плагина, если он назывался framepro: Remove-Item $legacy -Recurse -Force. Перед запуском сделай копию, если там что-то было:

Copy-Item "$env:USERPROFILE\.cursor\plugins\local\aphelia" "$env:USERPROFILE\.cursor\plugins\local\aphelia-backup" -Recurse

Как поставить плагин и собрать первый ролик

Шаг 1. Проверь версии инструментов

Установщик падает на первой же нехватке — $ErrorActionPreference = "Stop" стоит в начале скрипта. Открой PowerShell в любой папке и выполни четыре команды: python --version, node --version, ffmpeg -version, uv --version.

Ожидаемый результат: Python 3.12 или выше, Node 20 или выше, FFmpeg отвечает баннером с версией. Если uv не найден — это нормально, его ставит следующий шаг. Если не найден ffmpeg, дальше идти нет смысла: рендер и нормализация громкости упрутся в него.

Шаг 2. Поставь uv

Без него установщик пропустит ACE-Step и напишет об этом жёлтым. Команду он подсказывает сам, она же в его исходнике:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Ожидаемый результат: после перезапуска терминала uv --version печатает номер версии.

Шаг 3. Поставь Python-зависимости

Готовой команды в репозитории нет — README даёт только список пакетов. Собери его сам, кроме torch:

pip install qwen-tts openai-whisper ruaccent rembg soundfile Pillow

torch и torchaudio ставь отдельно, сборкой под свою версию CUDA — команда зависит от драйвера и берётся на сайте PyTorch. В репозитории нужного индекса нет, придумывать его я не буду: чужая команда установки torch ставит CPU-сборку, и озвучка потом уходит на процессор.

Ожидаемый результат — та же проверка, которую в конце делает установщик:

python -c "import qwen_tts, whisper, ruaccent, rembg, torchaudio, PIL; print('python deps OK')"

В терминале должно появиться python deps OK. Если вылетает ModuleNotFoundError, смотри имя модуля в тексте ошибки: qwen_tts ставится пакетом qwen-tts, whisper — пакетом openai-whisper, PIL — пакетом Pillow.

Шаг 4. Склонируй репозиторий

git clone https://github.com/Horosheff/aphelia.git
cd aphelia

Ожидаемый результат: в папке лежат install-plugin.ps1, каталоги rules, agents, skills, commands, scripts, shared, templates, voices.

Шаг 5. Запусти установщик

Из корня склонированной папки:

.\install-plugin.ps1

Скрипт копирует файлы в %USERPROFILE%\.cursor\plugins\local\aphelia, ставит npm-зависимости шаблона Remotion, ставит зависимости для скринкастов и качает Chromium через npx playwright install chromium, клонирует ACE-Step 1.5 в vendor\ace-step и делает uv sync.

Ожидаемый результат — в терминале по очереди проходят строки Installing Aphelia -> ..., npm install (Remotion template)..., npm install (Playwright capture)..., ACE-Step 1.5 (music generation, MIT)..., Python deps check... и в конце Done. Restart Cursor (or Developer: Reload Window). Последней строкой идёт Task types (10): aphelia-researcher, writer, voice, illustrator, screencaster, storyboarder, renderer, guardian, publisher, fixic.

Если вместо ACE-Step появилось жёлтое uv not found — вернись к шагу 2 и запусти установщик заново, музыки без этого не будет.

Шаг 6. Перезапусти Cursor

Task-субагенты подхватываются только из .cursor/agents и %USERPROFILE%\.cursor\agents — установщик кладёт их туда сам, но живому процессу Cursor об этом не сообщает. Закрой редактор и открой заново либо выполни в палитре команд Developer: Reload Window.

Шаг 7. Убедись, что плагин виден

Открой в боковой панели Customize и найди раздел с плагинами. Ожидаемый результат: в списке есть Aphelia, а в чате по вводу слэша доступны команды /aphelia-new, /aphelia-voice, /aphelia-render.

Плагина нет в списке — проверь, что папка называется ровно aphelia и внутри неё лежит .cursor-plugin/plugin.json: именно по этому манифесту Cursor опознаёт формат. В маркетплейсе плагина может не быть вовсе — README говорит, что он на ревью, а Cursor проверяет каждый плагин вручную.

Шаг 8. Запусти прогон

Открой чат в той папке, где хочешь держать результаты — память пишется в ./aphelia-memory/ текущего workspace, а не рядом с плагином. Дай команду с темой или ссылкой:

/aphelia-new https://example.com/news/post --duration 75

Длительность по умолчанию 75 секунд, допустимый диапазон 60–95. Без аргумента команда не стартует: правило требует задать один вопрос «Кинь тему, ссылку или текст» и остановиться.

Ожидаемый результат: Директор пишет .cursor/aphelia-handoff.md, запускает scripts/init_run.py и дальше идёт волнами. Если фирменного голоса ещё нет, перед волнами один раз отработает voice.py design-voice и создаст voices/narrator-ru/ref.wav.

Шаг 9. Проверь результат

Не по слову «готово» в чате, а прогоном QA-скрипта:

python scripts/qa.py --project aphelia-memory/runs/<slug>

Подставь свой <slug> — латиница с дефисами, до 30 символов, генерируется из темы (например, dreamx-creator). Ожидаемый результат: файл aphelia-memory/runs/<slug>/out/<slug>.mp4 на месте, рядом лежит контакт-лист кадров qa/contact.jpg, а отчёт qa-report.md заканчивается вердиктом PASS. При FIX сторибоардер и рендерер отрабатывают ещё раз, не больше двух кругов.

Если конфигурация не совпала

Видеокарта меньше 12 ГБ

Локальный стек так и останется локальным: Qwen3-TTS и ACE-Step считаются на твоей карте. Замены в репозитории нет — shared/voice-contract.md формулирует однозначно: «только Qwen3-TTS 12Hz-1.7B». Внешний синтез речи в плагин не заложен, на занятии его прикручивали правками через агента прямо в чате. Готовых шагов для этого в первоисточнике нет, и выдумывать их здесь я не стану: цена ошибки — переписанный scripts/voice.py и ключ, уехавший в репозиторий.

Что можно сделать без переписывания: отдать готовую озвучку. Пайплайн строится вокруг assets/vo.mp3 и таймингов слов assets/vo-words.json, которые снимает Whisper. Насколько корректно подставить сюда чужой файл, документация не описывает — это место придётся проверять руками.

macOS или Linux

Установщика под них нет. Копировать файлы и регистрировать агентов придётся вручную, повторяя логику install-plugin.ps1: каталоги плагина в ~/.cursor/plugins/local/aphelia, файлы aphelia*.md из agents/ в ~/.cursor/agents, из commands/ в ~/.cursor/commands, затем npm install в templates/remotion и scripts/node. Проверено это или нет — репозиторий не говорит.

Где это ломается: ударения

Самая честная страница репозитория — shared/voice-contract.md. Ударения расставляет библиотека ruaccent (модель turbo3.1), в текст они уходят комбинируемым акутом U+0301 после гласной: + и запись капсом модель игнорирует.

Метки по умолчанию не ставятся, и вот почему. Замер на прогоне dreamx-creator, два захода по 12 предложений: акут в клон-дубле примерно в трети случаев даёт слышимый призвук после ударной гласной — «Алиба́бы» превращается в «Алибоюбы», «Минима́кса» в «минимайуса». Тот же текст без меток Whisper слышит чисто.

Поэтому первый дубль генерируется без меток, метки навешиваются только на слова из списка qwen_force_marks, словаря заимствований и файла stress-overrides.json конкретного ролика. Маркированный дубль заменяет чистый лишь при сходстве не ниже 0,97 и только если Whisper услышал каждое размеченное слово целиком.

Проверка ударения через MMS forced alignment в контракте понижена до советующей: точность около 80% на омографах, призвук она принимает за ударение. Список сомнительных мест уходит в voice-report.json → doubtful_stress — это заявка на ручное прослушивание, а не вердикт. Часть слов не лечится вообще, и контракт предлагает не бороться метками, а возвращать сценариста на переформулировку.

Темп речи — около 2,35 слова в секунду по замеру, то есть на 60–90 секунд нужно 140–215 слов.

Как всё это откатить

Плагин живёт в трёх местах, и удалять надо все три:

Remove-Item "$env:USERPROFILE\.cursor\plugins\local\aphelia" -Recurse -Force
Get-ChildItem "$env:USERPROFILE\.cursor\agents" -Filter "aphelia*.md" | Remove-Item -Force
Get-ChildItem "$env:USERPROFILE\.cursor\commands" -Filter "aphelia*.md" | Remove-Item -Force

Команды собраны по зеркальной логике установщика — он сам так вычищает файлы предыдущей версии. Папку aphelia-memory в рабочем каталоге удалять не обязательно: там лежат прогоны, а не сам плагин. После удаления перезапусти Cursor, иначе Task ещё будет показывать типы aphelia-*.

Отдельный счёт, который эта установка не показывает: Remotion — не open source, а ACE-Step, Qwen3-TTS и Mixkit лежат под разными лицензиями. Разбор того, кому и за что придётся заплатить, — в материале про лицензию Remotion и деньги в конвейере Reels.

Источники