# 1. create the dub - each speaker gets an Instant Voice Clone by default
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" \
-d '{"video_id": "b8f7835d-e8c9-4ff4-8e34-5c336d818319", "dst_lang": "es-mx"}'
# 2. list the voices available in this project
curl https://api.rask.ai/v2/projects/$ID/voices \
-H "Authorization: Bearer $TOKEN"
# "label": "Voice Clone", "gender": "auto" instant clone
# "label": "Maria Lopez", "sample_src": "https://..." your custom clone
# 3. assign your custom clone - include every speaker in the map
curl -X PATCH https://api.rask.ai/v2/projects/$ID \
-H "Authorization: Bearer $TOKEN" \
-d '{"voice": {"SPEAKER_00": "<custom_voice_id>", "SPEAKER_01": "<voice_id>"}}'# 4. re-dub with the new voices, then poll until merging_done
curl -X POST https://api.rask.ai/v2/projects/$ID/generate \
-H "Authorization: Bearer $TOKEN"
while :; do
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq .status
sleep 10
done



Envie um arquivo como dados de formulário multipart ou publique um link do YouTube, Google Drive, S3, Vimeo ou qualquer URL direta. A fala neste vídeo é a amostra de voz para cada clonagem de voz instantânea.
Passe o ID de mídia como video_id e um idioma de destino. Cada locutor detectado recebe uma clonagem de voz instantânea nos idiomas suportados, e o dub começa imediatamente.
Liste as vozes do projeto, atribua um clone personalizado ou uma predefinição a qualquer locutor, chame /generate e baixe os arquivos quando o dub for concluído.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
async def wait(client, job):
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
return job
async def main():
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
video = await client.create_media_link(data=schemas.MediaCreateLink(link="https://youtu.be/..."))
while video.status is not enums.MediaStatus.READY:
await asyncio.sleep(5)
video = await client.get_media(media_id=video.id)
# first dub: every speaker gets an Instant Voice Clone
job = await wait(client, await client.create_project(
data=schemas.ProjectCreate(video_id=video.id, dst_lang="es-mx")))
# assign a custom clone to SPEAKER_00, keep the other speakers as they are
voices = await client.get_project_voices(project_id=job.id)
custom = next(v for v in voices if v.label == "Maria Lopez")
voice_map = {**job.voice, "SPEAKER_00": custom.id}
await client.patch_project(project_id=job.id, data=schemas.ProjectPatch(voice=voice_map))
job = await wait(client, await client.generate_project(project_id=job.id))
print(job.translated_video, job.voiceover)
asyncio.run(main())import time, requests
AUTH = "https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token"
API = "https://api.rask.ai"
token = requests.post(AUTH, auth=(CLIENT_ID, CLIENT_SECRET),
data={"grant_type": "client_credentials"}).json()["access_token"]
h = {"Authorization": f"Bearer {token}"}
def wait(pid):
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
return p
video = requests.post(f"{API}/api/library/v1/media/link", headers=h, json={"link": "https://youtu.be/..."}).json()
while video["status"] != "ready":
time.sleep(5)
video = requests.get(f"{API}/api/library/v1/media/{video['id']}", headers=h).json()
pid = requests.post(f"{API}/v2/projects", headers=h,
json={"video_id": video["id"], "dst_lang": "es-mx"}).json()["id"]
project = wait(pid)
voices = requests.get(f"{API}/v2/projects/{pid}/voices", headers=h).json()
custom = next(v for v in voices if v["label"] == "Maria Lopez")
voice_map = {**project["voice"], "SPEAKER_00": custom["id"]} # every speaker stays in the map
requests.patch(f"{API}/v2/projects/{pid}", headers=h, json={"voice": voice_map})
requests.post(f"{API}/v2/projects/{pid}/generate", headers=h)
print(wait(pid)["translated_video"])// no dependencies, Node 18+ global fetch
const API = 'https://api.rask.ai';
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const auth = await fetch('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token', {
method: 'POST',
headers: { Authorization: 'Basic ' + btoa(`${CLIENT_ID}:${CLIENT_SECRET}`) },
body: new URLSearchParams({ grant_type: 'client_credentials' }),
}).then((r) => r.json());
const h = { Authorization: `Bearer ${auth.access_token}`, 'Content-Type': 'application/json' };
const call = (method, path, body) => fetch(API + path, { method, headers: h, body: body && JSON.stringify(body) }).then((r) => r.json());
const wait = async (id) => { let p; while ((p = await call('GET', `/v2/projects/${id}`)).status !== 'merging_done') await sleep(10000); return p; };
let video = await call('POST', '/api/library/v1/media/link', { link: 'https://youtu.be/...' });
while (video.status !== 'ready') { await sleep(5000); video = await call('GET', `/api/library/v1/media/${video.id}`); }
const { id } = await call('POST', '/v2/projects', { video_id: video.id, dst_lang: 'es-mx' });
const project = await wait(id);
const voices = await call('GET', `/v2/projects/${id}/voices`);
const custom = voices.find((v) => v.label === 'Maria Lopez');
await call('PATCH', `/v2/projects/${id}`, { voice: { ...project.voice, SPEAKER_00: custom.id } });
await call('POST', `/v2/projects/${id}/generate`);
console.log((await wait(id)).translated_video);# 1. token (valid 1 hour - cache and reuse it)
TOKEN=$(curl -s -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" -d "grant_type=client_credentials" | jq -r .access_token)
# 2. create the dub - Instant Voice Clones are assigned by default
ID=$(curl -s -X POST https://api.rask.ai/v2/projects -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"es-mx\"}" | jq -r .id)
# 3. after merging_done: read the current voice map and the voice options
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq .voice
curl -s https://api.rask.ai/v2/projects/$ID/voices -H "Authorization: Bearer $TOKEN" | jq '.[] | {id, label, gender}'
# 4. assign voices for every speaker, then re-dub
curl -s -X PATCH https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"voice": {"SPEAKER_00": "<custom_voice_id>", "SPEAKER_01": "<voice_id>"}}'
curl -s -X POST https://api.rask.ai/v2/projects/$ID/generate -H "Authorization: Bearer $TOKEN"<?php
use GuzzleHttp\Client;
$http = new Client(['base_uri' => 'https://api.rask.ai']);
$json = fn($r) => json_decode($r->getBody(), true);
$auth = $json((new Client)->post('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
['auth' => [$clientId, $clientSecret], 'form_params' => ['grant_type' => 'client_credentials']]));
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];
$wait = function ($id) use ($http, $h, $json) {
do { sleep(10); $p = $json($http->get("/v2/projects/$id", ['headers' => $h])); }
while ($p['status'] !== 'merging_done');
return $p;
};
$id = $json($http->post('/v2/projects', ['headers' => $h,
'json' => ['video_id' => $videoId, 'dst_lang' => 'es-mx']]))['id'];
$project = $wait($id);
$voices = $json($http->get("/v2/projects/$id/voices", ['headers' => $h]));
$custom = current(array_filter($voices, fn($v) => $v['label'] === 'Maria Lopez'));
$map = array_merge($project['voice'], ['SPEAKER_00' => $custom['id']]);
$http->patch("/v2/projects/$id", ['headers' => $h, 'json' => ['voice' => $map]]);
$http->post("/v2/projects/$id/generate", ['headers' => $h]);
echo $wait($id)['translated_video']; 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

pt-br e pt-pt igualmente. O registro do projeto versão_do_glossário, garantindo que edições futuras nunca alterem o que já foi finalizado sem que você perceba.Sim. A API de clonagem de voz da Rask clona a voz de cada locutor como parte da dublagem de um vídeo. Crie um projeto com um idioma de destino e cada locutor receberá um clone de voz instantâneo nos idiomas suportados. Você também pode atribuir um clone de voz personalizado criado no aplicativo da Rask a qualquer locutor.
A clonagem de voz instantânea usa as vozes dos locutores do seu vídeo original para os idiomas de destino suportados. Para ter um clone de voz personalizado reutilizável, crie-o no aplicativo da Rask com o consentimento do locutor e, em seguida, atribua-o por meio da API. Os resultados dependem do áudio original, bem como do idioma e da voz selecionados.
A clonagem de voz instantânea é criada automaticamente a partir da fala no vídeo que você dubla, sem a necessidade de gravar curtas amostras de áudio. A clonagem de voz personalizada é treinada com amostras de áudio que você envia uma única vez, salva em sua biblioteca de vozes e reutiliza em qualquer projeto usando o voice_id. Na lista de vozes, o clone de voz instantâneo aparece com o rótulo "Voice Clone" e gênero "auto".
A criação de um clone de voz personalizado está disponível na plataforma web da Rask. Assim que o clone for salvo, obtenha o voice_id dele usando o endpoint de vozes do projeto e atribua-o a um locutor por meio da API.
Envie de 1 a 10 minutos de áudio ou vídeo, até 10 arquivos de até 10 MB cada, nos formatos MP4, MOV, WEBM, MKV, MP3, M4A ou WAV, ou cole um link do YouTube ou Google Drive. Para obter melhores resultados, use um único falante com um estilo de fala consistente, gravado em uma sala silenciosa, com um bom microfone e sem ruído de fundo.
A clonagem de voz é compatível com 32 idiomas base e suas respectivas variantes regionais. As variantes regionais usam o modelo base de clonagem: por exemplo, o texto em inglês do Reino Unido usa o modelo de voz do inglês dos EUA. Para outros idiomas de destino, escolha uma voz AI predefinida. Consulte o catálogo de idiomas da API para ver a lista completa.
A API faz o doblaje de gravações de vídeo e áudio, incluindo podcasts e entrevistas apenas em áudio. Para usar suas próprias palavras, edite o texto traduzido segmento por segmento ou crie a transcrição a partir do seu próprio arquivo .srt antes de criar o projeto, e a voz clonada falará o seu texto. A entrada é sempre uma gravação; portanto, para locuções apenas de texto, uma API de texto para fala é a melhor opção.
Obtenha as opções de voz com GET /v2/projects/{id}/voices e, em seguida, envie PATCH /v2/projects/{id} com um mapeamento de voz que inclua todos os falantes (o alterado e os inalterados). Chame /generate para refazer o doblaje. O novo doblaje é cobrado com base na duração combinada dos segmentos alterados, com um mínimo de um minuto por execução cobrada.
Os planos Creator Pro incluem até 3 vozes personalizadas, os planos Business incluem até 10 vozes compartilhadas da equipe e os planos Enterprise oferecem uma biblioteca de vozes personalizadas.
Sim. As clonagens de voz personalizadas são criadas com o consentimento do falante, e você só deve fazer o doblaje de vídeos cujos falantes tenham concordado com isso. O Rask usa clonagem de voz baseada em consentimento e controles de segurança de AI, e seu áudio nunca é usado para treinar modelos gerais.
O clone replica a identidade vocal do falante, incluindo timbre e tom, para que ele soe como ele mesmo em outro idioma. O tom emocional, a cadência e o ritmo seguem o áudio original e o roteiro traduzido; portanto, uma fala original clara e expressiva gera os melhores resultados.
Você pode publicar vídeos com doblaje e vozes clonadas em seu conteúdo comercial quando tiver os direitos do vídeo original e o consentimento dos falantes. Consulte os Termos de Serviço do Rask para ver os detalhes aplicáveis ao seu plano.
A clonagem de voz faz parte do doblaje e não tem taxa separada: o uso da API é cobrado por minuto de vídeo, arredondado para o próximo minuto inteiro, a partir do mesmo conjunto de minutos do aplicativo Rask. Minutos excedentes ao plano custam US$ 3 por minuto. O novo doblaje após uma alteração de voz é cobrado apenas pelos segmentos alterados. Comece com um teste gratuito, sem necessidade de cartão de crédito.