Referensi API
Integrasikan terjemahan dan transkripsi Morlivo ke dalam aplikasi Anda dengan beberapa baris kode.
https://api.morlivo.ai
Autentikasi: Authorization: Bearer mrl_...
Autentikasi
Semua permintaan API memerlukan token Bearer. Dapatkan kunci API Anda dari dasbor di bagian Pengaturan.
Authorization: Bearer mrl_your_api_key_here
Kunci API dimulai dengan mrl_. Jaga kerahasiaannya. Rotasi dari dasbor jika terkompromi.
/v1/translate
Terjemahkan teks dari satu bahasa ke bahasa lain. Bahasa sumber terdeteksi otomatis jika tidak diisi.
Badan permintaan JSON
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
text | string | ya | Teks untuk diterjemahkan |
target_language | string | ya | Kode ISO 639-1 (mis. es, fr, de) |
source_language | string | tidak | Terdeteksi otomatis jika tidak diisi |
project_id | integer | tidak | Terapkan glosarium dan gaya proyek |
formality | string | tidak | Register: formal, informal, or default |
Respons 200
| Field | Tipe | Deskripsi |
|---|---|---|
translated_text | string | Teks terjemahan |
source_language | string | Bahasa sumber yang terdeteksi atau disediakan |
target_language | string | Kode bahasa target |
confidence | float | Skor kualitas 0,0 - 1,0 |
validation | object | Hasil validasi kualitas |
Contoh
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"
}'
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!"
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
}
}
/v1/transcribe
Transkripsikan file audio atau video ke teks. Mendukung hingga 100 MB.
Badan permintaan multipart/form-data
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
file | file | ya | File audio/video (mp3, wav, mp4, webm, dll.) |
language | string | tidak | Kode ISO, terdeteksi otomatis jika tidak diisi |
project_id | integer | tidak | Tautkan ke proyek untuk pelacakan |
response_format | string | tidak | Output format: json, verbose_json, text, srt, vtt |
punctuate | boolean | tidak | Include punctuation (default true) |
Respons 200
| Field | Tipe | Deskripsi |
|---|---|---|
text | string | Teks transkripsi lengkap |
language | string | Bahasa terdeteksi |
duration_seconds | float | Durasi audio |
confidence | float | Skor kualitas 0,0 - 1,0 |
language_confidence | float | Confidence of auto-detected language (null if language was specified) |
segments | array | Segmen bertanda waktu |
validation | object | Pemeriksaan kualitas |
Contoh
curl -X POST https://api.morlivo.ai/api/v1/transcribe \
-H "Authorization: Bearer mrl_your_key" \
-F "file=@meeting.mp3" \
-F "language=en"
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
}
}
/v1/live/transcribe
Streaming audio secara real-time dan terima hasil transkripsi langsung.
Koneksi
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
token | string | ya | Kunci API sebagai parameter kueri |
language | string | tidak | Petunjuk bahasa sumber (mis. en, fr). Terdeteksi otomatis jika dihilangkan. |
Protokol
Frame audio PCM biner (16-bit, 16kHz mono)
Pesan JSON dengan field type: transcript (teks parsial/final), status (peristiwa sesi), error
Pesan diterima
| Field | Tipe | Deskripsi |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | Teks yang ditranskripsikan (pada pesan transkrip) |
is_final | boolean | Bernilai benar saat segmen selesai |
language | string | Kode bahasa yang terdeteksi |
Contoh
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);
}
};
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}
/v1/live/translate
Streaming audio dalam satu bahasa dan terima teks terjemahan dalam bahasa lain secara real-time. Mendukung terjemahan ucapan-ke-teks dengan deteksi bahasa otomatis.
Koneksi
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
token | string | ya | Kunci API sebagai parameter kueri |
target_language | string | ya | Bahasa untuk teks output (mis. en, es, fr) |
source_language | string | tidak | Bahasa audio sumber. Terdeteksi otomatis jika dihilangkan. |
Protokol
Frame audio PCM biner (16-bit, 16kHz mono)
Pesan JSON dengan teks terjemahan dalam target_language. Mencakup transkrip ucapan asli dan output terjemahan.
Pesan diterima
| Field | Tipe | Deskripsi |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | Teks terjemahan dalam bahasa target |
is_final | boolean | Bernilai benar saat segmen selesai |
source_language | string | Bahasa sumber yang terdeteksi |
target_language | string | Kode bahasa target |
Contoh
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);
}
};
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}
/v1/live/rooms
Create a multi-participant translation room. Each participant speaks their own language and receives translated text from other participants.
Badan permintaan JSON
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
languages | object | ya | Participant ID to language mapping |
bridge_language | string | tidak | Hub language, default en |
max_participants | int | tidak | Max participants 2-10, default 10 |
mode | string | tidak | interpreter or inline |
Respons 200
| Field | Tipe | Deskripsi |
|---|---|---|
room_id | string | Unique room identifier |
status | string | Room status |
languages | object | Participant ID to language mapping |
bridge_language | string | Hub language used for translation |
mode | string | Translation mode |
max_participants | int | Maximum number of participants |
Contoh
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
}
/v1/live/speech/{room_id}
Connect a participant to a room for real-time speech translation.
Koneksi
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
room_id | string | ya | Room ID from create room response (path param) |
participant | string | ya | Participant ID (query param) |
token | string | ya | Kunci API sebagai parameter kueri |
Contoh
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);
}
};
/v1/live/rooms/{room_id}/participants
Add a participant to an existing room after creation.
Badan permintaan JSON
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
participant_id | string | ya | Unique participant identifier |
language | string | ya | Participant's language code |
Contoh
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"
}'
/v1/languages
List all supported languages with locale, name, and availability status.
Respons 200
| Field | Tipe | Deskripsi |
|---|---|---|
languages | array | List of supported languages |
languages[].locale | string | Locale code e.g. fr-CA |
languages[].name | string | English name |
languages[].native_name | string | Native name |
languages[].country | string | Country/region |
languages[].status | string | ga or beta |
Contoh
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"}
]
}
/v1/health
Check API status and database health. No authentication required.
Respons 200
| Field | Tipe | Deskripsi |
|---|---|---|
status | string | sehat atau terdegradasi |
Contoh
curl https://api.morlivo.ai/api/v1/health
{
"status": "healthy"
}
Endpoint Kompatibilitas
Sudah menggunakan penyedia lain? Ubah satu URL dan pertahankan kode Anda yang ada. Endpoint ini mencerminkan format permintaan dan respons dari API terjemahan dan transkripsi utama.
DeepL
TerjemahanPOST /api/compat/deepl/v2/translate
Pengganti langsung untuk api-free.deepl.com
Google Cloud Translation
TerjemahanPOST /api/compat/google/v3/projects/{"{p}"}/locations/{"{l}"}:translateText
Pengganti langsung untuk translation.googleapis.com
AWS Translate
TerjemahanPOST /api/compat/aws/translate
Pengganti langsung untuk translate.amazonaws.com
OpenAI Whisper
TranskripsiPOST /api/compat/openai/v1/audio/transcriptions
Pengganti langsung untuk api.openai.com
Deepgram
TranskripsiPOST /api/compat/deepgram/v1/listen
Pengganti langsung untuk api.deepgram.com
Endpoint kompatibilitas menerima format permintaan yang sama dan mengembalikan struktur respons yang sama seperti penyedia asli. Lihat dokumentasi masing-masing penyedia untuk skema permintaan/respons mereka.
Error
Semua error mengembalikan objek JSON dengan field detail.
| Kode | Makna | Kapan hal itu terjadi |
|---|---|---|
| 400 | Permintaan Tidak Valid | Field wajib tidak diisi, teks kosong, tipe file tidak didukung |
| 401 | Tidak Sah | Kunci API hilang atau tidak valid |
| 403 | Terlarang | Kunci API valid tetapi izin tidak mencukupi atau kuota terlampaui |
| 413 | Payload Terlalu Besar | File melebihi batas unggah 100 MB |
| 429 | Batas Laju | Terlalu banyak permintaan. Coba lagi dengan exponential backoff. |
| 500 | Error Internal | Error server tidak terduga. Hubungi dukungan jika masalah berlanjut. |
| 503 | Layanan Tidak Tersedia | Model AI sementara tidak tersedia (circuit breaker terbuka). Coba lagi segera. |
{
"detail": "Field 'text' must not be empty."
}
Redaksi PII
Tambahkan redaksi PII ke permintaan terjemahan atau transkripsi mana pun. Tentukan jenis entitas yang akan dideteksi dan diredaksi.
Badan permintaan JSON
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
text | string | ya | Teks untuk diterjemahkan |
source_language | string | tidak | Terdeteksi otomatis jika tidak diisi |
target_language | string | ya | Kode ISO 639-1 (mis. es, fr, de) |
redact | string[] | tidak | Jenis entitas yang akan diredaksi (mis. email, telepon, nama) |
Respons 200
| Field | Tipe | Deskripsi |
|---|---|---|
translated_text | string | Teks terjemahan dengan PII yang diredaksi |
source_language | string | Bahasa sumber yang terdeteksi atau disediakan |
target_language | string | Kode bahasa target |
confidence | float | Skor kualitas 0,0 - 1,0 |
redactions | array | Daftar redaksi yang diterapkan (jenis dan penggantian) |
Contoh
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"]
}'
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]"
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]"}
]
}
Jenis Entitas yang Didukung
| Entitas | Deskripsi | Deteksi |
|---|---|---|
email |
Alamat email | Berbasis pola (termasuk) |
phone |
Nomor telepon | Berbasis pola (termasuk) |
ssn |
Nomor Jaminan Sosial | Berbasis pola (termasuk) |
credit_card |
Nomor kartu kredit | Berbasis pola (termasuk) |
ip_address |
Alamat IP | Berbasis pola (termasuk) |
name |
Nama orang | Berbasis AI (biaya tambahan) |
address |
Alamat fisik | Berbasis AI (biaya tambahan) |
medical |
Informasi medis | Berbasis AI (biaya tambahan) |
Entitas berbasis format (email, telepon, SSN, kartu kredit, IP) dideteksi menggunakan pencocokan pola tanpa biaya tambahan. Entitas kontekstual (nama, alamat, medis) menggunakan deteksi berbasis AI dan dikenakan biaya tambahan kecil per permintaan.
Siap untuk mengintegrasikan?
Buat akun gratis untuk mendapatkan kunci API Anda dan mulai menerjemahkan.