동영상 더빙을 위한 텍스트 음성 변환 API

타임라인이 포함된 대본을 동영상 또는 오디오 녹음과 함께 전송하면, 타임라인에 맞춘 음성이 만들어집니다. 135개 이상의 언어와 지역별 옵션 중에서 음성 라이브러리의 AI 목소리나 목소리 복제를 선택하고, 같은 프로젝트에서 더빙, 동영상, 자막을 다운로드하세요.
대본을 음성으로 변환
AI 목소리 및 목소리 복제
REST + Python SDK
script in, voiceover out
OAuth 2.0
# 1. send your script as timed segments - one speaker per line
curl -X POST https://api.rask.ai/v2/transcriptions \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"segments": [
    {"speaker": "SPEAKER_00", "start": "00:00:00,500", "end": "00:00:04,800",
     "src": {"text": "Welcome to the new dashboard.", "lang": "en"},
     "dst": {"text": "Bienvenido al nuevo panel.", "lang": "es-mx"}}
  ]}'

# 2. voice the script over your video
curl -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\", \"transcript_id\": \"$TRANSCRIPT_ID\"}"
GET /v2/projects/{project_id}
voiceover links
# When status is merging_done, read the voiceover links
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
  | jq '{status, voiceover, translated_audio, translated_video}'
전 세계 팀들이 사용하는
지원 기능

동영상을 위해 텍스트 음성 변환 API가 제공하는 모든 기능

작성한 대본을 화면에 알맞은 음성으로 바꿔보세요. 하나의 프로젝트에서 화자별 맞춤 목소리, 구간별 타이밍, 배경 오디오, 자막, 번역을 모두 처리할 수 있습니다. 별도 과금되는 입체적인 립싱크(입모양 맞춤) 기능은 선택사항입니다.

내 대본이 말하는 목소리로

내 텍스트 구간이나 SRT 파일로 자막을 만들면, API가 목표 언어로 해당 대본에 딱 맞는 음성을 생성합니다.

목소리 라이브러리

모든 목표 지역에는 성별이 지정된 AI 목소리 프리셋이 있습니다. 음성 엔드포인트로 프로젝트에 사용할 목소리를 확인하고, 음성 ID를 통해 각 화자에게 배정하세요.

맞춤 목소리 및 목소리 복제

저장된 맞춤 목소리 복제 기능을 브랜드의 일관된 목소리로 활용하거나, 지원되는 목소리 복제 언어에서 즉시 목소리 복제를 통해 영상 속 인물의 실제 목소리를 유지해 보세요.

화면에 맞춘 타이밍

각 구간마다 시작 시간과 종료 시간이 있어, 대사가 동영상의 정확한 위치에 자연스럽게 들어갑니다.

등장인물 목소리와 대화

각 대사에 화자를, 각 화자에게 목소리를 지정하여 대화나 여러 등장인물의 목소리를 선명하고 일관성 있게 유지하세요.

135개 이상의 언어 및 지역 옵션

한 언어로 대본을 작성하고 다른 언어로 음성을 입혀보세요. Rask가 번역을 처리하며, 모든 목표 지역에 AI 목소리를 사용할 수 있습니다.

목소리 전용 오디오 트랙

지원되는 요금제에서는 배경 소음이 없는 WAV 트랙 형식으로 음성 오디오를 다운로드하여 직접 편집할 수 있으며, 전체 믹스와 완성된 동영상도 함께 이용할 수 있습니다.

한 줄 수정하고 바로 다시 생성하기

한 구간의 텍스트나 화자의 목소리를 바꾸고 다시 생성해 보세요. 처음부터 다시 녹음할 필요가 없으며, 변경된 구간에 대해서만 요금이 부과됩니다.

제한 없는 확장

이용 횟수 제한, 동시 접속 제한, 키별 속도 제한이 없습니다. 긴 영상 콘텐츠와 전체 동영상 카탈로그를 동시에 음성으로 변환하세요.
실행 화면 보기

하나의 영상에 다섯 가지 언어로 목소리를 입혀보세요

영어, 프랑스어, 독일어, 포르투갈어, 스페인어로 각각 더빙된 동일한 영상입니다. 원래 배경 소리는 그대로 유지하면서 화면에 맞춰 정확히 동기화됩니다.
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
작업 흐름

대본에서 음성 생성까지 단 3단계

프로젝트를 만들면 대본의 음성 생성이 시작됩니다. 텍스트나 목소리를 변경한 후 /generate 엔드포인트를 사용하세요.
1

동영상 또는 오디오 업로드

파일이나 지원되는 미디어 URL을 사용하여 목소리를 입힐 동영상이나 오디오 녹음본을 업로드하세요. 타임라인을 통해 대본의 타이밍이 잡힙니다.

POST /api/library/v1/media/link
2

대본 전송

타임스탬프와 화자가 포함된 텍스트 세그먼트나 SRT 파일로 대본을 만든 다음, 해당 transcript_id와 목표 언어로 프로젝트를 생성하세요.

POST /v2/transcriptions
3

목소리 선택 및 다운로드

목소리를 확인하고 각 화자에게 사전 설정이나 복제된 목소리를 지정한 후, 필요시 다시 생성하고 더빙, 동영상, 자막 파일을 다운로드하세요.

GET /v2/projects/{id}/voices
처리 시간은 프로젝트에 따라 다릅니다. 프로젝트 전체의 음성이 생성되어 파일로 제공되므로, 실시간 대화보다는 게시된 동영상에 적합한 API입니다.
맞춤형 서비스

라이브러리에 없는 목소리가 필요하신가요? 저희 팀에 문의하세요

브랜드 목소리, 카탈로그에 없는 언어, 더 높은 처리량 또는 자체 전달 방식 등 공개 카탈로그 외의 기능이 필요할 때, 저희 팀이 요구사항과 가능한 옵션을 검토해 드립니다.

지원 언어 및 목소리

기본 목록에 없는 언어이나 목소리가 필요하신가요? 필요한 사항과 이용 가능한 옵션에 대해 저희 팀과 상담해 보세요.

전송 및 연동

웹훅, 자체 대기열 연동, S3 직접 전송, 맞춤형 엔드포인트를 지원합니다. 시스템에 맞는 방식을 알려주세요.

볼륨 및 처리량

배치 크기, 작업당 타겟 언어 수, 처리 우선순위는 고정된 제품 한계가 아니라 계약을 통해 조율할 수 있습니다.

보안 및 호스팅

데이터 보관, SSO 및 SAML, 보존 규칙 및 보안 검토 지원은 기업 온보딩 과정에서 처리됩니다.
사용 사례

동영상용 텍스트 음성 변환 API를 사용하는 대상

동영상이 포함된 플랫폼

LMS 및 고객 교육 플랫폼, 크리에이터 및 동영상 플랫폼, 웨비나 및 가상 이벤트 도구, 동영상 호스팅 및 워크플로 SaaS, 디지털 채택 플랫폼, 라이브 쇼핑. 사용자가 제품을 떠나지 않고도 텍스트를 입력하거나 대본을 업로드하여 여러 언어로 동영상 음성을 생성할 수 있습니다.

현지화 및 제작 대행사

AI 목소리나 고객 맞춤형 목소리로 클라이언트 동영상용 대본을 승인하고, 자체 믹싱을 위한 음성 전용 WAV 파일을 받아보세요. 검토 후 대사를 수정하고 해당 세그먼트만 다시 생성할 수 있습니다.

사내 자체 동영상 제작

글로벌 유통 및 이커머스, 글로벌 프랜차이즈, 미디어 퍼블리셔, 기업 대학. 작성된 대본을 바탕으로 교육, 제품, 마케팅 동영상의 음성을 제작하고 제품 변경에 맞춰 텍스트를 업데이트하세요.
고객 성공 사례

실제 팀, 가시적인 성과

Rask를 통해 동영상을 현지화한 기업들의 실제 수치와 이야기를 확인해 보세요.
화살표
화살표
코드

텍스트 음성 변환 API 코드 예시

언어별 완성된 예시: 타임스탬프가 지정된 세그먼트로 대본 전송, 프로젝트 생성, 라이브러리에서 목소리 선택, 재생성 및 더빙 다운로드.
# 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)

    script = await client.create_transcription(data=schemas.TranscriptionCreate(segments=[
        schemas.SegmentCreate(speaker="SPEAKER_00", start="00:00:00,500", end="00:00:04,800",
            src=schemas.SegmentTextCreatePatch(text="Welcome to the new dashboard.", lang="en"),
            dst=schemas.SegmentTextCreatePatch(text="Bienvenido al nuevo panel.", lang="es-mx")),
    ]))

    job = await wait(client, await client.create_project(data=schemas.ProjectCreate(
        video_id=VIDEO_ID, dst_lang="es-mx", transcript_id=script.id)))

    # pick a female AI voice preset from the library for SPEAKER_00
    voices = await client.get_project_voices(project_id=job.id)
    preset = next(v for v in voices if v.gender == "female")
    await client.patch_project(project_id=job.id, data=schemas.ProjectPatch(voice={**job.voice, "SPEAKER_00": preset.id}))

    job = await wait(client, await client.generate_project(project_id=job.id))
    print(job.voiceover, job.translated_video)

asyncio.run(main())
github.com/braskai/rask-sdk
async, typed models
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

script = requests.post(f"{API}/v2/transcriptions", headers=h, json={"segments": [
        {"speaker": "SPEAKER_00", "start": "00:00:00,500", "end": "00:00:04,800",
         "src": {"text": "Welcome to the new dashboard.", "lang": "en"},
         "dst": {"text": "Bienvenido al nuevo panel.", "lang": "es-mx"}},
    ]}).json()

pid = requests.post(f"{API}/v2/projects", headers=h, json={
    "video_id": VIDEO_ID, "dst_lang": "es-mx", "transcript_id": script["id"]}).json()["id"]
project = wait(pid)

voices = requests.get(f"{API}/v2/projects/{pid}/voices", headers=h).json()
preset = next(v for v in voices if v["gender"] == "female")
requests.patch(f"{API}/v2/projects/{pid}", headers=h,
               json={"voice": {**project["voice"], "SPEAKER_00": preset["id"]}})
requests.post(f"{API}/v2/projects/{pid}/generate", headers=h)
print(wait(pid)["voiceover"])
requests + polling
no SDK required
// 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; };

const script = await call('POST', '/v2/transcriptions', { segments: [
  { speaker: 'SPEAKER_00', start: '00:00:00,500', end: '00:00:04,800',
    src: { text: 'Welcome to the new dashboard.', lang: 'en' },
    dst: { text: 'Bienvenido al nuevo panel.', lang: 'es-mx' } },
] });

const { id } = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang: 'es-mx', transcript_id: script.id });
const project = await wait(id);

const voices = await call('GET', `/v2/projects/${id}/voices`);
const preset = voices.find((v) => v.gender === 'female');
await call('PATCH', `/v2/projects/${id}`, { voice: { ...project.voice, SPEAKER_00: preset.id } });
await call('POST', `/v2/projects/${id}/generate`);
console.log((await wait(id)).voiceover);
fetch, Node 18+
plain HTTP
# 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. your script as an SRT file in the target language
TRANSCRIPT_ID=$(curl -s -X POST "https://api.rask.ai/v2/transcriptions/srt?dst_lang=es-mx" \
  -H "Authorization: Bearer $TOKEN" -F "dst=@script_es-mx.srt" | jq -r .id)

# 3. voice it over the video
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\", \"transcript_id\": \"$TRANSCRIPT_ID\"}" | jq -r .id)

# 4. when status is merging_done, read the voiceover links
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
  | jq '{status, voiceover, translated_video}'
POST /v2/transcriptions/srt
script from an SRT file
<?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']];

$script = $json($http->post('/v2/transcriptions', ['headers' => $h, 'json' => ['segments' => [[
    'speaker' => 'SPEAKER_00', 'start' => '00:00:00,500', 'end' => '00:00:04,800',
    'src' => ['text' => 'Welcome to the new dashboard.', 'lang' => 'en'],
    'dst' => ['text' => 'Bienvenido al nuevo panel.', 'lang' => 'es-mx'],
]]]]));

$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
    'video_id' => $videoId, 'dst_lang' => 'es-mx', 'transcript_id' => $script['id']]]));

while ($p['status'] !== 'merging_done') {
    sleep(10);
    $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
echo $p['voiceover'];
Guzzle 7
plain HTTP
공식 SDK는 Python입니다. Node, PHP, cURL 탭은 동일한 엔드포인트를 사용하는 일반적인 HTTP 예시입니다.
진행 상황

더빙 프로젝트 진행 상황을 확인하는 방법

음성 생성은 문서화된 상태와 함께 프로젝트로 실행되므로, 긴 콘텐츠의 경우에도 실제 진행 상황을 파악할 수 있습니다. 세 가지 그룹만 확인하시면 됩니다.

성공, 여기서 중지

merging_done
더빙이 완료되었습니다. 프로젝트를 한 번 더 불러와 사용 가능한 다운로드 링크를 확인하세요.

진행 중, 계속 확인

created
uploading
transcription_started
separate_background_started
determine_speakers_started
translation_started
voiceover_started
merging_started
또한 일치하는 항목 _done 단계별 진행 상황 화면에 알맞게 표시됩니다.

실패, 중단 및 보고

failed
upload_failed
transcription_failed
translation_failed
voiceover_failed
merging_failed
no_audio
no_words
forbidden_link
no_audio, no_words 및 forbidden_link 사용자에게 직접 보여줄 수 있을 만큼 구체적입니다.
Voice options in a project, es-mx
GET /v2/projects/{project_id}/voices
{"label": "Renata",      "gender": "female", "sample_src": "https://..."}   AI voice preset
{"label": "Gerardo",     "gender": "male",   "sample_src": "https://..."}   AI voice preset
{"label": "Maria Lopez", "gender": "auto",   "sample_src": "https://..."}   custom voice clone
{"label": "Voice Clone", "gender": "auto",   "sample_src": null}            instant voice clone

또는 상태 확인 과정을 완전히 건너뛰세요

웹훅 엔드포인트를 지정하면 모든 상태 전환이 POST 요청으로 전송되므로 큐가 변경 즉시 반응할 수 있습니다. 웹훅 전달은 엔터프라이즈 온보딩의 일부입니다.
문서 읽기
preserveAspectRatio="xMidYMid meet" aria-hidden="true" role="img">
결과물

더빙 오디오, 동영상 및 자막

새로운 더빙과 SRT, VTT 자막이 포함된 동영상을 다운로드하세요. 대상 요금제에서는 음성 오디오만 WAV 파일로 다운로드하거나 원래 배경 소리와 섞어서 다운로드할 수도 있습니다.
항목
형식
설명
translated_video
MP4
게시할 준비가 완료된, 생성된 더빙이 포함된 동영상
voiceover
WAV
자체 편집을 위한 배경음 없는 생성된 음성만 포함된 파일
translated_audio
WAV
번역된 음성과 원래의 배경음악이 섞인 오디오
translation_srt_path
.srt
번역된 언어의 자막
translation_vtt_path
.vtt
웹 플레이어용 WebVTT 자막
original_video
MP4
참고용으로 보관된 원본 파일
제어

대사나 목소리를 수정하고, 해당 부분만 다시 생성하세요.

스크립트는 문단 단위로 저장됩니다. 한 줄의 텍스트나 특정 화자의 목소리를 수정하고 다시 생성하면, 최소 1분의 실행 시간을 기준으로 변경된 문단에 대해서만 비용이 청구됩니다.

문장 단위 편집

문장 단위 편집
모든 프로젝트는 타임스탬프, 화자, 텍스트가 포함된 문단 단위로 스크립트를 제공하므로, 수정은 간단한 패치 요청 한 번으로 가능합니다.
대본과 문장 불러오기
원본 텍스트를 수정하면 자동으로 다시 번역됩니다.
번역된 텍스트를 직접 수정하여 원하는 표현을 유지하세요.
타임스탬프 조정, 문장 추가 및 삭제
화자에게 연결된 목소리 변경하기

용어집

용어집
Rask가 스크립트를 다른 언어로 번역할 때, 용어집을 사용하면 브랜드 이름과 전문 용어를 모든 버전에서 일관되게 유지하거나 의도에 따라 원어 그대로 유지할 수 있습니다.

용어집 하나는 한 쌍의 언어에 적용되며 해당 목표 언어의 모든 지역별 변형에 공통으로 적용되므로 하나의 스페인어 용어집으로 es-mx 및 es-es 모두 커버할 수 있습니다. 프로젝트 기록은 glossary_version유지되므로 나중에 수정하더라도 완료된 작업이 예기치 않게 변경되지 않습니다.
입력

지원되는 파일 형식

지원되는 형식의 동영상을 업로드하거나 URL을 입력하세요. 스크립트는 API를 통해 텍스트 문단으로 가져오거나 SRT 파일로 가져올 수 있습니다.

동영상

7가지 형식
.mp4
.mov
.mkv
.avi
.webm
.m4v
.3gp

오디오

4가지 형식
.mp3
.wav
.flac
.m4a

작업 전 메타데이터 확인

미디어 엔드포인트는 재생 시간, 파일 크기, 동영상 코덱, 프레임 속도, 해상도, 오디오 코덱, 샘플 레이트, 채널 레이아웃을 반환합니다. 더빙은 글자 수가 아니라 동영상 재생 시간을 기준으로 과금되므로, 사전에 파일을 검증하고 비용을 예상할 수 있습니다.
보안 및 규정 준수

스크립트와 목소리를 위한 기업 수준의 보안

Brask Inc는 SOC 2 Type II 인증을 획득하고 GDPR을 준수하며, 트러스트 센터(Trust Center)에 실시간 제어 상태를 공개합니다. 맞춤형 목소리 복제는 화자의 동의하에 생성됩니다.

인증

SOC 2 Type II
GDPR
CAI 및 C2PA 회원사

암호화

전송 중 TLS 1.2 암호화
저장 시 AES-256 암호화
SSE-S3 관리형 키
최소 12개월마다 키 갱신

회원님의 콘텐츠

폐쇄형 AI 환경
일반 모델 학습에 절대 사용되지 않음
전체 내보내기 가능, 종속성 없음

액세스

SSO 및 SAML
역할 기반 접근 제어
OAuth 2.0 클라이언트 자격 증명

기업

데이터 보관 지역 선택 옵션
맞춤형 SLA
전담 계정 관리자

음성 권리

사용 권한이 포함된 합성 목소리
동의 기반 목소리 복제
AI 안전 제어 및 사람의 관리
비교

직접 구축하는 더빙 파이프라인과 Rask API 비교

스트리밍 텍스트 음성 변환(TTS) API는 실시간 사용을 위해 텍스트를 오디오 바이트로 변환합니다. 하지만 공개용 동영상의 더빙에는 타이밍, 화자별 목소리, 믹싱, 자막, 그리고 번역이 필요한 경우가 많습니다. 동일한 더빙을 두 가지 방식으로 구현한 결과를 비교해 보세요.
필요한 기능
Rask API
부품들을 조립하는 방식
동영상에 맞춘 스크립트
시작 및 종료 시간이 포함된 문단
자체 동기화 로직
화자 또는 캐릭터별 목소리
프로젝트별 목소리 맵
요청에 따라 관리되는 목소리 ID
일관된 브랜드 목소리
맞춤형 목소리 복제
별도의 복제 서비스 제공업체
다른 언어로 된 동일한 스크립트
동일 프로젝트 내에서의 번역
번역 API 및 새로운 타이밍 설정
배경음악 및 효과음
더빙 아래에 믹싱됨
사용자 직접 믹싱 단계
.srt 및 .vtt 형식의 자막
포함됨
자체 타이밍 데이터를 기반으로 생성
목소리 전용 오디오 트랙
적격 플랜 이용 시 WAV 제공
직접 결합해야 하는 오디오 조각
한 줄 수정하기
수정된 구간 다시 생성하기
파일 다시 합성하고 믹싱하기
사용량 제한
없음
제공업체에서 적용하는 정책
스트리밍 기능이 포함된 실시간 음성 에이전트
스트리밍 TTS API 사용하기
목적에 맞는 기능
자주 묻는 질문

텍스트 음성 변환(TTS) API: 자주 묻는 질문

원하시는 내용을 찾지 못하셨나요? 영업팀에 문의해 주세요.

Rask에 텍스트 음성 변환 API가 있나요?

음성 에이전트나 콜센터에도 사용할 수 있나요?

API에서 스트리밍 오디오 출력을 지원하나요?

스크립트는 어떻게 전송하나요?

어떤 목소리를 사용할 수 있나요?

나만의 맞춤 목소리를 사용할 수 있나요?

어떤 언어가 지원되나요?

SSML 태그나 사용자 지정 발음을 지원하나요?

감정과 표현력을 조절할 수 있나요?

음성을 생성하려면 반드시 동영상이 필요한가요?

요금은 글자 수 기준인가요?

무료 플랜이나 무료 크레딧이 있나요?

API 접근 권한과 API 키는 어떻게 발급받나요?

단 하루 만에 더블링을 시작해 보세요

오늘 첫 요청을 보내보시고, 대량 이용 조건이나 흔하지 않은 언어가 필요할 때 저희에게 문의해 주세요.