Оживляет портрет по записи речи: человек на фото говорит в такт голосу, двигается и меняет мимику, а длина ролика равна длине аудио — до 3 минут. Цена зависит от разрешения: 480p — 4 ₽/сек., 768p — 8 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Pruna P-Video 2 Pro Avatar делает говорящее видео из одного портрета и записи речи: человек на фото открывает рот в такт голосу, моргает, двигает головой и плечами. Длина ролика равна длине аудио, до 3 минут. Так делают ведущих для роликов и курсов, видеоответы от лица персонажа, озвученные поздравления и дубляж на другой язык.
Сценарии:
prompt описываете жесты, эмоцию и кадр, при желании включаете prompt_upsampling и выбираете разрешение.Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус, пока видео не будет готово.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Отдельного параметра режима нет: сценарий определяется тем, передаёте ли вы prompt, а качество - параметром resolution.
{
"tool": "pruna-ai-p-video-2-pro-avatar",
"input": {
"image": "https://cdn.example.com/portrait.jpg",
"audio": "https://cdn.example.com/voice.mp3",
"resolution": "768p"
}
}
tool - slug нейросети, всегда "pruna-ai-p-video-2-pro-avatar".input - параметры запуска. Поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
image | string (url) | Да | Ссылка на портрет человека или персонажа, которого нужно оживить. Одна картинка. Форматы: jpg, jpeg, png, webp. Лучше всего подходит фото, где лицо хорошо видно и не закрыто руками или волосами. |
audio | string (url) | Да | Ссылка на запись речи. Один файл длительностью от 1 до 180 секунд. Форматы: mp3, wav, m4a, aac, flac, ogg. От длительности аудио зависят длина видео и цена. |
prompt | string | Нет | Задание: жесты, эмоция, манера, план и кадр. Например: «Спокойно говорит в камеру, иногда кивает, план по пояс». До 2000 символов. Можно не передавать. |
resolution | enum | Да | Разрешение видео: 480p - 4 ₽ за секунду, 768p - 8 ₽ за секунду. Если поле не передано, используется 768p. |
prompt_upsampling | boolean | Нет | true - нейросеть сама дополнит задание описанием движений и мимики. false - задание выполняется как написано. На цену не влияет. Если поле не передано, используется false. |
Ссылки на файлы должны быть внешними http/https URL, доступными без авторизации. Расширение в ссылке должно совпадать с одним из допустимых форматов, иначе API вернёт validation_error.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pruna-ai-p-video-2-pro-avatar",
"input": {
"image": "https://cdn.example.com/portrait.jpg",
"audio": "https://cdn.example.com/voice.mp3",
"resolution": "768p"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pruna-ai-p-video-2-pro-avatar',
input: {
image: 'https://cdn.example.com/portrait.jpg',
audio: 'https://cdn.example.com/voice.mp3',
resolution: '768p',
},
}),
})
const data = await response.json()
console.log(data.id, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'pruna-ai-p-video-2-pro-avatar',
'input': {
'image': 'https://cdn.example.com/portrait.jpg',
'audio': 'https://cdn.example.com/voice.mp3',
'resolution': '768p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pruna-ai-p-video-2-pro-avatar",
"input": {
"image": "https://cdn.example.com/presenter.png",
"audio": "https://cdn.example.com/speech.wav",
"prompt": "Уверенно рассказывает новость, иногда кивает и показывает рукой, взгляд в камеру",
"resolution": "480p",
"prompt_upsampling": true
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pruna-ai-p-video-2-pro-avatar',
input: {
image: 'https://cdn.example.com/presenter.png',
audio: 'https://cdn.example.com/speech.wav',
prompt: 'Уверенно рассказывает новость, иногда кивает и показывает рукой, взгляд в камеру',
resolution: '480p',
prompt_upsampling: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'pruna-ai-p-video-2-pro-avatar',
'input': {
'image': 'https://cdn.example.com/presenter.png',
'audio': 'https://cdn.example.com/speech.wav',
'prompt': 'Уверенно рассказывает новость, иногда кивает и показывает рукой, взгляд в камеру',
'resolution': '480p',
'prompt_upsampling': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Пример для аудио длиной 9,4 секунды в 768p: длительность округляется вверх до 10 секунд, 10 × 8 ₽ = 80 ₽.
{
"id": "op_uuid-123",
"status": "queued",
"tool": "pruna-ai-p-video-2-pro-avatar",
"cost": 80,
"balance_after": 420,
"created_at": "2026-10-23T12:00:00Z"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "pruna-ai-p-video-2-pro-avatar",
"cost": 80,
"created_at": "2026-10-23T12:00:00Z",
"completed_at": "2026-10-23T12:01:10Z",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-2-pro-avatar/avatar-1.mp4"
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "pruna-ai-p-video-2-pro-avatar",
"cost": 80,
"created_at": "2026-10-23T12:00:00Z",
"completed_at": "2026-10-23T12:01:30Z",
"result": null,
"error_message": "Не удалось обработать файл. Проверьте фото и аудио и попробуйте снова."
}
Сохраните id из ответа на создание и запрашивайте операцию, пока status не станет completed или failed:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
async function waitForOperation(id: string) {
while (true) {
const res = await fetch(`https://bratuha.ru/api/v1/operations/${id}`, {
headers: { Authorization: 'Bearer brth_ваш_ключ' },
})
const op = await res.json()
if (op.status === 'completed' || op.status === 'failed') return op
await new Promise((resolve) => setTimeout(resolve, 5000))
}
}
Длинные записи обрабатываются дольше коротких, поэтому опрашивайте раз в несколько секунд. Опрашивать одну операцию можно не чаще раза в секунду, иначе API ответит 429.
После завершения в поле result приходит видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-2-pro-avatar/avatar-1.mp4"
]
}
type - всегда "video".urls - массив ссылок на готовые видео. Для этой нейросети в нём одна ссылка на MP4.Видео идёт со звуком из вашего аудио, его длина равна длине записи. Пропорции кадра берутся с фотографии: из вертикального портрета получится вертикальное видео.
Если операция завершилась с ошибкой, result будет null, а причина придёт в error_message.
Цена считается за каждую секунду аудио и зависит от разрешения:
resolution | Цена за секунду |
|---|---|
480p | 4 ₽ |
768p | 8 ₽ |
Как считается итог:
audio и определяет его длительность. Передавать длительность в запросе не нужно.prompt и prompt_upsampling на цену не влияют.Примеры:
| Длина аудио | 480p | 768p |
|---|---|---|
| 10 секунд | 40 ₽ | 80 ₽ |
| 30 секунд | 120 ₽ | 240 ₽ |
| 1 минута | 240 ₽ | 480 ₽ |
| 3 минуты (максимум) | 720 ₽ | 1440 ₽ |
Итоговая сумма приходит в поле cost сразу в ответе на создание операции и списывается с баланса в этот момент. Если операция завершилась ошибкой, деньги возвращаются на баланс, а cost в ответе остаётся суммой запуска.
Idempotency-Key: повтор одного запроса в течение 24 часов вернёт исходную операцию без повторного списания. Повтор без этого заголовка создаёт новую операцию и списывает деньги заново.max_price в теле запроса, чтобы сервер отклонил запуск дороже согласованной суммы до списания.queued, результат забираете по id.http/https URL. Для image - jpg, jpeg, png, webp, для audio - mp3, wav, m4a, aac, flac, ogg. Локальные адреса и приватные сети не принимаются.validation_error, операция не создастся и деньги не спишутся.prompt управляет подачей и кадром, а не словами: произносится только то, что есть в аудио.