# 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 Clone de Voz Instantâneo.
Passe o ID de mídia como video_id e um idioma de destino. Cada locutor detectado recebe um Clone de Voz Instantâneo nos idiomas suportados, e a dublagem 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 a dublagem estiver concluída.
# 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. Os registros do projeto versao_glossario, garantindo que alterações futuras não modifiquem o trabalho 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á uma clonagem de voz instantânea nos idiomas compatíveis. Você também pode atribuir uma clonagem de voz personalizada criada no aplicativo da Rask a qualquer locutor.
A clonagem de voz instantânea usa as vozes dos locutores do seu vídeo de origem para os idiomas de destino compatíveis. Para ter uma clonagem de voz personalizada reutilizável, crie-a no aplicativo da Rask com o consentimento do locutor e, em seguida, atribua-a por meio da API. Os resultados dependem do áudio de origem e 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 precisar gravar amostras de áudio curtas. A clonagem de voz personalizada é treinada a partir de amostras de áudio que você envia uma vez, sendo salva na sua biblioteca de vozes e reutilizada em qualquer projeto pelo voice_id. Na lista de vozes, a clonagem de voz instantânea tem o rótulo "Clonagem de voz" e o gênero "auto".
A criação de clonagem de voz personalizada está disponível na plataforma web da Rask. Assim que a clonagem for salva, recupere o voice_id dela usando o endpoint de vozes do projeto (get project voices) e atribua-a 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 do Google Drive. Para obter melhores resultados, use um único locutor com um estilo de fala consistente, gravado em um ambiente silencioso com um bom microfone e sem ruído de fundo.
A clonagem de voz aceita 57 idiomas principais e suas variações regionais. As variações regionais usam o modelo principal de clonagem: por exemplo, um texto em inglês do Reino Unido usa o modelo de voz do inglês dos EUA. Para outros idiomas, escolha uma voz predefinida de IA. Veja a lista completa no catálogo de idiomas da API.
A API dubla 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 em texto, uma API de conversão de texto em 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 mapa de vozes que inclua todos os locutores (o alterado e os inalterados). Chame /generate para dublar novamente. A nova dublagem é cobrada 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 personalizada.
Sim. As clonagens de voz personalizadas são criadas com o consentimento do locutor, e você só deve dublar vídeos cujos locutores tenham concordado com isso. A Rask usa clonagem de voz baseada em consentimento e controles de segurança de IA, e seu áudio nunca é usado para treinar modelos gerais.
O clone reproduz a identidade vocal de quem está falando, incluindo o timbre e a altura da voz, para que a pessoa soe como ela mesma em outro idioma. O tom emocional, a cadência e o ritmo seguem o áudio original e o roteiro traduzido, então uma fala original clara e expressiva traz os melhores resultados.
Você pode publicar vídeos dublados com vozes clonadas em conteúdos comerciais se 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 da dublagem e não tem custo separado: o uso da API é cobrado por minuto de vídeo, arredondado para o próximo minuto inteiro, usando o mesmo saldo de minutos do aplicativo Rask. Minutos que excederem o plano custam US$ 3 por minuto. Uma nova dublagem após alterar a voz é cobrada apenas pelos trechos modificados. Comece com um teste grátis, sem precisar de cartão de crédito.