Справочник API
Интегрируйте перевод и транскрипцию Morlivo в ваше приложение с помощью нескольких строк кода.
https://api.morlivo.ai
Аутентификация: Authorization: Bearer mrl_...
Аутентификация
Все запросы к API требуют токен Bearer. Получите API-ключ в панели управления в разделе «Настройки».
Authorization: Bearer mrl_your_api_key_here
API-ключи начинаются с mrl_. Храните их в секрете. Обновляйте через панель управления в случае компрометации.
/v1/translate
Переведите текст с одного языка на другой. Исходный язык определяется автоматически, если не указан.
Тело запроса JSON
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
text | string | да | Текст для перевода |
target_language | string | да | Код ISO 639-1 (напр. es, fr, de) |
source_language | string | нет | Определяется автоматически, если не указан |
project_id | integer | нет | Применить глоссарий и стиль проекта |
formality | string | нет | Register: formal, informal, or default |
Ответ 200
| Поле | Тип | Описание |
|---|---|---|
translated_text | string | Переведённый текст |
source_language | string | Определённый или указанный исходный язык |
target_language | string | Код целевого языка |
confidence | float | Оценка качества 0.0 – 1.0 |
validation | object | Результаты валидации качества |
Примеры
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
Транскрибируйте аудио- или видеофайл в текст. Поддерживается до 100 МБ.
Тело запроса multipart/form-data
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
file | file | да | Аудио-/видеофайл (mp3, wav, mp4, webm и др.) |
language | string | нет | Код ISO, определяется автоматически, если не указан |
project_id | integer | нет | Привязать к проекту для отслеживания |
response_format | string | нет | Output format: json, verbose_json, text, srt, vtt |
punctuate | boolean | нет | Include punctuation (default true) |
Ответ 200
| Поле | Тип | Описание |
|---|---|---|
text | string | Полный транскрибированный текст |
language | string | Определённый язык |
duration_seconds | float | Длительность аудио |
confidence | float | Оценка качества 0.0 – 1.0 |
language_confidence | float | Confidence of auto-detected language (null if language was specified) |
segments | array | Сегменты с временными метками |
validation | object | Проверки качества |
Примеры
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
Передавайте аудио в реальном времени и получайте результаты транскрибирования в прямом эфире.
Подключение
| Параметр | Тип | Обязательно | Описание |
|---|---|---|---|
token | string | да | API-ключ в качестве параметра запроса |
language | string | нет | Подсказка исходного языка (например, en, fr). Определяется автоматически, если не указан. |
Протокол
Двоичные PCM-аудиофреймы (16 бит, 16 кГц, моно)
Сообщения JSON с полем type: transcript (частичный/окончательный текст), status (события сеанса), error
Получаемые сообщения
| Поле | Тип | Описание |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | Транскрибированный текст (в сообщениях транскрипции) |
is_final | boolean | Истина, когда сегмент завершён |
language | string | Код обнаруженного языка |
Примеры
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
Передавайте аудио на одном языке и получайте переведённый текст на другом языке в реальном времени. Поддерживает перевод речи в текст с автоматическим определением языка.
Подключение
| Параметр | Тип | Обязательно | Описание |
|---|---|---|---|
token | string | да | API-ключ в качестве параметра запроса |
target_language | string | да | Язык выходного текста (например, en, es, fr) |
source_language | string | нет | Язык исходного аудио. Определяется автоматически, если не указан. |
Протокол
Двоичные PCM-аудиофреймы (16 бит, 16 кГц, моно)
Сообщения JSON с переведённым текстом на target_language. Включает как транскрипт оригинальной речи, так и переведённый результат.
Получаемые сообщения
| Поле | Тип | Описание |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | Переведённый текст на целевом языке |
is_final | boolean | Истина, когда сегмент завершён |
source_language | string | Обнаруженный исходный язык |
target_language | string | Код целевого языка |
Примеры
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.
Тело запроса JSON
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
languages | object | да | Participant ID to language mapping |
bridge_language | string | нет | Hub language, default en |
max_participants | int | нет | Max participants 2-10, default 10 |
mode | string | нет | interpreter or inline |
Ответ 200
| Поле | Тип | Описание |
|---|---|---|
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 |
Примеры
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.
Подключение
| Параметр | Тип | Обязательно | Описание |
|---|---|---|---|
room_id | string | да | Room ID from create room response (path param) |
participant | string | да | Participant ID (query param) |
token | string | да | API-ключ в качестве параметра запроса |
Пример
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.
Тело запроса JSON
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
participant_id | string | да | Unique participant identifier |
language | string | да | Participant's language code |
Пример
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.
Ответ 200
| Поле | Тип | Описание |
|---|---|---|
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 |
Пример
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.
Ответ 200
| Поле | Тип | Описание |
|---|---|---|
status | string | исправен или деградирован |
Пример
curl https://api.morlivo.ai/api/v1/health
{
"status": "healthy"
}
Конечные точки совместимости
Уже используете другого провайдера? Измените один URL и сохраните свой существующий код. Эти конечные точки повторяют форматы запросов и ответов основных API перевода и транскрипции.
DeepL
ПереводPOST /api/compat/deepl/v2/translate
Прямая замена для api-free.deepl.com
Google Cloud Translation
ПереводPOST /api/compat/google/v3/projects/{"{p}"}/locations/{"{l}"}:translateText
Прямая замена для translation.googleapis.com
AWS Translate
ПереводPOST /api/compat/aws/translate
Прямая замена для translate.amazonaws.com
OpenAI Whisper
ТранскрипцияPOST /api/compat/openai/v1/audio/transcriptions
Прямая замена для api.openai.com
Deepgram
ТранскрипцияPOST /api/compat/deepgram/v1/listen
Прямая замена для api.deepgram.com
Конечные точки совместимости принимают тот же формат запроса и возвращают ту же структуру ответа, что и оригинальный провайдер. Обращайтесь к документации каждого провайдера за схемами запросов и ответов.
Ошибки
Все ошибки возвращают JSON-объект с полем detail.
| Код | Значение | Когда это происходит |
|---|---|---|
| 400 | Неверный запрос | Отсутствуют обязательные поля, пустой текст, неподдерживаемый тип файла |
| 401 | Не авторизован | Отсутствует или недействителен API-ключ |
| 403 | Запрещено | API-ключ действителен, но недостаточно прав или превышена квота |
| 413 | Слишком большой запрос | Файл превышает ограничение загрузки в 100 МБ |
| 429 | Превышен лимит запросов | Слишком много запросов. Повторите попытку с экспоненциальной задержкой. |
| 500 | Внутренняя ошибка | Непредвиденная ошибка сервера. Обратитесь в службу поддержки, если проблема сохраняется. |
| 503 | Сервис недоступен | Модель ИИ временно недоступна (сработал автоматический выключатель). Повторите попытку позже. |
{
"detail": "Field 'text' must not be empty."
}
Редактирование PII
Добавьте редактирование PII к любому запросу перевода или транскрибирования. Укажите, какие типы сущностей обнаруживать и редактировать.
Тело запроса JSON
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
text | string | да | Текст для перевода |
source_language | string | нет | Определяется автоматически, если не указан |
target_language | string | да | Код ISO 639-1 (напр. es, fr, de) |
redact | string[] | нет | Типы сущностей для редактирования (например, email, phone, name) |
Ответ 200
| Поле | Тип | Описание |
|---|---|---|
translated_text | string | Переведённый текст с редактированной PII |
source_language | string | Определённый или указанный исходный язык |
target_language | string | Код целевого языка |
confidence | float | Оценка качества 0.0 – 1.0 |
redactions | array | Список применённых редактирований (тип и замена) |
Примеры
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]"}
]
}
Поддерживаемые типы сущностей
| Сущность | Описание | Обнаружение |
|---|---|---|
email |
Адреса электронной почты | На основе шаблонов (включено) |
phone |
Номера телефонов | На основе шаблонов (включено) |
ssn |
Номера социального страхования (SSN) | На основе шаблонов (включено) |
credit_card |
Номера кредитных карт | На основе шаблонов (включено) |
ip_address |
IP-адреса | На основе шаблонов (включено) |
name |
Имена людей | На основе AI (дополнительная стоимость) |
address |
Физические адреса | На основе AI (дополнительная стоимость) |
medical |
Медицинская информация | На основе AI (дополнительная стоимость) |
Сущности на основе формата (email, телефон, SSN, кредитная карта, IP) обнаруживаются с помощью сопоставления шаблонов без дополнительной оплаты. Контекстные сущности (имя, адрес, медицинские данные) используют обнаружение на основе AI и подлежат небольшой дополнительной оплате за запрос.
Готовы к интеграции?
Создайте бесплатный аккаунт, чтобы получить API-ключ и начать переводить.