# 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 ficheiro como dados de formulário multipart ou publique um link do YouTube, Google Drive, S3, Vimeo ou qualquer URL direto. A fala neste vídeo serve como amostra de voz para cada clone de voz instantâneo.
Indique o ID do meio como video_id e um idioma de destino. Cada locutor detetado recebe um clone de voz instantâneo nos idiomas suportados e a dobragem começa de imediato.
Liste as vozes para o projeto, atribua um clone personalizado ou uma predefinição a qualquer locutor, chame /generate e descarregue os ficheiros quando a dobragem 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

es-mx e es-es igualmente. O registo do projeto glossary_version, para que edições posteriores nunca alterem silenciosamente o trabalho concluído.Sim. A API de clonagem de voz da Rask clona a voz de cada orador como parte da dobragem de um vídeo. Crie um projeto com um idioma de destino e cada orador recebe um Clone de Voz Instantâneo nos idiomas suportados. Também pode atribuir um Clone de Voz Personalizado criado na aplicação Rask a qualquer orador.
O Clone de Voz Instantâneo utiliza as vozes dos oradores do seu vídeo original para os idiomas de destino suportados. Para obter um Clone de Voz Personalizado reutilizável, crie-o na aplicação Rask com o consentimento do orador e, em seguida, atribua-o através da API. Os resultados dependem do áudio original e do idioma e da voz selecionados.
O Clone de Voz Instantâneo é criado automaticamente a partir da fala no vídeo que dobra, sem necessidade de gravar pequenos exemplos de áudio. O Clone de Voz Personalizado é treinado a partir de amostras de áudio que carrega uma única vez, guardado na sua biblioteca de vozes e reutilizado em qualquer projeto através do respetivo voice_id. Na lista de vozes, um Clone de Voz Instantâneo tem a etiqueta "Clone de Voz" e o género "auto".
A criação de um Clone de Voz Personalizado está disponível na plataforma web da Rask. Assim que o clone estiver guardado, obtenha o seu voice_id através do endpoint de vozes do projeto e atribua-o a um orador através da API.
Carregue 1 a 10 minutos de áudio ou vídeo, até 10 ficheiros com um máximo de 10 MB cada, nos formatos MP4, MOV, WEBM, MKV, MP3, M4A ou WAV, ou cole um link do YouTube ou Google Drive. Para obter os melhores resultados, utilize um único locutor com um tom consistente, gravado numa sala silenciosa, com um bom microfone e sem ruído de fundo.
A clonagem de voz suporta 32 idiomas base e respetivas variantes regionais. As variantes regionais utilizam o modelo de clonagem base: por exemplo, o texto em inglês do Reino Unido utiliza o modelo de voz do inglês dos EUA. Para outros idiomas de destino, escolha uma predefinição de voz de IA. Consulte o catálogo de idiomas da API para ver a lista completa.
A API faz o dobragem de gravações de vídeo e áudio, incluindo podcasts e entrevistas apenas em áudio. Para utilizar as suas próprias palavras, edite o texto traduzido segmento a segmento ou crie a transcrição a partir de um ficheiro .srt próprio antes de iniciar o projeto, para que a voz clonada fale o seu texto. A entrada é sempre uma gravação, pelo que, para locuções apenas em texto, uma API de texto para voz é a melhor opção.
Obtenha as opções de voz através de GET /v2/projects/{id}/voices e, em seguida, envie um PATCH /v2/projects/{id} com um mapeamento de voz que inclua todos os locutores, tanto o alterado como os que se mantêm iguais. Chame /generate para efetuar novamente a dobragem. A nova dobragem é faturada 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 até 10 vozes partilhadas pela equipa 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 só deve fazer a dobragem de vídeos cujos locutores tenham dado autorização. O Rask utiliza clonagem de voz baseada no consentimento e controlos de segurança de IA, e o seu áudio nunca é utilizado para treinar modelos gerais.
O clone replica a identidade vocal do locutor, incluindo o timbre e a tom, para que soem como eles próprios noutro idioma. O tom emocional, a cadência e o ritmo seguem o áudio original e o guião traduzido, pelo que um discurso de origem claro e expressivo proporciona os melhores resultados.
Pode publicar vídeos dobrados com vozes clonadas no seu conteúdo comercial se tiver os direitos do vídeo original e o consentimento dos locutores. Consulte os Termos de Serviço do Rask para conhecer os detalhes aplicáveis ao seu plano.
A clonagem de voz faz parte da dobragem e não tem custos adicionais: a utilização da API é faturada por minuto de vídeo, arredondado para o minuto inteiro seguinte, a partir do mesmo saldo de minutos da aplicação Rask. Os minutos que excedam o plano custam 3 $ por minuto. A nova dobragem após uma alteração de voz é faturada apenas para os segmentos modificados. Comece com uma avaliação gratuita, sem necessidade de cartão de crédito.