v1.0.0

API 레퍼런스

몇 줄의 코드로 Morlivo 번역 및 음성 변환을 애플리케이션에 통합하세요.

기본 URL: https://api.morlivo.ai 인증: Authorization: Bearer mrl_...

인증

모든 API 요청에는 Bearer 토큰이 필요합니다. 설정의 대시보드에서 API 키를 받으세요.

헤더
Authorization: Bearer mrl_your_api_key_here

API 키는 다음으로 시작합니다 mrl_. 비밀로 유지하세요. 유출된 경우 대시보드에서 갱신하세요.

POST

/v1/translate

텍스트를 한 언어에서 다른 언어로 번역합니다. 원본 언어는 생략 시 자동 감지됩니다.

요청 본문 JSON

필드유형필수설명
textstring번역할 텍스트
target_languagestringISO 639-1 코드 (예: es, fr, de)
source_languagestring아니오생략 시 자동 감지
project_idinteger아니오프로젝트 용어집 및 스타일 적용
formalitystring아니오Register: formal, informal, or default

응답 200

필드유형설명
translated_textstring번역된 텍스트
source_languagestring감지되었거나 제공된 원본 언어
target_languagestring대상 언어 코드
confidencefloat품질 점수 0.0 - 1.0
validationobject품질 검증 결과

예제

curl
curl -X POST https://api.morlivo.ai/api/v1/translate \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Hello, world!",
    "target_language": "es"
  }'
Python
import httpx

resp = httpx.post(
    "https://api.morlivo.ai/api/v1/translate",
    headers={"Authorization": "Bearer mrl_your_key"},
    json={
        "text": "Hello, world!",
        "target_language": "es",
    },
)
data = resp.json()
print(data["translated_text"])
# → "¡Hola, mundo!"
JavaScript
const resp = await fetch(
  "https://api.morlivo.ai/api/v1/translate",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer mrl_your_key",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      text: "Hello, world!",
      target_language: "es",
    }),
  }
);
const data = await resp.json();
console.log(data.translated_text);
// → "¡Hola, mundo!"
응답
{
  "translated_text": "¡Hola, mundo!",
  "source_language": "en",
  "target_language": "es",
  "confidence": 0.98,
  "validation": {
    "length_ratio": 1.08,
    "language_match": true,
    "passed": true
  }
}
POST

/v1/transcribe

오디오 또는 비디오 파일을 텍스트로 변환합니다. 최대 100 MB 지원.

요청 본문 multipart/form-data

필드유형필수설명
filefile오디오/비디오 파일 (mp3, wav, mp4, webm 등)
languagestring아니오ISO 코드, 생략 시 자동 감지
project_idinteger아니오추적을 위해 프로젝트에 연결
response_formatstring아니오Output format: json, verbose_json, text, srt, vtt
punctuateboolean아니오Include punctuation (default true)

응답 200

필드유형설명
textstring전체 변환된 텍스트
languagestring감지된 언어
duration_secondsfloat오디오 길이
confidencefloat품질 점수 0.0 - 1.0
language_confidencefloatConfidence of auto-detected language (null if language was specified)
segmentsarray타임스탬프가 있는 세그먼트
validationobject품질 검사

예제

curl
curl -X POST https://api.morlivo.ai/api/v1/transcribe \
  -H "Authorization: Bearer mrl_your_key" \
  -F "file=@meeting.mp3" \
  -F "language=en"
Python
import httpx

with open("meeting.mp3", "rb") as f:
    resp = httpx.post(
        "https://api.morlivo.ai/api/v1/transcribe",
        headers={"Authorization": "Bearer mrl_your_key"},
        files={"file": ("meeting.mp3", f, "audio/mpeg")},
        data={"language": "en"},
    )
data = resp.json()
print(data["text"])
응답
{
  "text": "Welcome everyone to today's meeting...",
  "language": "en",
  "duration_seconds": 342.5,
  "confidence": 0.95,
  "language_confidence": 0.95,
  "segments": [
    {"start": 0.0, "end": 3.2, "text": "Welcome everyone"},
    {"start": 3.2, "end": 6.8, "text": "to today's meeting."}
  ],
  "validation": {
    "words_per_minute": 148,
    "repetition_detected": false,
    "passed": true
  }
}
WebSocket

/v1/live/transcribe

실시간으로 오디오를 스트리밍하고 실시간 전사 결과를 수신하세요.

연결

매개변수유형필수설명
tokenstring쿼리 매개변수로서의 API 키
languagestring아니오소스 언어 힌트 (예: en, fr). 생략 시 자동 감지됩니다.

프로토콜

전송

바이너리 PCM 오디오 프레임 (16비트, 16kHz 모노)

수신

type 필드가 포함된 JSON 메시지: transcript (부분/최종 텍스트), status (세션 이벤트), error

수신 메시지

필드유형설명
typestring"transcript" | "status" | "error"
textstring전사된 텍스트 (전사 메시지에 표시)
is_finalboolean세그먼트가 완료되면 true
languagestring감지된 언어 코드

예제

JavaScript
const ws = new WebSocket(
  "wss://live.morlivo.ai/v1/live/transcribe?token=mrl_your_key&language=en"
);

navigator.mediaDevices.getUserMedia({ audio: true })
  .then(stream => {
    const ctx = new AudioContext({ sampleRate: 16000 });
    const source = ctx.createMediaStreamSource(stream);
    const processor = ctx.createScriptProcessor(4096, 1, 1);

    source.connect(processor);
    processor.connect(ctx.destination);
    processor.onaudioprocess = (e) => {
      const pcm = e.inputBuffer.getChannelData(0);
      const int16 = new Int16Array(pcm.length);
      for (let i = 0; i < pcm.length; i++)
        int16[i] = Math.max(-1, Math.min(1, pcm[i])) * 0x7FFF;
      ws.send(int16.buffer);
    };
  });

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript") {
    console.log(msg.is_final ? "FINAL:" : "partial:", msg.text);
  }
};
Python
import asyncio, json, websockets

async def live_transcribe():
    uri = "wss://live.morlivo.ai/v1/live/transcribe?token=mrl_your_key"
    async with websockets.connect(uri) as ws:
        # Send audio chunks (PCM 16-bit 16kHz mono)
        with open("audio.pcm", "rb") as f:
            while chunk := f.read(4096):
                await ws.send(chunk)
                msg = json.loads(await ws.recv())
                if msg["type"] == "transcript":
                    print(msg["text"], end="\r" if not msg["is_final"] else "\n")

asyncio.run(live_transcribe())
메시지 예시
// Session started
{"type": "status", "message": "session_started"}

// Partial transcript (still speaking)
{"type": "transcript", "text": "Hello every", "is_final": false}

// Final transcript (segment complete)
{"type": "transcript", "text": "Hello everyone, welcome to the meeting.",
 "is_final": true, "language": "en"}

// Session ended
{"type": "status", "message": "session_ended",
 "duration_seconds": 45.2}
WebSocket

/v1/live/translate

한 언어로 오디오를 스트리밍하고 다른 언어로 번역된 텍스트를 실시간으로 수신하세요. 자동 언어 감지를 통한 음성-텍스트 번역을 지원합니다.

연결

매개변수유형필수설명
tokenstring쿼리 매개변수로서의 API 키
target_languagestring출력 텍스트의 언어 (예: en, es, fr)
source_languagestring아니오소스 오디오 언어. 생략 시 자동 감지됩니다.

프로토콜

전송

바이너리 PCM 오디오 프레임 (16비트, 16kHz 모노)

수신

target_language로 번역된 텍스트가 포함된 JSON 메시지. 원본 음성의 전사본과 번역 출력이 모두 포함됩니다.

수신 메시지

필드유형설명
typestring"transcript" | "status" | "error"
textstring대상 언어로 번역된 텍스트
is_finalboolean세그먼트가 완료되면 true
source_languagestring감지된 소스 언어
target_languagestring대상 언어 코드

예제

JavaScript
const ws = new WebSocket(
  "wss://live.morlivo.ai/v1/live/translate" +
  "?token=mrl_your_key&target_language=es&source_language=en"
);

// Stream microphone audio (same setup as live transcribe)
// ...

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript" && msg.is_final) {
    console.log(`[${msg.source_language} → ${msg.target_language}]`);
    console.log(msg.text);
  }
};
Python
import asyncio, json, websockets

async def live_translate():
    uri = (
        "wss://live.morlivo.ai/v1/live/translate"
        "?token=mrl_your_key"
        "&source_language=fr&target_language=en"
    )
    async with websockets.connect(uri) as ws:
        with open("french_audio.pcm", "rb") as f:
            while chunk := f.read(4096):
                await ws.send(chunk)
                msg = json.loads(await ws.recv())
                if msg["type"] == "transcript" and msg["is_final"]:
                    print(f"Translation: {msg['text']}")

asyncio.run(live_translate())
메시지 예시
// Partial translation
{"type": "transcript", "text": "Hello every",
 "is_final": false, "source_language": "fr", "target_language": "en"}

// Final translated segment
{"type": "transcript",
 "text": "Hello everyone, welcome to the meeting.",
 "is_final": true,
 "source_language": "fr", "target_language": "en"}

// Session summary
{"type": "status", "message": "session_ended",
 "duration_seconds": 120.5}
POST

/v1/live/rooms

Create a multi-participant translation room. Each participant speaks their own language and receives translated text from other participants.

요청 본문 JSON

필드유형필수설명
languagesobjectParticipant ID to language mapping
bridge_languagestring아니오Hub language, default en
max_participantsint아니오Max participants 2-10, default 10
modestring아니오interpreter or inline

응답 200

필드유형설명
room_idstringUnique room identifier
statusstringRoom status
languagesobjectParticipant ID to language mapping
bridge_languagestringHub language used for translation
modestringTranslation mode
max_participantsintMaximum number of participants

예제

curl
curl -X POST https://api.morlivo.ai/api/v1/live/rooms \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "languages": {"alice": "en", "bob": "fr", "carlos": "es"},
    "bridge_language": "en",
    "mode": "interpreter"
  }'
응답
{
  "room_id": "room_abc123",
  "status": "active",
  "languages": {"alice": "en", "bob": "fr", "carlos": "es"},
  "bridge_language": "en",
  "mode": "interpreter",
  "max_participants": 10
}
WebSocket

/v1/live/speech/{room_id}

Connect a participant to a room for real-time speech translation.

연결

매개변수유형필수설명
room_idstringRoom ID from create room response (path param)
participantstringParticipant ID (query param)
tokenstring쿼리 매개변수로서의 API 키

예제

JavaScript
const ws = new WebSocket(
  "wss://live.morlivo.ai/v1/live/speech/room_abc123" +
  "?token=mrl_your_key&participant=alice"
);

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript" && msg.is_final) {
    console.log(`[${msg.source_language} → ${msg.target_language}]`);
    console.log(msg.text);
  }
};
POST

/v1/live/rooms/{room_id}/participants

Add a participant to an existing room after creation.

요청 본문 JSON

필드유형필수설명
participant_idstringUnique participant identifier
languagestringParticipant's language code

예제

curl
curl -X POST https://api.morlivo.ai/api/v1/live/rooms/room_abc123/participants \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "participant_id": "diana",
    "language": "de"
  }'
GET

/v1/languages

List all supported languages with locale, name, and availability status.

응답 200

필드유형설명
languagesarrayList of supported languages
languages[].localestringLocale code e.g. fr-CA
languages[].namestringEnglish name
languages[].native_namestringNative name
languages[].countrystringCountry/region
languages[].statusstringga or beta

예제

curl
curl https://api.morlivo.ai/api/v1/languages \
  -H "Authorization: Bearer mrl_your_key"
응답
{
  "languages": [
    {"locale": "en-US", "name": "English", "native_name": "English", "country": "United States", "status": "ga"},
    {"locale": "fr-CA", "name": "French", "native_name": "Français", "country": "Canada", "status": "ga"},
    {"locale": "sw-KE", "name": "Swahili", "native_name": "Kiswahili", "country": "Kenya", "status": "beta"}
  ]
}
GET

/v1/health

Check API status and database health. No authentication required.

응답 200

필드유형설명
statusstring정상 또는 저하

예제

curl
curl https://api.morlivo.ai/api/v1/health
응답
{
  "status": "healthy"
}

호환 엔드포인트

이미 다른 제공업체를 사용 중이신가요? URL 하나만 변경하고 기존 코드를 유지하세요. 이 엔드포인트는 주요 번역 및 음성 변환 API의 요청 및 응답 형식을 미러링합니다.

DL

DeepL

번역
POST /api/compat/deepl/v2/translate

드롭인 대체 api-free.deepl.com

G

Google Cloud Translation

번역
POST /api/compat/google/v3/projects/{"{p}"}/locations/{"{l}"}:translateText

드롭인 대체 translation.googleapis.com

A

AWS Translate

번역
POST /api/compat/aws/translate

드롭인 대체 translate.amazonaws.com

OA

OpenAI Whisper

전사
POST /api/compat/openai/v1/audio/transcriptions

드롭인 대체 api.openai.com

DG

Deepgram

전사
POST /api/compat/deepgram/v1/listen

드롭인 대체 api.deepgram.com

호환 엔드포인트는 원래 제공업체와 동일한 요청 형식을 수용하고 동일한 응답 구조를 반환합니다. 각 제공업체의 요청/응답 스키마는 해당 제공업체의 문서를 참조하세요.

오류

모든 오류는 detail 필드가 포함된 JSON 객체를 반환합니다.

코드의미발생 시점
400 잘못된 요청 필수 필드 누락, 빈 텍스트, 지원되지 않는 파일 유형
401 인증되지 않음 API 키가 없거나 유효하지 않음
403 금지됨 API 키는 유효하지만 권한이 부족하거나 할당량이 초과됨
413 페이로드가 너무 큼 파일이 100 MB 업로드 제한을 초과합니다
429 속도 제한됨 요청이 너무 많습니다. 지수 백오프로 재시도해 주세요.
500 내부 오류 예상치 못한 서버 오류입니다. 지속되면 지원팀에 문의하세요.
503 서비스 이용 불가 AI 모델을 일시적으로 사용할 수 없습니다 (서킷 브레이커 작동). 잠시 후 다시 시도해 주세요.
오류 응답 형식
{
  "detail": "Field 'text' must not be empty."
}
POST

PII 삭제

번역 또는 전사 요청에 PII 삭제를 추가하세요. 감지 및 삭제할 엔티티 유형을 지정하세요.

POST /v1/translate POST /v1/transcribe

요청 본문 JSON

필드유형필수설명
textstring번역할 텍스트
source_languagestring아니오생략 시 자동 감지
target_languagestringISO 639-1 코드 (예: es, fr, de)
redactstring[]아니오삭제할 엔티티 유형 (예: email, phone, name)

응답 200

필드유형설명
translated_textstringPII가 삭제된 번역 텍스트
source_languagestring감지되었거나 제공된 원본 언어
target_languagestring대상 언어 코드
confidencefloat품질 점수 0.0 - 1.0
redactionsarray적용된 삭제 목록 (유형 및 대체값)

예제

curl
curl -X POST https://api.morlivo.ai/api/v1/translate \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Contact John Smith at john@example.com or 555-123-4567",
    "source_language": "en",
    "target_language": "fr",
    "redact": ["email", "phone", "name"]
  }'
Python
import httpx

resp = httpx.post(
    "https://api.morlivo.ai/api/v1/translate",
    headers={"Authorization": "Bearer mrl_your_key"},
    json={
        "text": "Contact John Smith at john@example.com or 555-123-4567",
        "source_language": "en",
        "target_language": "fr",
        "redact": ["email", "phone", "name"],
    },
)
data = resp.json()
print(data["translated_text"])
# → "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]"
JavaScript
const resp = await fetch(
  "https://api.morlivo.ai/api/v1/translate",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer mrl_your_key",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      text: "Contact John Smith at john@example.com or 555-123-4567",
      source_language: "en",
      target_language: "fr",
      redact: ["email", "phone", "name"],
    }),
  }
);
const data = await resp.json();
console.log(data.translated_text);
// → "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]"
응답
{
  "translated_text": "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]",
  "source_language": "en",
  "target_language": "fr",
  "confidence": 0.95,
  "redactions": [
    {"type": "name", "replacement": "[NAME_REDACTED]"},
    {"type": "email", "replacement": "[EMAIL_REDACTED]"},
    {"type": "phone", "replacement": "[PHONE_REDACTED]"}
  ]
}

지원되는 엔티티 유형

엔티티설명감지
email 이메일 주소 패턴 기반 (포함)
phone 전화번호 패턴 기반 (포함)
ssn 사회보장번호 패턴 기반 (포함)
credit_card 신용카드 번호 패턴 기반 (포함)
ip_address IP 주소 패턴 기반 (포함)
name 사람 이름 AI 기반 (추가 비용)
address 실제 주소 AI 기반 (추가 비용)
medical 의료 정보 AI 기반 (추가 비용)

형식 기반 엔티티(email, phone, SSN, 신용카드, IP)는 추가 비용 없이 패턴 매칭을 사용하여 감지됩니다. 문맥 기반 엔티티(이름, 주소, 의료)는 AI 기반 감지를 사용하며 요청당 소액의 추가 요금이 부과됩니다.

통합할 준비가 되셨나요?

무료 계정을 만들어 API 키를 받고 번역을 시작하세요.