오디오 및 동영상 파일을 위한 음성 텍스트 변환 API

녹음된 오디오나 동영상을 업로드하면 자동 언어 감지 기능을 통해 75개 원본 언어로 화자 표시와 각 구간별 타임스탬프가 포함된 대본을 얻을 수 있습니다. 동일한 프로젝트 안에서 자막과 더빙된 오디오를 포함해 135개 이상의 언어 및 지역 옵션으로 번역할 수 있습니다.
화자 분리
75개 원본 언어
REST + Python SDK
upload, transcribe, read
OAuth 2.0
# 1. upload an audio or video file by link
curl -X POST https://api.rask.ai/api/library/v1/media/link \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"link": "https://example.com/interview.mp3", "name": "interview"}'

# 2. create the project - speech recognition starts automatically
#    src_lang is optional: leave it out and the language is detected
curl -X POST https://api.rask.ai/v2/projects \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d "{\"video_id\": \"$MEDIA_ID\", \"dst_lang\": \"es-mx\"}"
GET /v2/projects/{project_id}/transcription
segments
# Read the transcript: one object per segment
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
  | jq '.segments[] | {speaker, start, end, text: .src.text}'
전 세계 팀들이 사용하는
주요 기능

음성 텍스트 변환 API가 제공하는 모든 기능

음성 인식은 모든 Rask 프로젝트의 첫 단계입니다. 대본은 화자 표시와 타임스탬프가 포함된 구간별로 제공되며, 동일한 프로젝트에서 바로 편집, 번역, 자막 생성 및 음성 작업을 할 수 있습니다.

오디오 파일 및 동영상 텍스트 변환

녹음된 오디오나 동영상을 업로드하거나 링크를 게시하면 API가 구간별로 음성을 텍스트로 변환해 줍니다.

화자 분리

서로 다른 화자가 자동으로 감지되며, 각 구간에는 SPEAKER_00과 같은 화자 표시가 지정됩니다. 화자 수를 알고 있다면 미리 지정하거나 나중에 수정할 수 있습니다.

모든 구간에 대한 타임스탬프

각 구간은 시:분:초,밀리초(HH:MM:SS,mmm) 형식의 시작 시간과 종료 시간을 제공하므로 캡션, 검색, 녹음 파일 탐색에 바로 활용할 수 있습니다.

75개 원본 언어

75개 원본 언어에 대한 다국어 지원. 원본 언어 칸을 비워두면 자동으로 감지되며, 두 글자 코드로 직접 설정할 수도 있습니다.

동일 구간 내 번역

각 구간에는 원본 텍스트와 135개 이상의 언어 및 지역 옵션 중 하나로 번역된 텍스트가 함께 포함되어, 대본과 번역본이 줄마다 정확하게 일치합니다.

.srt 및 .vtt 형식의 자막

완료된 모든 프로젝트에는 대본 구간에 맞춰진 타임스탬프가 포함된 대상 언어의 자막 파일이 포함됩니다. 별도의 자막 업체를 찾을 필요가 없습니다.

번역 시 전문 용어 적용

용어집을 사용하면 대본을 번역할 때 또는 의도적으로 원본 언어를 유지할 때 제품명, 고유명사, 도메인별 전문 용어를 일관되게 유지할 수 있습니다.

API를 통한 대본 편집

단어 수정, 타임스탬프 조정, 화자 재지정, 구간 추가 또는 삭제가 가능합니다. 처음부터 다시 시작할 필요 없이 검토자가 최종 대본을 직접 수정할 수 있습니다.

제한 없는 규모 확장

사용량 제한, 동시 처리 할당량, 키별 속도 제한이 없습니다. 전체 오디오 및 동영상 라이브러리에 걸쳐 일괄 텍스트 변환을 병렬로 실행하세요.
작동 모습 보기

하나의 대본이 다섯 가지 언어 버전으로 변환되는 과정을 확인하세요.

동일한 클립이 영어, 프랑스어, 독일어, 포르투갈어, 스페인어로 텍스트 변환, 번역 및 음성 더빙되며, 기존 배경 오디오는 그대로 유지됩니다.
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
작업 흐름

오디오 파일에서 대본 생성까지 세 번의 요청

프로젝트를 생성하면 음성 인식이 시작된 후 번역과 더빙이 한 번에 진행됩니다. 텍스트를 수정한 후 /generate 엔드포인트를 사용하세요.
1

오디오 또는 동영상 업로드

멀티파트 폼 데이터 형식으로 오디오 또는 동영상 파일을 전송하거나, 유튜브, 구글 드라이브, S3, 비메오 또는 기타 직접 링크 주소를 입력하세요. 비용이 청구되기 전에 미디어 ID와 파일 정보를 먼저 확인할 수 있습니다.

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

프로젝트 만들기

미디어 ID를 video_id로 입력하고 목표 언어를 선택하세요. 원본 언어와 화자 수를 알고 있다면 함께 입력할 수 있습니다. 바로 인식이 시작됩니다.

POST /v2/projects
3

텍스트 확인하기

번역된 미디어가 처리되는 동안 텍스트 조각이 준비되는 대로 바로 확인할 수 있습니다. 프로젝트가 완료되면 자막과 미디어 파일을 다운로드하세요.

GET /v2/projects/{id}/transcription
실시간 음성이 아닌, 미리 녹음된 완성된 파일을 대상으로 인식 기능이 실행됩니다. 처리 시간은 파일 길이, 화자 수, 목표 언어에 따라 다릅니다.
사용자 맞춤형 서비스

목록에 없는 언어이나 형식이 필요하신가요? 저희 팀에 문의해 주세요.

목록에 없는 원본 언어, 플랫폼에 필요한 텍스트 형식, 더 빠른 처리 속도, 맞춤형 전달 방식 등 연동에 필요한 요구사항을 저희 팀이 검토하고 적절한 방안을 안내해 드립니다.

언어 및 목소리

공개된 목록에 없는 언어가 필요하신가요? 필요한 조건과 지원 가능한 옵션에 대해 저희 팀에 문의해 주세요.

전송 및 연동

웹훅(Webhook), 자체 대기열로의 전송, S3로의 직접 전달, 맞춤형 엔드포인트 등을 지원합니다. 파이프라인에서 원하는 전달 방식을 알려주세요.

볼륨 및 처리량

일괄 처리 규모, 작업당 목표 언어 수, 처리 우선순위는 고정된 제품 한도가 아니라 계약 조건에 따라 결정됩니다.

보안 및 호스팅

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

동영상용 음성 텍스트 변환 API는 누가 사용하나요?

동영상이 포함된 플랫폼

학습 관리 및 고객 교육 플랫폼, 크리에이터 및 동영상 플랫폼, 웨비나 및 가상 이벤트 도구, 동영상 호스팅 및 워크플로우 SaaS, 디지털 채택 플랫폼, 라이브 커머스 등에서 녹화된 동영상의 텍스트, 자막, 번역본을 제품의 기능으로 추가할 수 있습니다.

현지화 및 제작 대행사

화자 이름이 포함된 텍스트 초안을 검토자에게 전달하고, API를 통해 수정 조각을 반영한 뒤 동일한 프로젝트에서 자막, 번역본, 더빙 버전을 완성하세요.

자체적인 지속적 동영상 제작

글로벌 유통 및 전자상거래, 글로벌 프랜차이즈, 미디어 출판사, 기업 교육 센터 등에서 녹화된 교육 영상, 웨비나, 인터뷰를 텍스트로 변환하고 각 시장에 맞는 자막과 언어 버전을 게시할 수 있습니다.
고객 사례

실제 팀, 가시적인 성과

Rask AI를 통해 기업이 동영상을 현지화한 방식을 수치로 확인해 보세요.
화살표
화살표
코드

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

언어별로 제공되는 완성된 예시: 오디오 또는 동영상 파일 업로드, 프로젝트 생성, 대기 후 화자와 타임스탬프가 포함된 텍스트 조각 확인.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas

async def main():
    client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)

    media = await client.create_media_link(data=schemas.MediaCreateLink(link="https://example.com/interview.mp3"))
    while media.status is enums.MediaStatus.PROCESSING:
        await asyncio.sleep(5)
        media = await client.get_media(media_id=media.id)

    # src_lang omitted: the source language is detected automatically
    job = await client.create_project(data=schemas.ProjectCreate(video_id=media.id, dst_lang="es-mx"))
    while job.status is not enums.ProjectStatus.MERGING_DONE:
        await asyncio.sleep(10)
        job = await client.get_project(project_id=job.id)

    transcript = await client.get_project_transcription(project_id=job.id)
    for seg in transcript.segments:
        print(seg.start, seg.end, seg.speaker, seg.src.text)

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}"}

with open("interview.mp3", "rb") as f:
    media = requests.post(f"{API}/api/library/v1/media", headers=h,
                          params={"kind": "audio"}, files={"data": f}).json()
while media["status"] == "processing":
    time.sleep(5)
    media = requests.get(f"{API}/api/library/v1/media/{media['id']}", headers=h).json()

pid = requests.post(f"{API}/v2/projects", headers=h, json={
    "video_id": media["id"], "dst_lang": "es-mx", "num_speakers": 2}).json()["id"]
while requests.get(f"{API}/v2/projects/{pid}", headers=h).json()["status"] != "merging_done":
    time.sleep(10)

# write the source transcript as an .srt file
segments = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()["segments"]
with open("interview_en.srt", "w") as out:
    for i, s in enumerate(segments, 1):
        out.write(f"{i}\n{s['start']} --> {s['end']}\n{s['speaker']}: {s['src']['text']}\n\n")
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());

let media = await call('POST', '/api/library/v1/media/link', { link: 'https://example.com/webinar.mp4' });
while (media.status === 'processing') { await sleep(5000); media = await call('GET', `/api/library/v1/media/${media.id}`); }

let p = await call('POST', '/v2/projects', { video_id: media.id, src_lang: 'en', dst_lang: 'de-de' });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }

const { segments } = await call('GET', `/v2/projects/${p.id}/transcription`);
segments.forEach((s) => console.log(`[${s.start}] ${s.speaker}: ${s.src.text}`));
console.log(p.translation_vtt_path);   // German subtitles for your player
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. upload a local audio file
MEDIA_ID=$(curl -s -X POST "https://api.rask.ai/api/library/v1/media?kind=audio" \
  -H "Authorization: Bearer $TOKEN" -F "data=@podcast_episode.mp3" | jq -r .id)

# 3. create the project once the media status is ready
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d "{\"video_id\": \"$MEDIA_ID\", \"dst_lang\": \"fr-fr\"}" | jq -r .id)

# 4. when status is merging_done, read the transcript with speaker labels
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
  | jq -r '.segments[] | "\(.start) \(.speaker): \(.src.text)"'
local file upload
audio file, multipart
<?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']];

$media = $json($http->post('/api/library/v1/media/link', ['headers' => $h, 'json' => [
    'link' => 'https://example.com/interview.mp3']]));
while ($media['status'] === 'processing') {
    sleep(5);
    $media = $json($http->get("/api/library/v1/media/{$media['id']}", ['headers' => $h]));
}

$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
    'video_id' => $media['id'], 'dst_lang' => 'es-mx']]));
while ($p['status'] !== 'merging_done') {
    sleep(10);
    $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}

$t = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
foreach ($t['segments'] as $s) {
    echo $s['start'], ' ', $s['speaker'], ': ', $s['src']['text'], PHP_EOL;
}
Guzzle 7
plain HTTP
Python은 공식 SDK입니다. 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 사용자에게 직접 보여주기에 충분히 명확합니다.
Two speakers
GET /v2/projects/{id}/transcription
{"segments": [
  {"speaker": "SPEAKER_00", "start": "00:00:00,320", "end": "00:00:07,316", "status": "done",
   "src": {"text": "Thanks for joining us. Let's start with the new release.", "lang": "en"},
   "dst": {"text": "Gracias por acompañarnos. Empecemos con la nueva versión.", "lang": "es-mx"}},
  {"speaker": "SPEAKER_01", "start": "00:00:07,640", "end": "00:00:11,900", "status": "done",
   "src": {"text": "Sure. The biggest change is the reporting view.", "lang": "en"},
   "dst": {"text": "Claro. El cambio más grande es la vista de reportes.", "lang": "es-mx"}}
]}

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

웹훅 엔드포인트를 지정하면 상태가 바뀔 때마다 POST 요청이 전송되므로, 대기열이 변경 즉시 반응합니다. 웹훅 전송 기능은 엔터프라이즈 플랜에서 제공됩니다.
문서 읽기
preserveAspectRatio="xMidYMid meet" aria-hidden="true" role="img">
결과물

텍스트 조각, 자막, 번역된 미디어

텍스트 변환 엔드포인트에서 JSON 형식으로 텍스트 조각을 확인할 수 있습니다. 완료된 프로젝트에서는 목표 언어로 된 SRT 및 VTT 자막 파일, 번역된 동영상, 그리고 지원되는 요금제의 경우 별도의 WAV 트랙으로 된 번역된 음성을 제공합니다.
필드
형식
설명
segments
JSON
텍스트: 원본 내용, 번역, 화자 이름, 각 조각의 시작 및 종료 시간
voiceover
WAV
배경음 없는 번역된 음성만 제공 (지원되는 요금제 한정)
translated_audio
WAV
번역된 음성과 원래 배경 오디오가 섞인 파일
translation_srt_path
.srt
조각별 시간에 맞춘 목표 언어 자막
translation_vtt_path
.vtt
웹 플레이어용 WebVTT 자막
translated_video
MP4
음성 더빙이 포함된 번역된 동영상
제어

자막을 구간별로 수정하세요

음성 인식을 통해 초안이 완성됩니다. 구간별로 요청을 보내 단어, 시간 또는 화자 이름을 간편하게 수정한 다음 번역본을 다시 생성하세요. 재생성 비용은 변경된 구간을 기준으로 청구되며, 실행당 최소 1분이 적용됩니다.

문장 단위 편집

문장 단위 편집
모든 프로젝트는 자막이 개별 구간으로 나뉘어 제공되므로, 최종 자막 수정은 하나의 패치 요청으로 처리할 수 있습니다.
대본과 문장 가져오기
원본 텍스트를 수정하면 AI가 다시 번역합니다
번역된 텍스트를 직접 수정하여 원하는 표현을 유지하세요
타임스탬프 조정, 문장 추가 및 삭제
화자에게 지정된 목소리 변경하기

전문 용어 사전

전문 용어 사전
자막이 번역될 때 용어집을 사용하면 브랜드 이름, 고유명사, 전문 용어를 모든 버전에서 일관되게 유지하거나 필요에 따라 원래 언어 그대로 둘 수 있습니다.

하나의 용어 사은 하나의 언어 쌍을 다루며 해당 타겟 언어의 모든 지역별 변형에 적용되므로, 하나의 스페인어 사전으로 es-mx 및 es-es 지원합니다. 프로젝트는 glossary_version을 기록하므로, 나중에 수정해도 완료된 작업이 예기치 않게 변경되지 않습니다.
입력

지원하는 파일 형식

팟캐스트, 인터뷰, 녹음된 통화 내용 같은 오디오 파일이나 지원되는 형식의 동영상을 변환하거나 URL을 전송하세요. 지원되지 않는 파일을 업로드하면 분 단위 요금이 부과되기 전에 API가 거부합니다.

동영상

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

오디오

4개 형식
.mp3
.wav
.flac
.m4a

비용 발생 전 상세 정보 확인

미디어 엔드포인트를 통해 재생 시간, 파일 크기, 비디오 코덱, 프레임 레이트, 해상도, 오디오 코덱, 샘플 레이트 및 채널 레이아웃을 확인할 수 있습니다. 프로젝트 비용은 오디오 또는 비디오의 길이를 기준으로 분 단위로 청구되므로, 사전에 파일을 검증하고 비용을 예상해 보세요.
보안 및 규정 준수

오디오 및 음성 데이터를 위한 기업 수준의 보안

Rask Inc는 SOC 2 Type II 인증을 획득하고 GDPR을 준수하며, 트러스트 센터에 실시간 제어 상태를 공개하여 녹음 파일과 자막이 철저히 감시된 보안 환경 속에서 처리되도록 보장합니다.

인증

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와 '음성 텍스트 변환 API + 자체 파이프라인'의 비교

음성 텍스트 변환 API는 오디오를 텍스트로 바꿔줍니다. 하지만 이 텍스트로 자막, 번역, 더빙까지 만들려면 추가적인 작업이 필요합니다. 동일한 결과물을 만드는 두 가지 방법을 비교해 보세요.
필요한 항목
Rask API
개별 부품 조합 방식
화자 이름이 포함된 자막
포함됨
대부분의 음성 텍스트 변환 API에 포함됨
타임스탬프
구간별
많은 음성 텍스트 변환 API에서 단어별 제공
자막 번역
동일 프로젝트, 135개 이상의 언어 및 지역 옵션 지원
별도의 번역 API
.srt 및 .vtt 형식의 자막
대상 언어로 포함됨
자체 타이밍 데이터를 바탕으로 제작
더빙된 오디오 및 비디오
포함됨
TTS 서비스와 자체 믹싱 조합
구간 수정
수정 요청 후 다시 생성
본인의 사본을 편집하고 다시 동기화하세요
이용 제한
없음
제공업체에서 정한 규정
실시간 오디오 실시간 자막 생성
스트리밍 음성 텍스트 변환 API 사용
맞춤 제작됨
가장 저렴한 가격으로 텍스트 변환만 이용하기
전용 STT API가 더 저렴합니다
오디오 1시간당 요금 부과
자주 묻는 질문

STT API: 자주 묻는 질문

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

Rask에 STT API가 있나요?

어떤 언어를 텍스트로 변환할 수 있나요?

동영상 없이 오디오 파일만 텍스트로 바꿀 수 있나요?

화자 분리 기능을 지원하나요?

API에서 단어 단위의 타임스탬프를 제공하나요?

실시간 텍스트 변환을 지원하나요?

텍스트 변환 정확도는 어느 정도인가요?

사용자 정의 단어장이나 전문 용어를 추가할 수 있나요?

SRT 파일로 텍스트를 받을 수 있나요?

기존에 가지고 있던 텍스트를 사용할 수 있나요?

텍스트 변환 요금은 어떻게 청구되나요?

무료 플랜이 있나요?

API 이용 권한과 API 키는 어떻게 발급받나요?

반나절만에 더빙 시작하기

오늘 첫 요청을 보내보세요. 대량 계약 조건이나 다른 곳에 없는 언어가 필요할 때 저희에게 연락해 주세요.