Документация API
REST API: загрузка → статус → MP4 · базовый URL: https://dpunk.online
1. Аутентификация
Получите персональный ключ в разделе API (требуется аккаунт и подтверждённый email).
Передавайте ключ в каждом запросе:
Альтернатива: Authorization: Bearer dpk_ваш_ключ
2. Схема работы
POST /api/v1/dub— отправить видео и параметры, получить job idGET /api/v1/jobs/<id>— опрашивать статус (queued → running → done)GET /api/v1/jobs/<id>/download— скачать готовый MP4
3. Запуск дубляжа
multipart/form-data — загрузка файла (основной способ):
Обязательные поля: project_name, source_language, target_language, и video или video_url.
Форматы: MP4, MKV, MOV, AVI, WebM, WAV, MP3, M4A. Максимум 150 МБ.
Ссылка вместо файла (YouTube и др. через yt-dlp на стороне Dpunk):
Ответ при успехе: HTTP 202 с полем id — сохраните его для опроса.
4. Опциональные параметры
| Параметр | Описание |
|---|---|
voice_prompt | Промпт VoiceDesign для голоса |
voice_gender | male | female |
voice_age | Возраст голоса (5–90) |
voice_design_temperature | Креативность TTS (0–1) |
voice_design_by_key | JSON: промпт по полу и возрастной группе |
dub_volume_percent | Громкость дубляжа, % (по умолчанию 100) |
original_audio_ratio | Доля оригинала (0–1, по умолчанию 0.3) |
video_url | Ссылка на медиа (YouTube и др.) вместо файла — скачивается через yt-dlp |
cast_voice | Один встроенный голос: loki / tom_hardy / thor (или Локи / Том Харди / Тор) |
cast_mode | speakers — три голоса раздаются спикерам по кругу |
Плейсхолдеры в voice_prompt: {lang}, {gender_hint}, {age_hint}
5. Клонирование голоса из сэмпла
Короткий аудио-сэмпл (MP3/WAV, до 10 МБ, 3–10 сек) задаёт голос для выбранных возрастных групп. Можно комбинировать: сэмпл для male, VoiceDesign-промпт для female.
| Поле multipart | Описание |
|---|---|
voice_sample_male | Файл сэмпла мужского голоса |
voice_sample_female | Файл сэмпла женского голоса |
voice_sample_male_ages | child,teenager,mature,elderly (через запятую) |
voice_sample_female_ages | То же для женского пола |
voice_sample_male_ref_text | Точный текст из мужского сэмпла (рекомендуется) |
voice_sample_female_ref_text | Точный текст из женского сэмпла |
video_path и серверных путей в JSON —
только загрузка файлов через multipart.
6. Встроенные cast-голоса
На сервере лежат 3 готовых эталона. Их не нужно загружать файлом — укажите id или имя.
| id | Имя |
|---|---|
loki | Локи |
tom_hardy | Том Харди |
thor | Тор |
Два режима (взаимоисключающие):
cast_voice=loki— один голос на весь дубляжcast_mode=speakers— SPEAKER_00→Локи, SPEAKER_01→Том Харди, SPEAKER_02→Тор, …
Свои voice_sample_* по-прежнему доступны и имеют приоритет на пересекающихся слотах.
7. Silero TTS — готовые русские голоса
Альтернатива Qwen3-TTS для русского дубляжа: фиксированные спикеры Silero v5_ru (быстрее, меньше нагрузка на GPU).
target_language = ru. Для других языков параметры silero_* вернут ошибку 400.
| Параметр | Описание |
|---|---|
silero_speaker | aidar, eugene (♂) · baya, kseniya, xenia (♀) |
silero_all_replicas | true — один спикер на все реплики (Qwen не используется) |
silero_age_groups | child,teenager,mature,elderly — фильтр по возрасту |
silero_voices | JSON-массив слотов для разных пол × возраст |
Мужские реплики через Silero, женские — Qwen:
Все реплики одним голосом:
Можно комбинировать Silero с voice_prompt и voice_sample_* — Silero для выбранных реплик, Qwen для остальных.
8. Статус и список задач
Статусы: queued, running, done, error.
Список ваших задач (до 50 последних). Чужие задачи недоступны.
9. Скачивание результата
Доступно только при status = done.
10. Коды ответов
| Код | Значение |
|---|---|
| 200 | OK — GET, скачивание |
| 202 | Accepted — задача создана |
| 400 | Неверные поля; silero_* при target_language ≠ ru |
| 401 | Неверный или отсутствующий API key |
| 404 | Задача не найдена (или не ваша) |
| 409 | Результат ещё не готов |
| 413 | Файл слишком большой |
| 503 | GPU занят другой задачей |
11. Пример на Python
Полный сценарий: запуск дубляжа с клонированием голоса, ожидание и скачивание MP4.
import time
import requests
BASE = "https://dpunk.online"
HEADERS = {"X-API-Key": "dpk_ваш_ключ"}
with open("video.mp4", "rb") as video, \
open("voice.wav", "rb") as sample:
r = requests.post(
f"{BASE}/api/v1/dub",
headers=HEADERS,
data={
"project_name": "demo",
"source_language": "en",
"target_language": "ru",
"voice_sample_male_ages": "mature,elderly",
"voice_sample_male_ref_text": "Hello, this is my reference voice.",
"voice_design_temperature": "0.72",
},
files={
"video": ("video.mp4", video, "video/mp4"),
"voice_sample_male": ("voice.wav", sample, "audio/wav"),
},
timeout=600,
)
r.raise_for_status()
job_id = r.json()["id"]
print("job:", job_id)
with open("video.mp4", "rb") as video:
r = requests.post(
f"{BASE}/api/v1/dub",
headers=HEADERS,
data={
"project_name": "demo",
"source_language": "en",
"target_language": "ru",
"silero_speaker": "eugene",
"silero_all_replicas": "true",
},
files={"video": ("video.mp4", video, "video/mp4")},
timeout=600,
)
r.raise_for_status()
job_id = r.json()["id"]
print("job:", job_id)
with open("video.mp4", "rb") as video:
r = requests.post(
f"{BASE}/api/v1/dub",
headers=HEADERS,
data={
"project_name": "demo",
"source_language": "en",
"target_language": "ru",
"cast_mode": "speakers",
},
files={"video": ("video.mp4", video, "video/mp4")},
timeout=600,
)
r.raise_for_status()
job_id = r.json()["id"]
while True:
st = requests.get(
f"{BASE}/api/v1/jobs/{job_id}",
headers=HEADERS,
timeout=60,
)
st.raise_for_status()
data = st.json()
print("status:", data["status"])
if data["status"] == "done":
break
if data["status"] == "error":
raise RuntimeError(data.get("error"))
time.sleep(60)
out = requests.get(
f"{BASE}/api/v1/jobs/{job_id}/download",
headers=HEADERS,
stream=True,
timeout=600,
)
out.raise_for_status()
with open("demo_dubbed.mp4", "wb") as f:
for chunk in out.iter_content(chunk_size=1024 * 1024):
if chunk:
f.write(chunk)
print("saved: demo_dubbed.mp4")
12. Управление ключами
Ключи создаются в личном кабинете. Каждый ключ показывается один раз при генерации.
Создать аккаунт