# SKILL.md — heygen-video ## Назначение Генерация видеокружочков (video notes) в Telegram через HeyGen API. Аватарка Стрим "говорит" голосом ElevenLabs с синхронизацией губ через HeyGen. --- ## Архитектура ``` Текст → ElevenLabs TTS → MP3 файл ↓ HeyGen Upload API (MP3 → audio_url) ↓ HeyGen Video API (talking_photo + audio → MP4) ↓ Poll Status → Download MP4 ↓ FFmpeg (обрезать до 512×512) ↓ Telegram sendVideoNote ``` --- ## Компоненты ### 1. ElevenLabs TTS API - **Назначение:** генерация голоса из текста - **Endpoint:** `https://api.elevenlabs.io/v1/text-to-speech/{voice_id}` - **Голос:** `TPIitICAZ8CqlGZ81AKm` (голос Стрим) - **Модель:** `eleven_multilingual_v2` - **Выход:** MP3 файл - **Ключ:** `ELEVENLABS_API_KEY` в `~/.openclaw/.env` ### 2. HeyGen Upload API - **Endpoint:** `POST https://upload.heygen.com/v1/asset` - **Header:** `X-API-Key: {key}` - **Content-Type:** определяется по типу файла - MP3: `audio/mpeg` - JPG: `image/jpeg` - **Body:** raw binary файл - **Response:** `{"code": 100, "data": {"url": "https://resource2.heygen.ai/..."}}` ### 3. HeyGen Video Generate API - **Endpoint:** `POST https://api.heygen.com/v2/video/generate` - **Header:** `X-API-Key: {key}`, `Content-Type: application/json` - **Body:** ```json { "video_inputs": [{ "character": { "type": "talking_photo", "talking_photo_id": "" }, "voice": { "type": "audio", "audio_url": "" } }] } ``` - **Response:** `{"data": {"video_id": ""}}` ### 4. HeyGen Video Status API (polling) - **Endpoint:** `GET https://api.heygen.com/v1/video_status.get?video_id={id}` - **Header:** `X-API-Key: {key}` - **Response:** - `{"data": {"status": "pending"}}` — ещё - `{"data": {"status": "completed", "url": "https://..."}}` — готово - `{"data": {"status": "failed"}}` — ошибка - **Polling:** каждые 5 сек, max 300 сек (5 мин) ### 5. FFmpeg - Конвертация MP4 в квадрат 512×512 - Путь: `/home/node/bin/ffmpeg-7.0.2-amd64-static/ffmpeg` ### 6. Telegram sendVideoNote API - Отправка MP4 как video note - Лимит: 512×512, до 60 сек, до 50MB --- ## Файлы - `SKILL.md` — этот файл - `scripts/generate_heygen_video.py` — основной скрипт генерации - `scripts/send_heygen_video.sh` — shell-обёртка для отправки --- ## Переменные окружения (`~/.openclaw/.env`) ``` ELEVENLABS_API_KEY= HEYGEN_API_KEY= HEYGEN_TALKING_PHOTO_ID= ``` --- ## generate_heygen_video.py **Использование:** ```bash python3 generate_heygen_video.py "Текст для озвучки" [output_path] ``` **Параметры:** - Аргумент 1: текст для озвучки (обязательно) - Аргумент 2: путь для сохранения MP4 (опционально, по умолчанию `/tmp/heygen_video_{timestamp}.mp4`) **Выход:** путь к MP4 файлу или error **Шаги:** 1. Генерирует MP3 через ElevenLabs 2. Определяет длительность через ffprobe 3. Загружает MP3 в HeyGen 4. Создаёт видео через HeyGen API 5. Polling статуса каждые 5 сек 6. Скачивает готовый MP4 7. Конвертирует в 512×512 через FFmpeg 8. Сохраняет результат **Обработка ошибок:** - Если видео > 60 сек — обрезать - Если файл > 50MB — логировать предупреждение - Если HeyGen вернул ошибку — вывести код и сообщение --- ## send_heygen_video.sh **Использование:** ```bash ./send_heygen_video.sh "Текст" ``` **Параметры:** - Аргумент 1: текст (обязательно) - BOT_TOKEN и CHAT_ID — из `~/.openclaw/.env` или аргументы **Выход:** `message_id` в stdout --- ## Аватарка `talking_photo_id` — ID обработанного talking photo в HeyGen. Создаётся один раз: 1. Загрузить фото в HeyGen 2. HeyGen обработает (1-2 мин) 3. Получить ID через API или интерфейс 4. Сохранить в `HEYGEN_TALKING_PHOTO_ID` --- ## Стоимость (актуально на 09.04.2026) | Компонент | Цена | |-----------|------| | ElevenLabs TTS (10 сек) | ~$0.01 | | HeyGen Avatar III (10 сек) | $0.17 | | **Итого за 10 сек** | **~$0.18** | vs VEED Fabric 480p: $0.86 (в 4.7 раза дешевле!) --- ## Ограничения - Макс длительность: 60 сек (Telegram limit) - Макс размер файла: 50MB - HeyGen: max 30 сек на генерацию, но можно обрезать - Фото: JPG/PNG, до 50MB, HeyGen сам оптимизирует